1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef NET_DNS_DNS_PROTOCOL_H_ 6#define NET_DNS_DNS_PROTOCOL_H_ 7 8#include "base/basictypes.h" 9#include "net/base/net_export.h" 10 11namespace net { 12 13namespace dns_protocol { 14 15static const uint16 kDefaultPort = 53; 16static const uint16 kDefaultPortMulticast = 5353; 17 18// DNS packet consists of a header followed by questions and/or answers. 19// For the meaning of specific fields, please see RFC 1035 and 2535 20 21// Header format. 22// 1 1 1 1 1 1 23// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 24// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 25// | ID | 26// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 27// |QR| Opcode |AA|TC|RD|RA| Z|AD|CD| RCODE | 28// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 29// | QDCOUNT | 30// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 31// | ANCOUNT | 32// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 33// | NSCOUNT | 34// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 35// | ARCOUNT | 36// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 37 38// Question format. 39// 1 1 1 1 1 1 40// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 41// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 42// | | 43// / QNAME / 44// / / 45// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 46// | QTYPE | 47// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 48// | QCLASS | 49// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 50 51// Answer format. 52// 1 1 1 1 1 1 53// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 54// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 55// | | 56// / / 57// / NAME / 58// | | 59// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 60// | TYPE | 61// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 62// | CLASS | 63// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 64// | TTL | 65// | | 66// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 67// | RDLENGTH | 68// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| 69// / RDATA / 70// / / 71// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 72 73#pragma pack(push) 74#pragma pack(1) 75 76// On-the-wire header. All uint16 are in network order. 77// Used internally in DnsQuery and DnsResponseParser. 78struct NET_EXPORT_PRIVATE Header { 79 uint16 id; 80 uint16 flags; 81 uint16 qdcount; 82 uint16 ancount; 83 uint16 nscount; 84 uint16 arcount; 85}; 86 87#pragma pack(pop) 88 89static const uint8 kLabelMask = 0xc0; 90static const uint8 kLabelPointer = 0xc0; 91static const uint8 kLabelDirect = 0x0; 92static const uint16 kOffsetMask = 0x3fff; 93 94// In MDns the most significant bit of the rrclass is designated as the 95// "cache-flush bit", as described in http://www.rfc-editor.org/rfc/rfc6762.txt 96// section 10.2. 97static const uint16 kMDnsClassMask = 0x7FFF; 98 99static const int kMaxNameLength = 255; 100 101// RFC 1035, section 4.2.1: Messages carried by UDP are restricted to 512 102// bytes (not counting the IP nor UDP headers). 103static const int kMaxUDPSize = 512; 104 105// RFC 6762, section 17: Messages over the local link are restricted by the 106// medium's MTU, and must be under 9000 bytes 107static const int kMaxMulticastSize = 9000; 108 109// DNS class types. 110static const uint16 kClassIN = 1; 111 112// DNS resource record types. See 113// http://www.iana.org/assignments/dns-parameters 114static const uint16 kTypeA = 1; 115static const uint16 kTypeCNAME = 5; 116static const uint16 kTypePTR = 12; 117static const uint16 kTypeTXT = 16; 118static const uint16 kTypeAAAA = 28; 119static const uint16 kTypeSRV = 33; 120static const uint16 kTypeNSEC = 47; 121 122 123// DNS rcode values. 124static const uint8 kRcodeMask = 0xf; 125static const uint8 kRcodeNOERROR = 0; 126static const uint8 kRcodeFORMERR = 1; 127static const uint8 kRcodeSERVFAIL = 2; 128static const uint8 kRcodeNXDOMAIN = 3; 129static const uint8 kRcodeNOTIMP = 4; 130static const uint8 kRcodeREFUSED = 5; 131 132// DNS flags. 133static const uint16 kFlagResponse = 0x8000; 134static const uint16 kFlagRA = 0x80; 135static const uint16 kFlagRD = 0x100; 136static const uint16 kFlagTC = 0x200; 137static const uint16 kFlagAA = 0x400; 138 139} // namespace dns_protocol 140 141} // namespace net 142 143#endif // NET_DNS_DNS_PROTOCOL_H_ 144