1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_DNS_PUBLIC_DNS_PROTOCOL_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_PUBLIC_DNS_PROTOCOL_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker namespace net { 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker // General constants and structs defined by the DNS and MDNS protocols. 15*6777b538SAndroid Build Coastguard Worker // 16*6777b538SAndroid Build Coastguard Worker // Direct interaction with DNS and MDNS, as well as parsing DNS and MDNS 17*6777b538SAndroid Build Coastguard Worker // messages, should generally only be done within network stack code. 18*6777b538SAndroid Build Coastguard Worker // Network-stack-external code should interact indirectly through network 19*6777b538SAndroid Build Coastguard Worker // service APIs, e.g. NetworkContext::ResolveHost(). But these constants may 20*6777b538SAndroid Build Coastguard Worker // still be useful for other minor purposes. 21*6777b538SAndroid Build Coastguard Worker namespace dns_protocol { 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker static const uint16_t kDefaultPort = 53; 24*6777b538SAndroid Build Coastguard Worker // RFC 5353. 25*6777b538SAndroid Build Coastguard Worker static const uint16_t kDefaultPortMulticast = 5353; 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker // https://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml#multicast-addresses-1 28*6777b538SAndroid Build Coastguard Worker static const char kMdnsMulticastGroupIPv4[] = "224.0.0.251"; 29*6777b538SAndroid Build Coastguard Worker // https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml#link-local 30*6777b538SAndroid Build Coastguard Worker static const char kMdnsMulticastGroupIPv6[] = "FF02::FB"; 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker // DNS packet consists of a header followed by questions and/or answers. 33*6777b538SAndroid Build Coastguard Worker // For the meaning of specific fields, please see RFC 1035 and 2535 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // Header format. 36*6777b538SAndroid Build Coastguard Worker // 1 1 1 1 1 1 37*6777b538SAndroid Build Coastguard Worker // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 38*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 39*6777b538SAndroid Build Coastguard Worker // | ID | 40*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 41*6777b538SAndroid Build Coastguard Worker // |QR| Opcode |AA|TC|RD|RA| Z|AD|CD| RCODE | 42*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 43*6777b538SAndroid Build Coastguard Worker // | QDCOUNT | 44*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 45*6777b538SAndroid Build Coastguard Worker // | ANCOUNT | 46*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 47*6777b538SAndroid Build Coastguard Worker // | NSCOUNT | 48*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 49*6777b538SAndroid Build Coastguard Worker // | ARCOUNT | 50*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker // Question format. 53*6777b538SAndroid Build Coastguard Worker // 1 1 1 1 1 1 54*6777b538SAndroid Build Coastguard Worker // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 55*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 56*6777b538SAndroid Build Coastguard Worker // | | 57*6777b538SAndroid Build Coastguard Worker // / QNAME / 58*6777b538SAndroid Build Coastguard Worker // / / 59*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 60*6777b538SAndroid Build Coastguard Worker // | QTYPE | 61*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 62*6777b538SAndroid Build Coastguard Worker // | QCLASS | 63*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker // Answer format. 66*6777b538SAndroid Build Coastguard Worker // 1 1 1 1 1 1 67*6777b538SAndroid Build Coastguard Worker // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 68*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 69*6777b538SAndroid Build Coastguard Worker // | | 70*6777b538SAndroid Build Coastguard Worker // / / 71*6777b538SAndroid Build Coastguard Worker // / NAME / 72*6777b538SAndroid Build Coastguard Worker // | | 73*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 74*6777b538SAndroid Build Coastguard Worker // | TYPE | 75*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 76*6777b538SAndroid Build Coastguard Worker // | CLASS | 77*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 78*6777b538SAndroid Build Coastguard Worker // | TTL | 79*6777b538SAndroid Build Coastguard Worker // | | 80*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 81*6777b538SAndroid Build Coastguard Worker // | RDLENGTH | 82*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| 83*6777b538SAndroid Build Coastguard Worker // / RDATA / 84*6777b538SAndroid Build Coastguard Worker // / / 85*6777b538SAndroid Build Coastguard Worker // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker #pragma pack(push) 88*6777b538SAndroid Build Coastguard Worker #pragma pack(1) 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker // On-the-wire header. All uint16_t are in network order. 91*6777b538SAndroid Build Coastguard Worker struct NET_EXPORT Header { 92*6777b538SAndroid Build Coastguard Worker uint16_t id = 0; 93*6777b538SAndroid Build Coastguard Worker uint16_t flags = 0; 94*6777b538SAndroid Build Coastguard Worker uint16_t qdcount = 0; 95*6777b538SAndroid Build Coastguard Worker uint16_t ancount = 0; 96*6777b538SAndroid Build Coastguard Worker uint16_t nscount = 0; 97*6777b538SAndroid Build Coastguard Worker uint16_t arcount = 0; 98*6777b538SAndroid Build Coastguard Worker }; 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Worker #pragma pack(pop) 101*6777b538SAndroid Build Coastguard Worker 102*6777b538SAndroid Build Coastguard Worker static const uint8_t kLabelMask = 0xc0; 103*6777b538SAndroid Build Coastguard Worker static const uint8_t kLabelPointer = 0xc0; 104*6777b538SAndroid Build Coastguard Worker static const uint8_t kLabelDirect = 0x0; 105*6777b538SAndroid Build Coastguard Worker static const uint16_t kOffsetMask = 0x3fff; 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker // In MDns the most significant bit of the rrclass is designated as the 108*6777b538SAndroid Build Coastguard Worker // "cache-flush bit", as described in http://www.rfc-editor.org/rfc/rfc6762.txt 109*6777b538SAndroid Build Coastguard Worker // section 10.2. 110*6777b538SAndroid Build Coastguard Worker static const uint16_t kMDnsClassMask = 0x7FFF; 111*6777b538SAndroid Build Coastguard Worker 112*6777b538SAndroid Build Coastguard Worker // RFC 1035, section 3.1: To simplify implementations, the total length of 113*6777b538SAndroid Build Coastguard Worker // a domain name in wire form (i.e., label octets and label length octets) is 114*6777b538SAndroid Build Coastguard Worker // restricted to 255 octets or less. 115*6777b538SAndroid Build Coastguard Worker // 116*6777b538SAndroid Build Coastguard Worker // Note that RFC 1035 is ambiguous over whether or not this limit includes the 117*6777b538SAndroid Build Coastguard Worker // final zero-length terminating label, but RFC 6762 unambiguously uses the 118*6777b538SAndroid Build Coastguard Worker // more permissive interpretation of not including the terminating label against 119*6777b538SAndroid Build Coastguard Worker // the limit for mDNS and argues in RFC 6762 Appendix C that that is the correct 120*6777b538SAndroid Build Coastguard Worker // interpretation for unicast DNS. To avoid overcomplicating logic, Chrome 121*6777b538SAndroid Build Coastguard Worker // universally uses the more permissive RFC 6762 interpretation for all parsing. 122*6777b538SAndroid Build Coastguard Worker static const int kMaxNameLength = 255; 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker // The maximum number of ASCII characters allowed in a domain in dotted form, 125*6777b538SAndroid Build Coastguard Worker // derived from `kMaxNameLength` above by subtracting one from the count to 126*6777b538SAndroid Build Coastguard Worker // correspond to the first byte, which is not available to encode characters and 127*6777b538SAndroid Build Coastguard Worker // does not correspond to a dot after conversion. 128*6777b538SAndroid Build Coastguard Worker static const uint16_t kMaxCharNameLength = 254; 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker // RFC 1035, section 2.3.4: labels 63 octets or less. 131*6777b538SAndroid Build Coastguard Worker // Section 3.1: Each label is represented as a one octet length field followed 132*6777b538SAndroid Build Coastguard Worker // by that number of octets. 133*6777b538SAndroid Build Coastguard Worker const int kMaxLabelLength = 63; 134*6777b538SAndroid Build Coastguard Worker 135*6777b538SAndroid Build Coastguard Worker // RFC 1035, section 4.2.1: Messages carried by UDP are restricted to 512 136*6777b538SAndroid Build Coastguard Worker // bytes (not counting the IP nor UDP headers). 137*6777b538SAndroid Build Coastguard Worker static const int kMaxUDPSize = 512; 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker // RFC 6762, section 17: Messages over the local link are restricted by the 140*6777b538SAndroid Build Coastguard Worker // medium's MTU, and must be under 9000 bytes 141*6777b538SAndroid Build Coastguard Worker static const int kMaxMulticastSize = 9000; 142*6777b538SAndroid Build Coastguard Worker 143*6777b538SAndroid Build Coastguard Worker // RFC 1035, Section 4.1.3. 144*6777b538SAndroid Build Coastguard Worker // TYPE (2 bytes) + CLASS (2 bytes) + TTL (4 bytes) + RDLENGTH (2 bytes) 145*6777b538SAndroid Build Coastguard Worker static const int kResourceRecordSizeInBytesWithoutNameAndRData = 10; 146*6777b538SAndroid Build Coastguard Worker 147*6777b538SAndroid Build Coastguard Worker // DNS class types. 148*6777b538SAndroid Build Coastguard Worker // 149*6777b538SAndroid Build Coastguard Worker // https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-2 150*6777b538SAndroid Build Coastguard Worker static const uint16_t kClassIN = 1; 151*6777b538SAndroid Build Coastguard Worker // RFC 6762, Section 10.2. 152*6777b538SAndroid Build Coastguard Worker // 153*6777b538SAndroid Build Coastguard Worker // For resource records sent through mDNS, the top bit of the class field in a 154*6777b538SAndroid Build Coastguard Worker // resource record is repurposed to the cache-flush bit. This bit should only be 155*6777b538SAndroid Build Coastguard Worker // used in mDNS transactions. 156*6777b538SAndroid Build Coastguard Worker static const uint16_t kFlagCacheFlush = 0x8000; 157*6777b538SAndroid Build Coastguard Worker 158*6777b538SAndroid Build Coastguard Worker // DNS resource record types. 159*6777b538SAndroid Build Coastguard Worker // 160*6777b538SAndroid Build Coastguard Worker // https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4 161*6777b538SAndroid Build Coastguard Worker static const uint16_t kTypeA = 1; 162*6777b538SAndroid Build Coastguard Worker static const uint16_t kTypeCNAME = 5; 163*6777b538SAndroid Build Coastguard Worker static const uint16_t kTypeSOA = 6; 164*6777b538SAndroid Build Coastguard Worker static const uint16_t kTypePTR = 12; 165*6777b538SAndroid Build Coastguard Worker static const uint16_t kTypeTXT = 16; 166*6777b538SAndroid Build Coastguard Worker static const uint16_t kTypeAAAA = 28; 167*6777b538SAndroid Build Coastguard Worker static const uint16_t kTypeSRV = 33; 168*6777b538SAndroid Build Coastguard Worker static const uint16_t kTypeOPT = 41; 169*6777b538SAndroid Build Coastguard Worker static const uint16_t kTypeNSEC = 47; 170*6777b538SAndroid Build Coastguard Worker static const uint16_t kTypeHttps = 65; 171*6777b538SAndroid Build Coastguard Worker static const uint16_t kTypeANY = 255; 172*6777b538SAndroid Build Coastguard Worker 173*6777b538SAndroid Build Coastguard Worker // DNS reply codes (RCODEs). 174*6777b538SAndroid Build Coastguard Worker // 175*6777b538SAndroid Build Coastguard Worker // https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6 176*6777b538SAndroid Build Coastguard Worker static const uint8_t kRcodeNOERROR = 0; 177*6777b538SAndroid Build Coastguard Worker static const uint8_t kRcodeFORMERR = 1; 178*6777b538SAndroid Build Coastguard Worker static const uint8_t kRcodeSERVFAIL = 2; 179*6777b538SAndroid Build Coastguard Worker static const uint8_t kRcodeNXDOMAIN = 3; 180*6777b538SAndroid Build Coastguard Worker static const uint8_t kRcodeNOTIMP = 4; 181*6777b538SAndroid Build Coastguard Worker static const uint8_t kRcodeREFUSED = 5; 182*6777b538SAndroid Build Coastguard Worker 183*6777b538SAndroid Build Coastguard Worker // DNS EDNS(0) option codes (OPT) 184*6777b538SAndroid Build Coastguard Worker // 185*6777b538SAndroid Build Coastguard Worker // https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-11 186*6777b538SAndroid Build Coastguard Worker static constexpr uint16_t kEdnsPadding = 12; 187*6777b538SAndroid Build Coastguard Worker static constexpr uint16_t kEdnsExtendedDnsError = 15; 188*6777b538SAndroid Build Coastguard Worker 189*6777b538SAndroid Build Coastguard Worker // DNS header flags. 190*6777b538SAndroid Build Coastguard Worker // 191*6777b538SAndroid Build Coastguard Worker // https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-12 192*6777b538SAndroid Build Coastguard Worker static const uint16_t kFlagResponse = 0x8000; 193*6777b538SAndroid Build Coastguard Worker static const uint16_t kFlagAA = 0x400; // Authoritative Answer - response flag. 194*6777b538SAndroid Build Coastguard Worker static const uint16_t kFlagRD = 0x100; // Recursion Desired - query flag. 195*6777b538SAndroid Build Coastguard Worker static const uint16_t kFlagTC = 0x200; // Truncated - server flag. 196*6777b538SAndroid Build Coastguard Worker 197*6777b538SAndroid Build Coastguard Worker // SVCB/HTTPS ServiceParamKey 198*6777b538SAndroid Build Coastguard Worker // 199*6777b538SAndroid Build Coastguard Worker // IANA registration pending. Values from draft-ietf-dnsop-svcb-https-08. 200*6777b538SAndroid Build Coastguard Worker static constexpr uint16_t kHttpsServiceParamKeyMandatory = 0; 201*6777b538SAndroid Build Coastguard Worker static constexpr uint16_t kHttpsServiceParamKeyAlpn = 1; 202*6777b538SAndroid Build Coastguard Worker static constexpr uint16_t kHttpsServiceParamKeyNoDefaultAlpn = 2; 203*6777b538SAndroid Build Coastguard Worker static constexpr uint16_t kHttpsServiceParamKeyPort = 3; 204*6777b538SAndroid Build Coastguard Worker static constexpr uint16_t kHttpsServiceParamKeyIpv4Hint = 4; 205*6777b538SAndroid Build Coastguard Worker static constexpr uint16_t kHttpsServiceParamKeyEchConfig = 5; 206*6777b538SAndroid Build Coastguard Worker static constexpr uint16_t kHttpsServiceParamKeyIpv6Hint = 6; 207*6777b538SAndroid Build Coastguard Worker 208*6777b538SAndroid Build Coastguard Worker // draft-ietf-dnsop-svcb-https-08#section-9 209*6777b538SAndroid Build Coastguard Worker inline constexpr char kHttpsServiceDefaultAlpn[] = "http/1.1"; 210*6777b538SAndroid Build Coastguard Worker 211*6777b538SAndroid Build Coastguard Worker } // namespace dns_protocol 212*6777b538SAndroid Build Coastguard Worker 213*6777b538SAndroid Build Coastguard Worker } // namespace net 214*6777b538SAndroid Build Coastguard Worker 215*6777b538SAndroid Build Coastguard Worker #endif // NET_DNS_PUBLIC_DNS_PROTOCOL_H_ 216