162ac0c33Sjakob /* 262ac0c33Sjakob * dns.h -- DNS definitions. 362ac0c33Sjakob * 4dd5b221eSsthen * Copyright (c) 2001-2006, NLnet Labs. All rights reserved. 562ac0c33Sjakob * 662ac0c33Sjakob * See LICENSE for the license. 762ac0c33Sjakob * 862ac0c33Sjakob */ 962ac0c33Sjakob 10*3efee2e1Sflorian #ifndef DNS_H 11*3efee2e1Sflorian #define DNS_H 1262ac0c33Sjakob 1362ac0c33Sjakob enum rr_section { 1462ac0c33Sjakob QUESTION_SECTION, 1562ac0c33Sjakob ANSWER_SECTION, 1662ac0c33Sjakob AUTHORITY_SECTION, 175bcb494bSjakob /* 185bcb494bSjakob * Use a split authority section to ensure that optional 195bcb494bSjakob * NS RRsets in the response can be omitted. 205bcb494bSjakob */ 215bcb494bSjakob OPTIONAL_AUTHORITY_SECTION, 2262ac0c33Sjakob ADDITIONAL_SECTION, 2362ac0c33Sjakob /* 2462ac0c33Sjakob * Use a split additional section to ensure A records appear 2562ac0c33Sjakob * before any AAAA records (this is recommended practice to 2662ac0c33Sjakob * avoid truncating the additional section for IPv4 clients 2762ac0c33Sjakob * that do not specify EDNS0), and AAAA records before other 2862ac0c33Sjakob * types of additional records (such as X25 and ISDN). 2962ac0c33Sjakob * Encode_answer sets the ARCOUNT field of the response packet 3062ac0c33Sjakob * correctly. 3162ac0c33Sjakob */ 3262ac0c33Sjakob ADDITIONAL_A_SECTION = ADDITIONAL_SECTION, 3362ac0c33Sjakob ADDITIONAL_AAAA_SECTION, 3462ac0c33Sjakob ADDITIONAL_OTHER_SECTION, 3562ac0c33Sjakob 3662ac0c33Sjakob RR_SECTION_COUNT 3762ac0c33Sjakob }; 3862ac0c33Sjakob typedef enum rr_section rr_section_type; 3962ac0c33Sjakob 4062ac0c33Sjakob /* Possible OPCODE values */ 4162ac0c33Sjakob #define OPCODE_QUERY 0 /* a standard query (QUERY) */ 4262ac0c33Sjakob #define OPCODE_IQUERY 1 /* an inverse query (IQUERY) */ 4362ac0c33Sjakob #define OPCODE_STATUS 2 /* a server status request (STATUS) */ 4462ac0c33Sjakob #define OPCODE_NOTIFY 4 /* NOTIFY */ 4562ac0c33Sjakob #define OPCODE_UPDATE 5 /* Dynamic update */ 4662ac0c33Sjakob 4762ac0c33Sjakob /* Possible RCODE values */ 4862ac0c33Sjakob #define RCODE_OK 0 /* No error condition */ 4962ac0c33Sjakob #define RCODE_FORMAT 1 /* Format error */ 5062ac0c33Sjakob #define RCODE_SERVFAIL 2 /* Server failure */ 5162ac0c33Sjakob #define RCODE_NXDOMAIN 3 /* Name Error */ 5262ac0c33Sjakob #define RCODE_IMPL 4 /* Not implemented */ 5362ac0c33Sjakob #define RCODE_REFUSE 5 /* Refused */ 5462ac0c33Sjakob #define RCODE_YXDOMAIN 6 /* name should not exist */ 5562ac0c33Sjakob #define RCODE_YXRRSET 7 /* rrset should not exist */ 5662ac0c33Sjakob #define RCODE_NXRRSET 8 /* rrset does not exist */ 5762ac0c33Sjakob #define RCODE_NOTAUTH 9 /* server not authoritative */ 5862ac0c33Sjakob #define RCODE_NOTZONE 10 /* name not inside zone */ 5962ac0c33Sjakob 6062ac0c33Sjakob /* Standardized NSD return code. Partially maps to DNS RCODE values. */ 6162ac0c33Sjakob enum nsd_rc 6262ac0c33Sjakob { 6362ac0c33Sjakob /* Discard the client request. */ 6462ac0c33Sjakob NSD_RC_DISCARD = -1, 6562ac0c33Sjakob /* OK, continue normal processing. */ 6662ac0c33Sjakob NSD_RC_OK = RCODE_OK, 6762ac0c33Sjakob /* Return the appropriate error code to the client. */ 6862ac0c33Sjakob NSD_RC_FORMAT = RCODE_FORMAT, 6962ac0c33Sjakob NSD_RC_SERVFAIL = RCODE_SERVFAIL, 7062ac0c33Sjakob NSD_RC_NXDOMAIN = RCODE_NXDOMAIN, 7162ac0c33Sjakob NSD_RC_IMPL = RCODE_IMPL, 7262ac0c33Sjakob NSD_RC_REFUSE = RCODE_REFUSE, 7362ac0c33Sjakob NSD_RC_NOTAUTH = RCODE_NOTAUTH 7462ac0c33Sjakob }; 7562ac0c33Sjakob typedef enum nsd_rc nsd_rc_type; 7662ac0c33Sjakob 7762ac0c33Sjakob /* RFC1035 */ 7862ac0c33Sjakob #define CLASS_IN 1 /* Class IN */ 7962ac0c33Sjakob #define CLASS_CS 2 /* Class CS */ 8062ac0c33Sjakob #define CLASS_CH 3 /* Class CHAOS */ 8162ac0c33Sjakob #define CLASS_HS 4 /* Class HS */ 8262ac0c33Sjakob #define CLASS_NONE 254 /* Class NONE rfc2136 */ 8362ac0c33Sjakob #define CLASS_ANY 255 /* Class ANY */ 8462ac0c33Sjakob 8562ac0c33Sjakob #define TYPE_A 1 /* a host address */ 8662ac0c33Sjakob #define TYPE_NS 2 /* an authoritative name server */ 8762ac0c33Sjakob #define TYPE_MD 3 /* a mail destination (Obsolete - use MX) */ 8862ac0c33Sjakob #define TYPE_MF 4 /* a mail forwarder (Obsolete - use MX) */ 8962ac0c33Sjakob #define TYPE_CNAME 5 /* the canonical name for an alias */ 9062ac0c33Sjakob #define TYPE_SOA 6 /* marks the start of a zone of authority */ 9162ac0c33Sjakob #define TYPE_MB 7 /* a mailbox domain name (EXPERIMENTAL) */ 9262ac0c33Sjakob #define TYPE_MG 8 /* a mail group member (EXPERIMENTAL) */ 9362ac0c33Sjakob #define TYPE_MR 9 /* a mail rename domain name (EXPERIMENTAL) */ 9462ac0c33Sjakob #define TYPE_NULL 10 /* a null RR (EXPERIMENTAL) */ 9562ac0c33Sjakob #define TYPE_WKS 11 /* a well known service description */ 9662ac0c33Sjakob #define TYPE_PTR 12 /* a domain name pointer */ 9762ac0c33Sjakob #define TYPE_HINFO 13 /* host information */ 9862ac0c33Sjakob #define TYPE_MINFO 14 /* mailbox or mail list information */ 9962ac0c33Sjakob #define TYPE_MX 15 /* mail exchange */ 10062ac0c33Sjakob #define TYPE_TXT 16 /* text strings */ 10162ac0c33Sjakob #define TYPE_RP 17 /* RFC1183 */ 10262ac0c33Sjakob #define TYPE_AFSDB 18 /* RFC1183 */ 10362ac0c33Sjakob #define TYPE_X25 19 /* RFC1183 */ 10462ac0c33Sjakob #define TYPE_ISDN 20 /* RFC1183 */ 10562ac0c33Sjakob #define TYPE_RT 21 /* RFC1183 */ 10662ac0c33Sjakob #define TYPE_NSAP 22 /* RFC1706 */ 10762ac0c33Sjakob 10862ac0c33Sjakob #define TYPE_SIG 24 /* 2535typecode */ 10962ac0c33Sjakob #define TYPE_KEY 25 /* 2535typecode */ 11062ac0c33Sjakob #define TYPE_PX 26 /* RFC2163 */ 11162ac0c33Sjakob 11262ac0c33Sjakob #define TYPE_AAAA 28 /* ipv6 address */ 11362ac0c33Sjakob #define TYPE_LOC 29 /* LOC record RFC1876 */ 11462ac0c33Sjakob #define TYPE_NXT 30 /* 2535typecode */ 11562ac0c33Sjakob 11662ac0c33Sjakob #define TYPE_SRV 33 /* SRV record RFC2782 */ 11762ac0c33Sjakob 11862ac0c33Sjakob #define TYPE_NAPTR 35 /* RFC2915 */ 11962ac0c33Sjakob #define TYPE_KX 36 /* RFC2230 Key Exchange Delegation Record */ 12062ac0c33Sjakob #define TYPE_CERT 37 /* RFC2538 */ 12162ac0c33Sjakob 12262ac0c33Sjakob #define TYPE_A6 38 /* RFC2874 */ 12362ac0c33Sjakob 12462ac0c33Sjakob #define TYPE_DNAME 39 /* RFC2672 */ 12562ac0c33Sjakob 12662ac0c33Sjakob #define TYPE_OPT 41 /* Pseudo OPT record... */ 12762ac0c33Sjakob #define TYPE_APL 42 /* RFC3123 */ 12862ac0c33Sjakob #define TYPE_DS 43 /* RFC 4033, 4034, and 4035 */ 12962ac0c33Sjakob #define TYPE_SSHFP 44 /* SSH Key Fingerprint */ 13062ac0c33Sjakob #define TYPE_IPSECKEY 45 /* public key for ipsec use. RFC 4025 */ 13162ac0c33Sjakob 13262ac0c33Sjakob #define TYPE_RRSIG 46 /* RFC 4033, 4034, and 4035 */ 13362ac0c33Sjakob #define TYPE_NSEC 47 /* RFC 4033, 4034, and 4035 */ 13462ac0c33Sjakob #define TYPE_DNSKEY 48 /* RFC 4033, 4034, and 4035 */ 13562ac0c33Sjakob #define TYPE_DHCID 49 /* RFC4701 DHCP information */ 13662ac0c33Sjakob #define TYPE_NSEC3 50 /* NSEC3, secure denial, prevents zonewalking */ 13762ac0c33Sjakob #define TYPE_NSEC3PARAM 51 /* NSEC3PARAM at zone apex nsec3 parameters */ 13872f0a8e9Ssthen #define TYPE_TLSA 52 /* RFC 6698 */ 13918e77612Sflorian #define TYPE_SMIMEA 53 /* RFC 8162 */ 14003739794Sbrad #define TYPE_CDS 59 /* RFC 7344 */ 14103739794Sbrad #define TYPE_CDNSKEY 60 /* RFC 7344 */ 142c1e73312Sflorian #define TYPE_OPENPGPKEY 61 /* RFC 7929 */ 143275a8d89Sflorian #define TYPE_CSYNC 62 /* RFC 7477 */ 144977db6e5Sflorian #define TYPE_ZONEMD 63 /* draft-ietf-dnsop-dns-zone-digest */ 145063644e9Sflorian #define TYPE_SVCB 64 /* draft-ietf-dnsop-svcb-https-03 */ 146063644e9Sflorian #define TYPE_HTTPS 65 /* draft-ietf-dnsop-svcb-https-03 */ 14762ac0c33Sjakob 14862ac0c33Sjakob #define TYPE_SPF 99 /* RFC 4408 */ 14962ac0c33Sjakob 15075343be4Ssthen #define TYPE_NID 104 /* RFC 6742 */ 15175343be4Ssthen #define TYPE_L32 105 /* RFC 6742 */ 15275343be4Ssthen #define TYPE_L64 106 /* RFC 6742 */ 15375343be4Ssthen #define TYPE_LP 107 /* RFC 6742 */ 154a302926fSbrad #define TYPE_EUI48 108 /* RFC 7043 */ 155a302926fSbrad #define TYPE_EUI64 109 /* RFC 7043 */ 1569c620270Ssthen 15762ac0c33Sjakob #define TYPE_TSIG 250 15862ac0c33Sjakob #define TYPE_IXFR 251 15962ac0c33Sjakob #define TYPE_AXFR 252 16062ac0c33Sjakob #define TYPE_MAILB 253 /* A request for mailbox-related records (MB, MG or MR) */ 16162ac0c33Sjakob #define TYPE_MAILA 254 /* A request for mail agent RRs (Obsolete - see MX) */ 16262ac0c33Sjakob #define TYPE_ANY 255 /* any type (wildcard) */ 163e3d8a0a5Ssthen #define TYPE_URI 256 /* RFC 7553 */ 164a302926fSbrad #define TYPE_CAA 257 /* RFC 6844 */ 165fb800cb5Sflorian #define TYPE_AVC 258 166a302926fSbrad 16762ac0c33Sjakob #define TYPE_DLV 32769 /* RFC 4431 */ 16862ac0c33Sjakob #define PSEUDO_TYPE_DLV RRTYPE_DESCRIPTORS_LENGTH 16962ac0c33Sjakob 170063644e9Sflorian #define SVCB_KEY_MANDATORY 0 171063644e9Sflorian #define SVCB_KEY_ALPN 1 172063644e9Sflorian #define SVCB_KEY_NO_DEFAULT_ALPN 2 173063644e9Sflorian #define SVCB_KEY_PORT 3 174063644e9Sflorian #define SVCB_KEY_IPV4HINT 4 175063644e9Sflorian #define SVCB_KEY_ECH 5 176063644e9Sflorian #define SVCB_KEY_IPV6HINT 6 177de04d855Ssthen #define SVCB_KEY_DOHPATH 7 178de04d855Ssthen #define SVCPARAMKEY_COUNT 8 179063644e9Sflorian 18062ac0c33Sjakob #define MAXLABELLEN 63 18162ac0c33Sjakob #define MAXDOMAINLEN 255 18262ac0c33Sjakob 18362ac0c33Sjakob #define MAXRDATALEN 64 /* This is more than enough, think multiple TXT. */ 18462ac0c33Sjakob #define MAX_RDLENGTH 65535 18562ac0c33Sjakob 18662ac0c33Sjakob /* Maximum size of a single RR. */ 18762ac0c33Sjakob #define MAX_RR_SIZE \ 18862ac0c33Sjakob (MAXDOMAINLEN + sizeof(uint32_t) + 4*sizeof(uint16_t) + MAX_RDLENGTH) 18962ac0c33Sjakob 19062ac0c33Sjakob #define IP4ADDRLEN (32/8) 19162ac0c33Sjakob #define IP6ADDRLEN (128/8) 1929c620270Ssthen #define EUI48ADDRLEN (48/8) 1939c620270Ssthen #define EUI64ADDRLEN (64/8) 19462ac0c33Sjakob 195dd5b221eSsthen #define NSEC3_HASH_LEN 20 196dd5b221eSsthen 19762ac0c33Sjakob /* 19862ac0c33Sjakob * The different types of RDATA wireformat data. 19962ac0c33Sjakob */ 20062ac0c33Sjakob enum rdata_wireformat 20162ac0c33Sjakob { 20262ac0c33Sjakob RDATA_WF_COMPRESSED_DNAME, /* Possibly compressed domain name. */ 20362ac0c33Sjakob RDATA_WF_UNCOMPRESSED_DNAME, /* Uncompressed domain name. */ 20462ac0c33Sjakob RDATA_WF_LITERAL_DNAME, /* Literal (not downcased) dname. */ 20562ac0c33Sjakob RDATA_WF_BYTE, /* 8-bit integer. */ 20662ac0c33Sjakob RDATA_WF_SHORT, /* 16-bit integer. */ 20762ac0c33Sjakob RDATA_WF_LONG, /* 32-bit integer. */ 20862ac0c33Sjakob RDATA_WF_TEXT, /* Text string. */ 209f72b2965Sjakob RDATA_WF_TEXTS, /* Text string sequence. */ 21062ac0c33Sjakob RDATA_WF_A, /* 32-bit IPv4 address. */ 21162ac0c33Sjakob RDATA_WF_AAAA, /* 128-bit IPv6 address. */ 21262ac0c33Sjakob RDATA_WF_BINARY, /* Binary data (unknown length). */ 21362ac0c33Sjakob RDATA_WF_BINARYWITHLENGTH, /* Binary data preceded by 1 byte length */ 21462ac0c33Sjakob RDATA_WF_APL, /* APL data. */ 21575343be4Ssthen RDATA_WF_IPSECGATEWAY, /* IPSECKEY gateway ip4, ip6 or dname. */ 2169c620270Ssthen RDATA_WF_ILNP64, /* 64-bit uncompressed IPv6 address. */ 2179c620270Ssthen RDATA_WF_EUI48, /* 48-bit address. */ 218a302926fSbrad RDATA_WF_EUI64, /* 64-bit address. */ 219063644e9Sflorian RDATA_WF_LONG_TEXT, /* Long (>255) text string. */ 220063644e9Sflorian RDATA_WF_SVCPARAM /* SvcParam <key>[=<value>] */ 22162ac0c33Sjakob }; 22262ac0c33Sjakob typedef enum rdata_wireformat rdata_wireformat_type; 22362ac0c33Sjakob 22462ac0c33Sjakob /* 22562ac0c33Sjakob * The different types of RDATA that can appear in the zone file. 22662ac0c33Sjakob */ 22762ac0c33Sjakob enum rdata_zoneformat 22862ac0c33Sjakob { 22962ac0c33Sjakob RDATA_ZF_DNAME, /* Domain name. */ 23062ac0c33Sjakob RDATA_ZF_LITERAL_DNAME, /* DNS name (not lowercased domain name). */ 23162ac0c33Sjakob RDATA_ZF_TEXT, /* Text string. */ 232f72b2965Sjakob RDATA_ZF_TEXTS, /* Text string sequence. */ 23362ac0c33Sjakob RDATA_ZF_BYTE, /* 8-bit integer. */ 23462ac0c33Sjakob RDATA_ZF_SHORT, /* 16-bit integer. */ 23562ac0c33Sjakob RDATA_ZF_LONG, /* 32-bit integer. */ 23662ac0c33Sjakob RDATA_ZF_A, /* 32-bit IPv4 address. */ 23762ac0c33Sjakob RDATA_ZF_AAAA, /* 128-bit IPv6 address. */ 23862ac0c33Sjakob RDATA_ZF_RRTYPE, /* RR type. */ 23962ac0c33Sjakob RDATA_ZF_ALGORITHM, /* Cryptographic algorithm. */ 24062ac0c33Sjakob RDATA_ZF_CERTIFICATE_TYPE, 24162ac0c33Sjakob RDATA_ZF_PERIOD, /* Time period. */ 24262ac0c33Sjakob RDATA_ZF_TIME, 24362ac0c33Sjakob RDATA_ZF_BASE64, /* Base-64 binary data. */ 24462ac0c33Sjakob RDATA_ZF_BASE32, /* Base-32 binary data. */ 24562ac0c33Sjakob RDATA_ZF_HEX, /* Hexadecimal binary data. */ 24662ac0c33Sjakob RDATA_ZF_HEX_LEN, /* Hexadecimal binary data. Skip initial length byte. */ 24762ac0c33Sjakob RDATA_ZF_NSAP, /* NSAP. */ 24862ac0c33Sjakob RDATA_ZF_APL, /* APL. */ 24962ac0c33Sjakob RDATA_ZF_IPSECGATEWAY, /* IPSECKEY gateway ip4, ip6 or dname. */ 25062ac0c33Sjakob RDATA_ZF_SERVICES, /* Protocol and port number bitmap. */ 25162ac0c33Sjakob RDATA_ZF_NXT, /* NXT type bitmap. */ 25262ac0c33Sjakob RDATA_ZF_NSEC, /* NSEC type bitmap. */ 25362ac0c33Sjakob RDATA_ZF_LOC, /* Location data. */ 25475343be4Ssthen RDATA_ZF_ILNP64, /* 64-bit uncompressed IPv6 address. */ 2559c620270Ssthen RDATA_ZF_EUI48, /* EUI48 address. */ 2569c620270Ssthen RDATA_ZF_EUI64, /* EUI64 address. */ 257a302926fSbrad RDATA_ZF_LONG_TEXT, /* Long (>255) text string. */ 258a302926fSbrad RDATA_ZF_TAG, /* Text string without quotes. */ 259063644e9Sflorian RDATA_ZF_SVCPARAM, /* SvcParam <key>[=<value>] */ 26062ac0c33Sjakob RDATA_ZF_UNKNOWN /* Unknown data. */ 26162ac0c33Sjakob }; 26262ac0c33Sjakob typedef enum rdata_zoneformat rdata_zoneformat_type; 26362ac0c33Sjakob 26462ac0c33Sjakob struct rrtype_descriptor 26562ac0c33Sjakob { 26662ac0c33Sjakob uint16_t type; /* RR type */ 26762ac0c33Sjakob const char *name; /* Textual name. */ 26862ac0c33Sjakob int token; /* Parser token. */ 269d65f3523Sjakob uint32_t minimum; /* Minimum number of RDATAs. */ 270d65f3523Sjakob uint32_t maximum; /* Maximum number of RDATAs. */ 27162ac0c33Sjakob uint8_t wireformat[MAXRDATALEN]; /* rdata_wireformat_type */ 27262ac0c33Sjakob uint8_t zoneformat[MAXRDATALEN]; /* rdata_zoneformat_type */ 27362ac0c33Sjakob }; 27462ac0c33Sjakob typedef struct rrtype_descriptor rrtype_descriptor_type; 27562ac0c33Sjakob 27662ac0c33Sjakob /* 27762ac0c33Sjakob * Indexed by type. The special type "0" can be used to get a 27862ac0c33Sjakob * descriptor for unknown types (with one binary rdata). 27962ac0c33Sjakob * 280fb800cb5Sflorian * AVC + 1 28162ac0c33Sjakob */ 282fb800cb5Sflorian #define RRTYPE_DESCRIPTORS_LENGTH (TYPE_AVC + 1) 28362ac0c33Sjakob rrtype_descriptor_type *rrtype_descriptor_by_name(const char *name); 28462ac0c33Sjakob rrtype_descriptor_type *rrtype_descriptor_by_type(uint16_t type); 28562ac0c33Sjakob 28662ac0c33Sjakob const char *rrtype_to_string(uint16_t rrtype); 28762ac0c33Sjakob 28862ac0c33Sjakob /* 28962ac0c33Sjakob * Lookup the type in the ztypes lookup table. If not found, check if 29062ac0c33Sjakob * the type uses the "TYPExxx" notation for unknown types. 29162ac0c33Sjakob * 29262ac0c33Sjakob * Return 0 if no type matches. 29362ac0c33Sjakob */ 29462ac0c33Sjakob uint16_t rrtype_from_string(const char *name); 29562ac0c33Sjakob 29662ac0c33Sjakob const char *rrclass_to_string(uint16_t rrclass); 29762ac0c33Sjakob uint16_t rrclass_from_string(const char *name); 29862ac0c33Sjakob 29962ac0c33Sjakob #ifdef __cplusplus 30062ac0c33Sjakob inline rr_section_type 30162ac0c33Sjakob operator++(rr_section_type &lhs) 30262ac0c33Sjakob { 30362ac0c33Sjakob lhs = (rr_section_type) ((int) lhs + 1); 30462ac0c33Sjakob return lhs; 30562ac0c33Sjakob } 30662ac0c33Sjakob #endif /* __cplusplus */ 30762ac0c33Sjakob 308*3efee2e1Sflorian #endif /* DNS_H */ 309