15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_DNS_DNS_PROTOCOL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_DNS_DNS_PROTOCOL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace dns_protocol {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kDefaultPort = 53;
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static const uint16 kDefaultPortMulticast = 5353;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DNS packet consists of a header followed by questions and/or answers.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For the meaning of specific fields, please see RFC 1035 and 2535
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Header format.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                  1  1  1  1  1  1
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                      ID                       |
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |QR|   Opcode  |AA|TC|RD|RA| Z|AD|CD|   RCODE   |
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                    QDCOUNT                    |
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                    ANCOUNT                    |
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                    NSCOUNT                    |
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                    ARCOUNT                    |
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Question format.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                  1  1  1  1  1  1
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                                               |
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  /                     QNAME                     /
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  /                                               /
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                     QTYPE                     |
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                     QCLASS                    |
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Answer format.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                  1  1  1  1  1  1
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                                               |
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  /                                               /
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  /                      NAME                     /
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                                               |
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                      TYPE                     |
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                     CLASS                     |
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                      TTL                      |
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                                               |
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  |                   RDLENGTH                    |
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  /                     RDATA                     /
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  /                                               /
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack(push)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack(1)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On-the-wire header. All uint16 are in network order.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used internally in DnsQuery and DnsResponseParser.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE Header {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 id;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 flags;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 qdcount;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 ancount;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 nscount;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 arcount;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack(pop)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kLabelMask = 0xc0;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kLabelPointer = 0xc0;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kLabelDirect = 0x0;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kOffsetMask = 0x3fff;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// In MDns the most significant bit of the rrclass is designated as the
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// "cache-flush bit", as described in http://www.rfc-editor.org/rfc/rfc6762.txt
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// section 10.2.
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)static const uint16 kMDnsClassMask = 0x7FFF;
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kMaxNameLength = 255;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RFC 1035, section 4.2.1: Messages carried by UDP are restricted to 512
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bytes (not counting the IP nor UDP headers).
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kMaxUDPSize = 512;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// RFC 6762, section 17: Messages over the local link are restricted by the
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// medium's MTU, and must be under 9000 bytes
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static const int kMaxMulticastSize = 9000;
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DNS class types.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kClassIN = 1;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DNS resource record types. See
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://www.iana.org/assignments/dns-parameters
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kTypeA = 1;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kTypeCNAME = 5;
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const uint16 kTypePTR = 12;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kTypeTXT = 16;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kTypeAAAA = 28;
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const uint16 kTypeSRV = 33;
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic const uint16 kTypeNSEC = 47;
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DNS rcode values.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kRcodeMask = 0xf;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kRcodeNOERROR = 0;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kRcodeFORMERR = 1;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kRcodeSERVFAIL = 2;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kRcodeNXDOMAIN = 3;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kRcodeNOTIMP = 4;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kRcodeREFUSED = 5;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DNS flags.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kFlagResponse = 0x8000;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kFlagRA = 0x80;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kFlagRD = 0x100;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kFlagTC = 0x200;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16 kFlagAA = 0x400;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace dns_protocol
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_DNS_DNS_PROTOCOL_H_
144