1 /*------------------------------------------------------------------------------
2  *
3  * Copyright (c) 2011-2021, EURid vzw. All rights reserved.
4  * The YADIFA TM software product is provided under the BSD 3-clause license:
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  *        * Redistributions of source code must retain the above copyright
11  *          notice, this list of conditions and the following disclaimer.
12  *        * Redistributions in binary form must reproduce the above copyright
13  *          notice, this list of conditions and the following disclaimer in the
14  *          documentation and/or other materials provided with the distribution.
15  *        * Neither the name of EURid nor the names of its contributors may be
16  *          used to endorse or promote products derived from this software
17  *          without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  *
31  *------------------------------------------------------------------------------
32  *
33  */
34 
35 /** @defgroup
36  *  @ingroup dnscore
37  *  @brief
38  *
39  *
40  *
41  * @{
42  *
43  *----------------------------------------------------------------------------*/
44 #ifndef RFC_H_
45 #define RFC_H_
46 
47 #include <dnscore/sys_types.h>
48 #include <netinet/in.h>
49 
50 /*    ------------------------------------------------------------
51  *
52  *      INCLUDES
53  */
54 
55 /*    ------------------------------------------------------------
56  *
57  *      VALUES
58  */
59 /* http://en.wikipedia.org/wiki/List_of_DNS_record_types */
60 
61 /* dns */
62 #define     DNS_HEADER_LENGTH               12      /*                                    rfc 1035 */
63 #define     MAX_LABEL_LENGTH                63      /*                                    rfc 1034 */
64 #define     MAX_DOMAIN_TEXT_LENGTH          (MAX_DOMAIN_LENGTH - 1)     /*                rfc 1034 */
65 #define     MAX_DOMAIN_LENGTH               255     /*                                    rfc 1034 */
66 #define     MAX_LABEL_COUNT                 ((MAX_DOMAIN_LENGTH + 1) / 2)
67 #define     MAX_SOA_RDATA_LENGTH            (255 + 255 + 20)
68 
69 #define     DNS_DEFAULT_PORT                53
70 
71 /* edns0 */
72 #define     EDNS0_MAX_LENGTH                65535    /* See 4.5.5 in RFC                  rfc 2671 */
73 #define     EDNS0_MIN_LENGTH                512      /*                                   rfc 2671 */
74 #define     EDNS0_DO                        0        /* DNSSEC OK flag                             */
75 #define     EDNS0_OPT_0                     0        /* Reserverd                         rfc 2671 */
76 #define     EDNS0_OPT_3                     3        /* NSID                              rfc 5001 */
77 
78 #define     DNSPACKET_MAX_LENGTH            0xffff
79 #define     UDPPACKET_MAX_LENGTH            512
80 #define     RDATA_MAX_LENGTH                0xffff
81 
82 
83 /* dnssec (dns & bind) */
84 #define     DNSSEC_AD                       0x20     /* Authenticated Data flag                    */
85 #define     DNSSEC_CD                       0x10     /* Checking Disabled flag                     */
86 
87 #define     RRSIG_RDATA_HEADER_LEN          18      /* The length of an RRSIG rdata without the
88                                                      * signer_name and the signature: MUST BE 18 ! */
89 
90 #define     ID_BITS                         0xFF    /*                                    rfc 1035 */
91 
92 // HIGH flags
93 
94 #define     QR_BITS                         0x80U    /*                                    rfc 1035 */
95 #define     OPCODE_BITS                     0x78U    /*                                    rfc 1035 */
96 #define     OPCODE_SHIFT                    3U
97 #define     AA_BITS                         0x04U    /*                                    rfc 1035 */
98 #define     TC_BITS                         0x02U    /*                                    rfc 1035 */
99 #define     RD_BITS                         0x01U    /*                                    rfc 1035 */
100 
101 // LOW flags
102 
103 #define     RA_BITS                         0x80U    /*                                    rfc 1035 */
104 #define     Z_BITS                          0x40U    /*                                    rfc 1035 */
105 #define     AD_BITS                         0x20U    /*                                    rfc 2065 */
106 #define     CD_BITS                         0x10U    /*                                    rfc 2065 */
107 #define     RCODE_BITS                      0x0FU    /*                                    rfc 1035 */
108 
109 #ifdef WORDS_BIGENDIAN
110 // BIG endian
111 
112 #define     DNS_FLAGS_HAS_QR(f_)             (f_ & ((u16)QR_BITS << 8))
113 #define     DNS_FLAGS_GET_OPCODE(f_)         ((f_ >> (OPCODE_SHIFT + 8)) & OPCODE_BITS)
114 #define     DNS_FLAGS_HAS_AA(f_)             (f_ & ((u16)AA_BITS << 8))
115 #define     DNS_FLAGS_HAS_TC(f_)             (f_ & ((u16)TC_BITS << 8))
116 #define     DNS_FLAGS_HAS_RD(f_)             (f_ & ((u16)RD_BITS << 8))
117 
118 #define     DNS_FLAGS_HAS_RA(f_)             (f_ & ((u16)RA_BITS))
119 #define     DNS_FLAGS_HAS_Z(f_)              (f_ & ((u16)Z_BITS))
120 #define     DNS_FLAGS_HAS_AD(f_)             (f_ & ((u16)AD_BITS))
121 #define     DNS_FLAGS_HAS_CD(f_)             (f_ & ((u16)CD_BITS))
122 #define     DNS_FLAGS_GET_RCODE(f_)          (f_ & RCODE_BITS)
123 
124 #else
125 
126 #define     DNS_FLAGS_HAS_QR(f_)             (f_ & ((u16)QR_BITS))
127 #define     DNS_FLAGS_GET_OPCODE(f_)         ((f_ >> OPCODE_SHIFT) & OPCODE_BITS)
128 #define     DNS_FLAGS_HAS_AA(f_)             (f_ & ((u16)AA_BITS))
129 #define     DNS_FLAGS_HAS_TC(f_)             (f_ & ((u16)TC_BITS))
130 #define     DNS_FLAGS_HAS_RD(f_)             (f_ & ((u16)RD_BITS))
131 
132 #define     DNS_FLAGS_HAS_RA(f_)             (f_ & ((u16)RA_BITS << 8))
133 #define     DNS_FLAGS_HAS_Z(f_)              (f_ & ((u16)Z_BITS  << 8))
134 #define     DNS_FLAGS_HAS_AD(f_)             (f_ & ((u16)AD_BITS << 8))
135 #define     DNS_FLAGS_HAS_CD(f_)             (f_ & ((u16)CD_BITS << 8))
136 #define     DNS_FLAGS_GET_RCODE(f_)          ((f_ >> 8) & RCODE_BITS)
137 
138 #endif
139 
140 #define     QDCOUNT_BITS                    0xFFFF  /* number of questions                rfc 1035 */
141 #define     ANCOUNT_BITS                    0xFFFF  /* number of resource records         rfc 1035 */
142 #define     NSCOUNT_BITS                    0xFFFF  /* name servers in the author.rec.    rfc 1035 */
143 #define     ARCOUNT_BITS                    0xFFFF  /* additional records                 rfc 1035 */
144 #define     ZOCOUNT_BITS                    0xFFFF  /* Number of RRs in the Zone Sect.    rfc 2136 */
145 #define     PRCOUNT_BITS                    0xFFFF  /* Number of RRs in the Prereq. Sect. rfc 2136 */
146 #define     UPCOUNT_BITS                    0xFFFF  /* Number of RRs in the Upd. Sect.    rfc 2136 */
147 #define     ADCOUNT_BITS                    0xFFFF  /* Number of RRs in the Add Sect.     rfc 2136 */
148 
149 #define     OPCODE_QUERY                    (0<<OPCODE_SHIFT)       /* a standard query (QUERY)           rfc 1035 */
150 #define     OPCODE_IQUERY                   (1<<OPCODE_SHIFT)       /* an inverse query (IQUERY)          rfc 3425 */
151 #define     OPCODE_STATUS                   (2<<OPCODE_SHIFT)       /* a server status request (STATUS)   rfc 1035 */
152 #define     OPCODE_NOTIFY                   (4<<OPCODE_SHIFT)       /*                                    rfc 1996 */
153 #define     OPCODE_UPDATE                   (5<<OPCODE_SHIFT)       /* update                             rfc 2136 */
154 
155 #define     RCODE_OK                        0       /* No error                           rfc 1035 */
156 #define     RCODE_NOERROR                   0       /* No error                           rfc 1035 */
157 #define     RCODE_FE                        1       /* Format error                       rfc 1035 */
158 #define     RCODE_FORMERR                   1       /* Format error                       rfc 1035 */
159 #define     RCODE_SF                        2       /* Server failure                     rfc 1035 */
160 #define     RCODE_SERVFAIL                  2       /* Server failure                     rfc 1035 */
161 #define     RCODE_NE                        3       /* Name error                         rfc 1035 */
162 #define     RCODE_NXDOMAIN                  3       /* Name error                         rfc 1035 */
163 #define     RCODE_NI                        4       /* Not implemented                    rfc 1035 */
164 #define     RCODE_NOTIMP                    4       /* Not implemented                    rfc 1035 */
165 #define     RCODE_RE                        5       /* Refused                            rfc 1035 */
166 #define     RCODE_REFUSED                   5       /* Refused                            rfc 1035 */
167 
168 #define     RCODE_YXDOMAIN                  6       /* Name exists when it should not     rfc 2136 */
169 #define     RCODE_YXRRSET                   7       /* RR Set exists when it should not   rfc 2136 */
170 #define     RCODE_NXRRSET                   8       /* RR set that should exist doesn't   rfc 2136 */
171 #define     RCODE_NOTAUTH                   9       /* Server not Authortative for zone   rfc 2136 */
172 #define     RCODE_NOTZONE                   10      /* Name not contained in zone         rfc 2136 */
173 
174 #define     RCODE_BADVERS                   16      /* Bad OPT Version                    rfc 2671 */
175 #define     RCODE_BADSIG                    16      /* TSIG Signature Failure             rfc 2845 */
176 #define     RCODE_BADKEY                    17      /* Key not recognized                 rfc 2845 */
177 #define     RCODE_BADTIME                   18      /* Signatue out of time window        rfc 2845 */
178 #define     RCODE_BADMODE                   19      /* Bad TKEY Mode                      rfc 2930 */
179 #define     RCODE_BADNAME                   20      /* Duplicate key name                 rfc 2930 */
180 #define     RCODE_BADALG                    21      /* Algorithm not supported            rfc 2930 */
181 #define     RCODE_BADTRUNC                  22      /* Bad Truncation                     rfc 4635 */
182 
183 /* EDNS0 */
184 
185 #define     RCODE_EXT_DNSSEC                0x00800000  /* Network-order, DNSSEC requested */
186 
187 #define     TYPE_NONE                           0
188 /*
189                                    1  1  1  1  1  1
190      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
191    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
192    |                    ADDRESS                    |    32 bit address
193    |                                               |
194    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
195    */
196 #define     TYPE_A                          NU16(1)     /* a host address                   rfc 1035 */
197 /*
198                                    1  1  1  1  1  1
199      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
200    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
201    /                    NSDNAME                    /    dns formatted domain name
202    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
203    */
204 #define     TYPE_NS                         NU16(2)     /* an authoritative name server     rfc 1035 */
205 /*
206                                    1  1  1  1  1  1
207      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
208    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
209    /                    MADNAME                    /    dns formatted domain name
210    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
211    */
212 #define     TYPE_MD                         NU16(3)     /* mail destination - OBSOLETE      rfc 1035 rfc 882 */
213 /*
214                                    1  1  1  1  1  1
215      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
216    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
217    /                    MADNAME                    /    dns formatted domain name
218    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
219    */
220 #define     TYPE_MF                         NU16(4)     /* mail forwarder - OBSOLETE        rfc 1035 rfc 882 */
221 /*
222                                    1  1  1  1  1  1
223      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
224    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
225    /                     CNAME                     /    dns formatted domain name
226    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
227    */
228 #define     TYPE_CNAME                      NU16(5)     /* the canonical name of a alias    rfc 1035 */
229 /*
230                                    1  1  1  1  1  1
231      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
232    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
233    /                     MNAME                     /    dns formatted domain name
234    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
235    /                     RNAME                     /    dns formatted domain name with local-part.
236    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    Can have '\' before '.'
237    |                    SERIAL                     |    32 bit
238    |                                               |
239    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
240    |                    REFRESH                    |    32 bit
241    |                                               |
242    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
243    |                     RETRY                     |    32 bit
244    |                                               |
245    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
246    |                    EXPIRE                     |    32 bit
247    |                                               |
248    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
249    |                    MINIMUM                    |    32 bit
250    |                                               |
251    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
252    */
253 #define     TYPE_SOA                        NU16(6)     /* start of a zone of authority     rfc 1035 */
254 /*
255                                    1  1  1  1  1  1
256      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
257    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
258    /                    MADNAME                    /    dns formatted domain name
259    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
260    */
261 #define     TYPE_MB                         NU16(7)     /* mailbox domain name - EXPERIMENTAL   rfc 1035 */
262 /*
263                                    1  1  1  1  1  1
264      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
265    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
266    /                    MMGNAME                    /    dns formatted domain name
267    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
268    */
269 #define     TYPE_MG                         NU16(8)     /* mail group member - EXPERIMENTAL rfc 1035 */
270 /*
271                                    1  1  1  1  1  1
272      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
273    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
274    /                    NEWNAME                    /    dns formatted domain name
275    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
276    */
277 #define     TYPE_MR                         NU16(9)     /* mail rename domain name - EXPERIMENTAL   rfc 1035 */
278 /*
279                                    1  1  1  1  1  1
280      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
281    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
282    /                  <ANYTHING>                   /
283    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
284    */
285 #define     TYPE_NULL                       NU16(10)    /* a null RR - EXPERIMENTAL         rfc 1035 */
286 /*
287                                    1  1  1  1  1  1
288      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
289    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
290    |                    ADDRESS                    |    32 bit address ARPA Internet address
291    |                                               |
292    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
293    |       PROTOCOL        |                       |    PROTOCOL: 8 bit IP protocol number
294    +--+--+--+--+--+--+--+--+                       |
295    /                   <BIT MAP>                   /    BIT MAP: variable length bit map. The bit map
296    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    must be a multiple of 8 bits long.
297 */
298 #define     TYPE_WKS                        NU16(11)    /* a well known service description rfc 1035 */
299 /*
300                                    1  1  1  1  1  1
301      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
302    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
303    /                   PTRNAME                     /    dns formatted domain name
304    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
305    */
306 #define     TYPE_PTR                        NU16(12)    /* a domain name pointer            rfc 1035 */
307 /*
308                                    1  1  1  1  1  1
309      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
310    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
311    /                      CPU                      /    character-string
312    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
313    /                       OS                      /    character-string
314    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
315    */
316 #define     TYPE_HINFO                      NU16(13)    /* host information                 rfc 1035 */
317 /*
318                                    1  1  1  1  1  1
319      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
320    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
321    /                   RMAILBX                     /    character-string
322    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
323    /                   EMAILBX                     /    character-string
324    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
325    */
326 #define     TYPE_MINFO                      NU16(14)    /* mailbox or mail list information rfc 1035 */
327 /*
328                                    1  1  1  1  1  1
329      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
330    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
331    |                  PREFERENCE                   |    16 bit
332    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
333    /                   EXCHANGE                    /    dns formatted domain name
334    /                                               /
335    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
336    */
337 #define     TYPE_MX                         NU16(15)    /* mail exchange                    rfc 1035 */
338 /*
339                                    1  1  1  1  1  1
340      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
341    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
342    /                   TXT-DATA                    /    one or more <character string>s (pascal string)
343    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
344    */
345 #define     TYPE_TXT                        NU16(16)    /* text strings                     rfc 1035 */
346 /*
347                                    1  1  1  1  1  1
348      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
349    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
350    /                  MBOX-DNAME                   /    dns formatted domain name local-part. Can have '\'before .
351    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
352    /                   TXT-DNAME                   /    dns formatted domain name
353    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
354  */
355 #define     TYPE_RP                         NU16(17)    /* For Responsible Person           rfc 1183 */
356 /*
357                                    1  1  1  1  1  1
358      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
359    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
360    |                    SUBTYPE                    |    16 bit
361    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
362    /                   HOSTNAME                    /    dns formatted domain name
363    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
364    */
365 #define     TYPE_AFSDB                      NU16(18)    /* AFS Data Base location           rfc 1183 rfc 5864 */
366 /*
367                                    1  1  1  1  1  1
368      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
369    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
370    /                   PSDN-ADDRESS                /    pascal string (numeric only)
371    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
372    */
373 #define     TYPE_X25                        NU16(19)    /* X.25 PSDN address                rfc 1183 */
374 /*
375                                    1  1  1  1  1  1
376      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
377    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
378    /                   ISDN-ADDRESS                /    pascal string (IA5 allowed)
379    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
380    /                        SA                     /    pascal string (numeric BCD) (OPTIONAL)
381    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
382    */
383 #define     TYPE_ISDN                       NU16(20)    /* ISDN address                     rfc 1183 */
384 /*
385                                    1  1  1  1  1  1
386      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
387    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
388    |                  PREFERENCE                   |    16 bit
389    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
390    /               INTERMEDIATE-HOST               /    dns formatted domain name
391    /                                               /
392    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
393    */
394 #define     TYPE_RT                         NU16(21)    /* Route Through                    rfc 1183 */
395 /*
396                                    1  1  1  1  1  1
397      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
398    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
399    /                   NSAP (in hex)               /    binary encoding of NSAP in hex
400    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
401    */
402 /*
403           |--------------|
404           | <-- IDP -->  |
405           |--------------|-------------------------------------|
406           | AFI |  IDI   |            <-- DSP -->              |
407           |-----|--------|-------------------------------------|
408           | 47  |  0005  | DFI | AA |Rsvd | RD |Area | ID |Sel |
409           |-----|--------|-----|----|-----|----|-----|----|----|
410    octets |  1  |   2    |  1  | 3  |  2  | 2  |  2  | 6  | 1  |
411           |-----|--------|-----|----|-----|----|-----|----|----|
412 
413                 IDP    Initial Domain Part
414                 AFI    Authority and Format Identifier
415                 IDI    Initial Domain Identifier
416                 DSP    Domain Specific Part
417                 DFI    DSP Format Identifier
418                 AA     Administrative Authority
419                 Rsvd   Reserved
420                 RD     Routing Domain Identifier
421                 Area   Area Identifier
422                 ID     System Identifier
423                 SEL    NSAP Selector
424    */
425 #define     TYPE_NSAP                       NU16(22)    /* NSAP address, NSAP style A record    rfc 1706 */
426 /*
427                                    1  1  1  1  1  1
428      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
429    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
430    /                   PTRNAME                     /    dns formatted domain name
431    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
432    */
433 #define     TYPE_NSAP_PTR                   NU16(23)    /* domain name pointer, NSAP style  rfc 1348 */
434 /*
435                                    1  1  1  1  1  1
436      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
437    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
438    |                  TYPE COVERED                 |    16 bit unsigned integer
439    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
440    |      ALGORITHM        |        LABELS         |
441    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
442    |                   ORIGINAL TTL                |    32 bit
443    |                                               |
444    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
445    |                 SIGNATURE EXPIRATION          |    32 bit
446    |                                               |
447    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
448    |                 SIGNATURE INCEPTION           |    32 bit
449    |                                               |
450    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
451    |                     KEY TAG                   |    16 bit unsigned integer
452    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
453    /                  SIGNER'S NAME                /
454    /                                               /
455    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
456    /                                               /
457    /                    SIGNATURE                  /
458    /                                               /
459    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
460    */
461 #define     TYPE_SIG                        NU16(24)    /* for security signature           rfc 4034 rfc 3755 rfc 2535 rfc 2536 rfc 2537 rfc 2931 rfc 3110 rfc 3008 */
462 /*
463                                    1  1  1  1  1  1
464      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
465    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
466    |                   FLAGS                       |    16 bit
467    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
468    |        PROTOCOL       |       ALGORITHM       |    PROTOCOL: 8 bit, ALGORITHM: 8 bit
469    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
470    /                                               /
471    /                   PUBLIC KEY                  /
472    /                                               /
473    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
474    */
475 /* flags
476                                              1   1   1   1   1   1
477      0   1   2   3   4   5   6   7   8   9   0   1   2   3   4   5
478    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
479    |  A/C  | Z | XT| Z | Z | NAMTYP| Z | Z | Z | Z |      SIG      |
480    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
481    */
482 #define     TYPE_KEY                        NU16(25)    /* for security key                 rfc 4034 rfc 3755 rfc 2535 rfc 2536 rfc 2537 rfc 2539 rfc 3008 rfc 3110 */
483 /*
484                                    1  1  1  1  1  1
485      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
486    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
487    |                  PREFERENCE                   |    16 bit
488    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
489    /                    MAP822                     /    dns formatted domain name
490    /                                               /
491    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
492    /                    MAPX400                    /    dns formatted domain name
493    /                                               /
494    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
495    */
496 #define     TYPE_PX                         NU16(26)    /* X.400 mail mapping information   rfc 2163 */
497 /*
498    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
499    /                 LONGITUDE                     /    c-string (representing a real number)
500    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
501    /                  LATITUDE                     /    c-string (representing a real number)
502    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
503    /                  ALTITUDE                     /    c-string (representing a real number)
504    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
505    */
506 #define     TYPE_GPOS                       NU16(27)    /* Geographical Position            rfc 1712 */
507 /*
508                                    1  1  1  1  1  1
509      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
510    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
511    |                    ADDRESS                    |    32 bit address address
512    |                                               |
513    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
514    |                    ADDRESS                    |    32 bit address address
515    |                                               |
516    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
517    |                    ADDRESS                    |    32 bit address address
518    |                                               |
519    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
520    |                    ADDRESS                    |    32 bit address address
521    |                                               |
522    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
523    */
524 #define     TYPE_AAAA                       NU16(28)    /* IP6 Address                      rfc 3596 */
525 /*
526                                    1  1  1  1  1  1
527      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
528    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
529    |        VERSION        |         SIZE          |    VERSION: 8 bit int, SIZE: 8 bit int
530    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
531    |       HORIZ PRE       |       VERT PRE        |    HORIZ PRE: 8 bit int, VERT PRE: 8 bit int
532    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
533    |                   LATITUDE                    |    32 bit integer
534    |                                               |
535    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
536    |                   LONGITUDE                   |    32 bit integer
537    |                                               |
538    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
539    |                   ALTITUDE                    |    32 bit integer
540    |                                               |
541    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
542    */
543 #define     TYPE_LOC                        NU16(29)    /* Location information             rfc 1876 */
544 /*
545                                    1  1  1  1  1  1
546      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
547    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
548    /               NEXT DOMAIN NAME                /    dns formatted domain name
549    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
550    /                 TYPE BIT MAPS                 /
551    /                                               /
552    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
553    */
554 #define     TYPE_NXT                        NU16(30)    /* Next Domain - OBSOLETE           rfc 3755 rfc 2535 */
555 /*
556                                    1  1  1  1  1  1
557      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
558    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
559    /             ENDPOINT IDENTIFIER               /    string of octets. (Binary encoding of the Identifier,
560    /                                               /    meaningful only to the system utilizing it)
561    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
562    */
563 #define     TYPE_EID                        NU16(31)    /* Endpoint Identifier              @note undocumented see draft-ietf-nimrod-dns-01.txt */
564 /*
565                                    1  1  1  1  1  1
566      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
567    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
568    /                 NIMROD LOCATOR                /    variable string of octets. (Binary encoding of the Locator
569    /                                               /    specified in the Nimrod protocol)
570    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
571    */
572 #define     TYPE_NIMLOC                     NU16(32)    /* Nimrod Locator                   @note undocumented see draft-ietf-nimrod-dns-01.txt */
573 /*
574                                    1  1  1  1  1  1
575      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
576    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
577    |                  PRIORITY                     |   16 bit unsigned integer
578    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
579    |                   WEIGHT                      |   16 bit unsigned integer
580    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
581    |                    PORT                       |   16 bit unsigned integer
582    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
583    /                   TARGET                      /   dns formatted domain name
584    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
585    */
586 #define     TYPE_SRV                        NU16(33)    /* Server selection                 rfc 2782 */
587 /*
588                                    1  1  1  1  1  1
589      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
590    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
591    |          FORMAT       |                       |    FORMAT: 8 bit
592    +--+--+--+--+--+--+--+--+                       |    ADDRESS: c-string
593    /                    ADDRESS                    /
594    |                                               |
595    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
596  */
597 #define     TYPE_ATMA                       NU16(34)    /* ATM Address                      @note undocumented see ATM Name System V2.0 */
598 /*
599                                    1  1  1  1  1  1
600      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
601    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
602    |                     ORDER                     |    16 bit unsigned integer
603    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
604    |                   PREFERENCE                  |    16 bit unsigned integer
605    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
606    /                     FLAGS                     /   character-string (a-z0-9) can be empty
607    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
608    /                   SERVICES                    /   character-string (a-z0-9) can be empty
609    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
610    /                    REGEXP                     /   character-string
611    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
612    /                  REPLACEMENT                  /   <domain name>
613    /                                               /
614    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
615    */
616 #define     TYPE_NAPTR                      NU16(35)    /* Naming Authority Pointer         rfc 2915 rfc 2168 rfc 3403 */
617 /*
618                                    1  1  1  1  1  1
619      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
620    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
621    |                  PREFERENCE                   |    16 bit unsigned integer
622    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
623    /                   EXCHANGER                   /    dns formatted domain name
624    /                                               /
625    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
626    */
627 #define     TYPE_KX                         NU16(36)    /* Key Exchanger                    rfc 2230 */
628 /*
629                                    1  1  1  1  1  1
630      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
631    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
632    |                     TYPE                      |    16 bit unsigned integer
633    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
634    |                    KEY TAG                    |    16 bit unsigned integer
635    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
636    |       ALGORITHM       |                       /
637    +--+--+--+--+--+--+--+--+                       /
638    /                                               /
639    /               CERTIFICATE OR CRL              /
640    /                                               /
641    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
642    */
643 #define     TYPE_CERT                       NU16(37)    /* CERT                             rfc 4398 */
644 /*
645                                    1  1  1  1  1  1
646      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
647    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
648    |         PREFIX        |                       /    8 bit unsigned integer
649    +--+--+--+--+--+--+--+--+                       /
650    /                                               /
651    /                 ADDRESS SUFFIX                /    0..16 octets
652    /                                               /
653    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
654    /                   PREFIX NAME                 /    uncompressed domain name
655    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
656    */
657 #define     TYPE_A6                         NU16(38)    /* A6                               rfc 3226 rfc 2874 rfc 6563 */
658 /*
659                                    1  1  1  1  1  1
660      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
661    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
662    /                      DNAME                    /    dns formatted domain name
663    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
664    */
665 #define     TYPE_DNAME                      NU16(39)    /* DNAME                            rfc 6672 */
666 /*
667                                    1  1  1  1  1  1
668      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
669    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
670    |         CODING        |       SUBCODING       |    CODING: 8 bit, SUBCODING: 8 bit
671    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
672    |                                               /    c-string
673    /                     DATA                      /
674    /                                               /
675    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
676    */
677 #define     TYPE_SINK                       NU16(40)    /* SINK                             @note undocumented see The Kitchen Sink Resource Record */
678 /*
679                                    1  1  1  1  1  1
680      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
681    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
682    |                  OPTION-CODE                  |    16 bit unsigned integer
683    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
684    |                 OPTION-LENGTH                 |    16 bit unsigned integer
685    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
686    |                                               |
687    /                  OPTION-DATA                  /
688    /                                               /
689    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
690    */
691 /*
692  * @todo 20171121 thx -- this is not about RDATA, fix this (maybe it should not
693  *                       be here at all ?)
694  *
695  *
696                                    1  1  1  1  1  1
697      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
698    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
699    |     EXTENDED-RCODE    |       VERSION         |
700    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
701    |                       Z                       |
702    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
703    */
704 #define     TYPE_OPT                        NU16(41)    /* edns0 flag                       rfc 6891 rfc 3225 */
705 /*
706                                    1  1  1  1  1  1
707      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
708    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
709    |                ADDRESSFAMILY                  |    16 bit unsigned integer
710    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
711    |        PREFIX      | N|       AFDLENGTH       |    PREFIX: 8 bit unsigned binary coded, N: 1 bit,
712    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    ADFLENGTH: 7 bit unsigned
713    /                                               /
714    /                   AFDPART                     /    address family dependent
715    |                                               |
716    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
717    */
718 #define     TYPE_APL                        NU16(42)    /* APL                              rfc 3123 */
719 /*
720                                    1  1  1  1  1  1
721      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
722    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
723    |                    KEY TAG                    |    16 bit
724    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
725    |       ALGORITHM       |       DIGEST TYPE     |    ALGORITHM: 8 bit, DIGEST TYPE: 8 bit
726    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
727    /                                               /
728    /                      DIGEST                   /    digest dependent
729    /                                               /
730    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
731    */
732 #define     TYPE_DS                         NU16(43)    /* Delegation Signer                rfc 4034 rfc 3658 */
733 /*
734                                    1  1  1  1  1  1
735      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
736    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
737    |       ALGORITHM       |        FP TYPE        |    ALGORITHM: 8 bit, FP TYPE: 8 bit
738    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
739    /                                               /
740    /                  FINGERPRINT                  /
741    /                                               /
742    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
743    */
744 #define     TYPE_SSHFP                      NU16(44)    /* SSH Key Fingerprint              rfc 4255 */
745 /*
746                                    1  1  1  1  1  1
747      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
748    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
749    |       PRECEDENCE      |     GATEWAY TYPE      |    PRECEDENCE: 8 bit, GATEWAY TYPE: 8 bit
750    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
751    |        ALGORITHM      |                       |    ALGORITHM: 8 bit
752    +--+--+--+--+--+--+--+--+                       |
753    |                   GATEWAY                     |    GATEWAY: 32 bit IPv4 / 128 bit IPv6 / uncompressed domain name
754    /                                               /
755    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
756    /                                               /
757    /                    PUBLIC KEY                 /
758    /                                               /
759    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
760    */
761 #define     TYPE_IPSECKEY                   NU16(45)    /* IPSECKEY                         rfc 4025 */
762 /*
763                                    1  1  1  1  1  1
764      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
765    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
766    |                  TYPE COVERED                 |    16 bit unsigned integer
767    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
768    |      ALGORITHM        |        LABELS         |
769    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
770    |                   ORIGINAL TTL                |    32 bit
771    |                                               |
772    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
773    |                 SIGNATURE EXPIRATION          |    32 bit
774    |                                               |
775    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
776    |                 SIGNATURE INCEPTION           |    32 bit
777    |                                               |
778    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
779    |                     KEY TAG                   |    16 bit unsigned integer
780    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
781    /                  SIGNER'S NAME                /
782    /                                               /
783    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
784    /                                               /
785    /                    SIGNATURE                  /
786    /                                               /
787    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
788    */
789 #define     TYPE_RRSIG                      NU16(46)    /* RRSIG                            rfc 4034 rfc 3755 */
790 /*
791                                    1  1  1  1  1  1
792      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
793    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
794    /              NEXT DOMAIN NAME                 /
795    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
796    /               TYPE NIT MAPS                   /
797    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
798    */
799 #define     TYPE_NSEC                       NU16(47)    /* NSEC                             rfc 4034 rfc 3755 */
800 /*
801                                    1  1  1  1  1  1
802      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
803    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
804    |                   FLAGS                       |    16 bit
805    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
806    |        PROTOCOL       |       ALGORITHM       |    PROTOCOL: 8 bit, ALGORITHM: 8 bit
807    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
808    /                                               /
809    /                   PUBLIC KEY                  /
810    /                                               /
811    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
812    */
813 #define     TYPE_DNSKEY                     NU16(48)    /* DNSKEY                           rfc 4034 rfc 3755 */
814 /*
815                                    1  1  1  1  1  1
816      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
817    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
818    |               IDENTIFIER TYPE                 |    16 bit
819    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
820    |      DIGEST TYPE      |                       /    8 bit
821    +--+--+--+--+--+--+--+--+                       /
822    /                    DIGEST                     /    dependent on the digest type
823    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
824    */
825 #define     TYPE_DHCID                      NU16(49)    /* DHCID                            rfc 4701 */
826 /*
827                                    1  1  1  1  1  1
828      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
829    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
830    |     HASH ALGORITHM    |         FLAGS         |    HASH ALGORITHM: 8 bit, FLAGS: 8 bit
831    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
832    |                   ITERATIONS                  |    16 bit unsigned integer
833    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
834    |      SALT LENGTH      |                       /    8 bit unsigned integer
835    +--+--+--+--+--+--+--+--+                       /
836    /                     SALT                      /    Can be zero length
837    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
838    |      HASH LENGTH      |                       /    8 bit unsigned integer
839    +--+--+--+--+--+--+--+--+                       /
840    /            NEXT HASHED OWNER NAME             /    unmodified binary hash value.
841    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
842    /                 TYPE BIT MAPS                 /
843    /                                               /
844    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
845    */
846 /* Flags
847     0 1 2 3 4 5 6 7
848    +-+-+-+-+-+-+-+-+
849    |             |O|
850    +-+-+-+-+-+-+-+-+
851                   ^
852                OPT-OUT flag
853    */
854 #define     TYPE_NSEC3                      NU16(50)    /* NSEC3                            rfc 5155 */
855 /*
856                                    1  1  1  1  1  1
857      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
858    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
859    |     HASH ALGORITHM    |         FLAGS         |    HASH ALGORITHM: 8 bit, FLAGS: 8 bit
860    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
861    |                   ITERATIONS                  |    16 bit unsigned integer
862    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
863    |      SALT LENGTH      |                       /    8 bit unsigned integer
864    +--+--+--+--+--+--+--+--+                       /
865    /                     SALT                      /    Can be zero length
866    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
867    */
868 #define     TYPE_NSEC3PARAM                 NU16(51)    /* NSEC3PARAM                       rfc 5155 */
869 /*
870                                    1  1  1  1  1  1
871      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
872    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
873    |   CERTIFICATE USAGE   |        SELECTOR       |    CERTIFICATE USAGE: 8 bit, SELECTOR: 8 bit
874    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
875    /      MATCHING TYPE    |                       /
876    +--+--+--+--+--+--+--+--+                       /
877    /                                               /
878    /          CERTIFICATE ASSOCIATION DATA         /
879    /                                               /
880    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
881    */
882 #define     TYPE_TLSA                       NU16(52)    /* TLSA                             rfc 6698 */
883 /*
884                                    1  1  1  1  1  1
885      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
886    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
887    |        HIT LENGTH     |     PK ALGORITHM      |    HIT LENGTH: 8 bit unsigned integer,
888    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+    PK ALGORITHM: 8 bit unsigned integer
889    |                   PK LENGTH                   |    PK LENTH: 16 bit unsigned integer
890    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
891    /                                               /
892    /                      HIT                      /    binary value in network order
893    /                                               /
894    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
895    /                                               /
896    /                  PUBLIC KEY                   /    dependent on the type
897    /                                               /
898    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
899    /                                               /
900    /                RENDEZVOUS SERVERS             /    dns formatted domain name
901    /                                               /
902    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
903    */
904 #define     TYPE_HIP                        NU16(55)    /* Host Identity Protocol           rfc 5205 */
905 /*
906                                    1  1  1  1  1  1
907      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
908    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
909    /                 NINFO-DATA                    /    one or more c-strings
910    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
911    */
912 #define     TYPE_NINFO                      NU16(56)    /* NINFO                            @note undocumented see draft-reid-dnsext-zs-01.txt */
913 /*
914                                    1  1  1  1  1  1
915      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
916    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
917    |                   FLAGS                       |    16 bit: (value 0)
918    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
919    |        PROTOCOL       |       ALGORITHM       |    PROTOCOL: 8 bit (value 1), ALGORITHM: 8 bit
920    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
921    /                                               /
922    /                   PUBLIC KEY                  /
923    /                                               /
924    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
925    */
926 #define     TYPE_RKEY                       NU16(57)    /* RKEY                             @note undocumented see draft-reid-dnsext-rkey-00.txt */
927 /*
928                                    1  1  1  1  1  1
929      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
930    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
931    /             TALINK START/PREVIOUS             /    dns formatted domain name
932    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
933    /               TALINK NEXT/END                 /    dns formatted domain name
934    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
935    */
936 #define     TYPE_TALINK                     NU16(58)    /* Trust Anchor LINK                @note undocumented see talink-completed-template */
937 /*
938                                    1  1  1  1  1  1
939      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
940    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
941    |                    KEY TAG                    |    16 bit
942    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
943    |       ALGORITHM       |       DIGEST TYPE     |    ALGORITHM: 8 bit, DIGEST TYPE: 8 bit
944    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
945    /                                               /
946    /                      DIGEST                   /    digest dependent
947    /                                               /
948    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
949    */
950 #define     TYPE_CDS                        NU16(59)    /* Child DS                         rfc 7344 */
951 /*
952                                    1  1  1  1  1  1
953      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
954    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
955    |                   FLAGS                       |    16 bit
956    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
957    |        PROTOCOL       |       ALGORITHM       |    PROTOCOL: 8 bit, ALGORITHM: 8 bit
958    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
959    /                                               /
960    /                   PUBLIC KEY                  /
961    /                                               /
962    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
963    */
964 #define     TYPE_CDNSKEY                    NU16(60)    /* DNSKEY(s) the Child wants reflected in DS rfc 7344 */
965 /*
966 
967                                    1  1  1  1  1  1
968      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
969    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
970    /                                               /
971    /             OPENPGP PUBLIC KEY                /    single OpenPGP public key as defined in Section 5.5.1.1 of [RFC4880].
972    /                                               /    without ASCII armor or base64 encoding
973    /                                               /
974    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
975 
976    */
977 #define     TYPE_OPENPGPKEY                 NU16(61)    /* OpenPGP Key                      @note undocumented see draft-ietf-dane-openpgpkey-03 */
978 
979 /*
980                                    1  1  1  1  1  1
981      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
982    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
983    |                  SOA SERIAL                   |    32 bit
984    |                                               |
985    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
986    |                    FLAGS                      |    16 bit
987    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
988    /                TYPE BIT MAP                   /
989    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
990    */
991 #define     TYPE_CSYNC                      NU16(62)    /* Child-To-Parent Synchronization  rfc 7477 */
992 
993 /*
994                                    1  1  1  1  1  1
995      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
996    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
997    /                   SPF-DATA                    /    one or more c-strings
998    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
999    */
1000 #define     TYPE_SPF                        NU16(99)    /* SPF                                rfc7208 */
1001 
1002 #define     TYPE_UINFO                      NU16(100)   /* IANA-Reserved */
1003 #define     TYPE_UID                        NU16(101)   /* IANA-Reserved */
1004 #define     TYPE_GID                        NU16(102)   /* IANA-Reserved */
1005 #define     TYPE_UNSPEC                     NU16(103)   /* IANA-Reserved */
1006 
1007 /*
1008                                    1  1  1  1  1  1
1009      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1010    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1011    |                  PREFERENCE                   |    16 bit unsigned integer
1012    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1013    |                                               |
1014    |                    NODEID                     |    64 bit
1015    |                                               |
1016    |                                               |
1017    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1018    */
1019 #define     TYPE_NID                        NU16(104)   /* NODE ID                          rfc 6742 */
1020 /*
1021                                    1  1  1  1  1  1
1022      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1023    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1024    |                  PREFERENCE                   |    16 bit unsigned integer
1025    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1026    |                   LOCATOR32                   |    32 bit unsigned integer
1027    |                                               |
1028    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1029    */
1030 #define     TYPE_L32                        NU16(105)   /* LOCATOR 32                       rfc 6742 */
1031 /*
1032                                    1  1  1  1  1  1
1033      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1034    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1035    |                  PREFERENCE                   |    16 bit unsigned integer
1036    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1037    |                                               |
1038    |                   LOCATOR64                   |    64 bit unsigned integer
1039    |                                               |
1040    |                                               |
1041    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1042    */
1043 #define     TYPE_L64                        NU16(106)   /* LOCATOR 64                       rfc 6742 */
1044 /*
1045                                    1  1  1  1  1  1
1046      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1047    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1048    |                  PREFERENCE                   |    16 bit unsigned integer
1049    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1050    /                     FQDN                      /    dns formatted domain name
1051    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1052    */
1053 #define     TYPE_LP                         NU16(107)   /* LOCATOR POINTER                  rfc 6742 */
1054 /*
1055                                    1  1  1  1  1  1
1056      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1057    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1058    |                                               |
1059    |                EUI-48 ADDRESS                 |    48 bit (MUST be represented as six two-digit hexadecimal
1060    |                                               |            numbers separated by hyphens)
1061    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1062  */
1063 #define     TYPE_EUI48                      NU16(108)   /* EUI-48 address                   rfc 7043 */
1064 /*
1065                                    1  1  1  1  1  1
1066      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1067    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1068    |                                               |
1069    |                EUI-64 ADDRESS                 |    64 bit (MUST be represented as six two-digit hexadecimal
1070    |                                               |            numbers separated by hyphens)
1071    |                                               |
1072    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1073  */
1074 #define     TYPE_EUI64                      NU16(109)   /* EUI-64 address                   rfc 7043 */
1075 
1076 /*
1077                                    1  1  1  1  1  1
1078      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1079    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1080    /                  ALGORITHM                    /    algorithm in dns formatted domain name
1081    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1082    |                  INCEPTION                    |    32 bit unsigned integer
1083    |                                               |
1084    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1085    |                  EXPIRATION                   |    32 bit unsigned integer
1086    |                                               |
1087    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1088    |                     MODE                      |    16 bit unsigned integer
1089    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1090    |                     ERROR                     |    16 bit unsigned integer
1091    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1092    |                    KEY SIZE                   |    16 bit unsigned integer
1093    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1094    /                    KEY DATA                   /
1095    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1096    |                   OTHER SIZE                  |    16 bit unsigned integer
1097    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1098    /                   OTHER DATA                  /
1099    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1100    */
1101 #define     TYPE_TKEY                       NU16(249)   /* Transaction Key                  rfc 2930 */
1102 /*
1103                                    1  1  1  1  1  1
1104      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1105    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1106    /                  ALGORITHM                    /    algorithm in dns formatted domain name
1107    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1108    |                                               |
1109    |                  INCEPTION                    |    48 bit unsigned integer
1110    |                                               |
1111    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1112    |                     FUDGE                     |    16 bit unsigned integer
1113    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1114    |                    MAC SIZE                   |    16 bit unsigned integer
1115    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1116    /                      MAC                      /
1117    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1118    |                  ORIGINAL ID                  |    16 bit unsigned integer
1119    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1120    |                     ERROR                     |    16 bit unsigned integer
1121    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1122    |                   OTHER SIZE                  |    16 bit unsigned integer
1123    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1124    /                   OTHER DATA                  /
1125    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1126    */
1127 #define     TYPE_TSIG                       NU16(250)   /* Transaction Signature            rfc 2845 */
1128 #define     TYPE_IXFR                       NU16(251)   /* Incremental Transfer             rfc 1995 */
1129 #define     TYPE_AXFR                       NU16(252)   /* Transfer of an entire zone       rfc 1035 rfc 5936 */
1130 #define     TYPE_MAILB                      NU16(253)   /* A request for mailbox-related records (MB, MG or MR) rfc 1035 */
1131 #define     TYPE_MAILA                      NU16(254)   /* A request for mail agent RRs (Obsolete - see MX) rfc 1035 */
1132 #define     TYPE_ANY                        NU16(255)   /* a request for all records        rfc 1035 rfc 6895 */
1133 /*
1134                                    1  1  1  1  1  1
1135      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1136    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1137    |                  PRIORITY                     |   16 bit unsigned integer
1138    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1139    |                   WEIGHT                      |   16 bit unsigned integer
1140    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1141    /                                               /
1142    /                   TARGET                      /
1143    /                                               /
1144    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1145    */
1146 #define     TYPE_URI                        NU16(256)   /* URI                              @note undocumented see draft-faltstrom-uri-14 */
1147 /*
1148                                    1  1  1  1  1  1
1149      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1150    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1151    |         FLAGS         |       TAG LENGTH      |    FLAGS: 8 bit, TAG LENGTH: 8 bit unsigned integer
1152    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1153    /                      TAG                      /
1154    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1155    /                     VALUE                     /
1156    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1157    */
1158 #define     TYPE_CAA                        NU16(257)   /* Certification Authority Authorization rfc 6844 */
1159 
1160 
1161 #define     TYPE_AVC                        NU16(258)   // Visibility and control, no rfc yet
1162 
1163 /*
1164                                    1  1  1  1  1  1
1165      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1166    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1167    |                    KEY TAG                    |    16 bit
1168    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1169    |       ALGORITHM       |       DIGEST TYPE     |    ALGORITHM: 8 bit, DIGEST TYPE: 8 bit
1170    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1171    /                                               /
1172    /                      DIGEST                   /    digest dependent
1173    /                                               /
1174    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1175    */
1176 #define     TYPE_TA                         NU16(32768) /* DNSSEC Trust Authorities         @note undocumented see Deploying DNSSEC Without a Signed Root */
1177 /*
1178                                    1  1  1  1  1  1
1179      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
1180    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1181    |                    KEY TAG                    |    16 bit
1182    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1183    |       ALGORITHM       |       DIGEST TYPE     |    ALGORITHM: 8 bit, DIGEST TYPE: 8 bit
1184    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1185    /                                               /
1186    /                      DIGEST                   /    digest dependent
1187    /                                               /
1188    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1189    */
1190 #define     TYPE_DLV                        NU16(32769) /* DNSSEC Lookaside Validation      rfc 4431 */
1191 
1192 #define     TYPE_PRIVATE_FIRST              NU16(65280)
1193 #define     TYPE_PRIVATE_LAST               NU16(65534)
1194 
1195 #define     HOST_CLASS_IN                   1             /* the Internet                      rfc 1025 */
1196 
1197 #define     CLASS_IN                        NU16(HOST_CLASS_IN) /* the Internet                rfc 1025 */
1198 #define     CLASS_CS                        NU16(2)       /* CSNET class                       rfc 1025 */
1199 #define     CLASS_CH                        NU16(3)       /* the CHAOS class                   rfc 1025 */
1200 #define     CLASS_HS                        NU16(4)       /* Hesiod                            rfc 1025 */
1201 #define     CLASS_CTRL                      NU16(0x2A)    /* @note Yadifa controller class */
1202 
1203 #if HAS_WHOIS
1204 #define     CLASS_WHOIS                     NU16(0x2B)    /* @note WHOIS class */
1205 #endif  // HAS_WHOIS
1206 
1207 #define     CLASS_NONE                      NU16(254)     /* rfc 2136                          rfc 2136 */
1208 #define     CLASS_ANY                       NU16(255)     /* rfc 1035  QCLASS ONLY             rfc 1025 */
1209 
1210 
1211 /* -----------------------------------------------------------------*/
1212 
1213 #define     AXFR_TSIG_PERIOD                100
1214 
1215 /* -----------------------------------------------------------------*/
1216 
1217 #ifdef WORDS_BIGENDIAN
1218 #define     DNSKEY_FLAG_KEYSIGNINGKEY       0x0001
1219 #define     DNSKEY_FLAG_ZONEKEY             0x0100
1220 #else
1221 #define     DNSKEY_FLAG_KEYSIGNINGKEY       0x0100
1222 #define     DNSKEY_FLAG_ZONEKEY             0x0001
1223 #endif
1224 
1225 #define     DNSKEY_PROTOCOL_FIELD               3       /* MUST be this */
1226 
1227 #define     DNSKEY_ALGORITHM_RSAMD5             1       // DEPRECATED
1228 #define     DNSKEY_ALGORITHM_DIFFIE_HELLMAN     2       // NOT USED
1229 #define     DNSKEY_ALGORITHM_DSASHA1            3
1230 #define     DNSKEY_ALGORITHM_RSASHA1            5
1231 #define     DNSKEY_ALGORITHM_DSASHA1_NSEC3      6
1232 #define     DNSKEY_ALGORITHM_RSASHA1_NSEC3      7
1233 #define     DNSKEY_ALGORITHM_RSASHA256_NSEC3    8       /* RFC 5702 */
1234 #define     DNSKEY_ALGORITHM_RSASHA512_NSEC3   10       /* RFC 5702 */
1235 #define     DNSKEY_ALGORITHM_GOST              12       /* RFC 5933, not supported by YADIFA */
1236 #define     DNSKEY_ALGORITHM_ECDSAP256SHA256   13       /* RFC 6605 */
1237 #define     DNSKEY_ALGORITHM_ECDSAP384SHA384   14       /* RFC 6605 */
1238 #define     DNSKEY_ALGORITHM_ED25519           15       /* RFC 8080 */
1239 #define     DNSKEY_ALGORITHM_ED448             16       /* RFC 8080 */
1240 
1241 #define     DS_DIGEST_SHA1                      1
1242 #define     DS_DIGEST_SHA256                    2
1243 
1244 #define     NSEC3_FLAGS_OPTOUT                  1           /*  */
1245 
1246 #define     DNSKEY_ALGORITHM_RSAMD5_NAME             "RSAMD5"               /* RFC 4034 */ // RSA // DEPRECATED
1247 #define     DNSKEY_ALGORITHM_DIFFIE_HELLMAN_NAME     "DH"                   /* RFC 2539 */ // NOT USED
1248 #define     DNSKEY_ALGORITHM_DSASHA1_NAME            "DSA"                  /* RFC 3755 */
1249 #define     DNSKEY_ALGORITHM_RSASHA1_NAME            "RSASHA1"              /* RFC 4034 */
1250 #define     DNSKEY_ALGORITHM_DSASHA1_NSEC3_NAME      "DSA-NSEC3-SHA1"       /* RFC 5155 */ // NSEC3DSA"
1251 #define     DNSKEY_ALGORITHM_RSASHA1_NSEC3_NAME      "RSASHA1-NSEC3-SHA1"   /* RFC 5155 */ // NSEC3RSASHA1
1252 #define     DNSKEY_ALGORITHM_RSASHA256_NSEC3_NAME    "RSASHA256"            /* RFC 5702 */
1253 #define     DNSKEY_ALGORITHM_RSASHA512_NSEC3_NAME    "RSASHA512"            /* RFC 5702 */
1254 #define     DNSKEY_ALGORITHM_GOST_NAME               "ECC-GOST" // GOST     /* RFC 5933 */ // not supported by YADIFA
1255 #define     DNSKEY_ALGORITHM_ECDSAP256SHA256_NAME    "ECDSAP256SHA256"      /* RFC 6605 */
1256 #define     DNSKEY_ALGORITHM_ECDSAP384SHA384_NAME    "ECDSAP384SHA384"      /* RFC 6605 */
1257 #define     DNSKEY_ALGORITHM_ED25519_NAME            "ED25519"              /* RFC 8080 */
1258 #define     DNSKEY_ALGORITHM_ED448_NAME              "ED448"                /* RFC 8080 */
1259 
1260 #define     DNSKEY_ALGORITHM_DSASHA1_NSEC3_NAME2     "NSEC3DSA"
1261 #define     DNSKEY_ALGORITHM_RSASHA1_NSEC3_NAME2     "NSEC3RSASHA1"
1262 
1263 #ifdef DNSKEY_ALGORITHM_DUMMY
1264 #define     DNSKEY_ALGORITHM_DUMMY_NAME "DUMMY"
1265 #endif
1266 
1267 #define     IS_TYPE_PRIVATE(t)              (((t) >= 65280) && ( (t) <= 65534))
1268 #define     IS_TYPE_NPRIVATE(t)             ((NU16(t) >= 65280) && ( NU16(t) <= 65534))
1269 
1270 /*
1271  *      STRUCTS
1272  */
1273 
1274 #define EDNS0_RECORD_SIZE                   11
1275 
1276 /* rfc 2671 */
1277 struct edns0_data
1278 {
1279     u8                 domain_name;    /* must be empty            */
1280     u16                        opt;
1281     u16               payload_size;
1282     u8              extended_rcode;    /* extended rcode and flags */
1283     u8                     version;    /* extended rcode and flags */
1284     u8                      z_bits;    /* extended rcode and flags */
1285     u8                 option_code;
1286     u16              option_length;
1287 };
1288 
1289 typedef struct edns0_data edns0_data;
1290 
1291 /* - */
1292 
1293 typedef struct value_name_table value_name_table;
1294 
1295 struct value_name_table
1296 {
1297     u32                        id;
1298     char                    *data;
1299 };
1300 
1301 
1302 typedef value_name_table class_table;
1303 typedef value_name_table type_table;
1304 typedef value_name_table dnssec_algo_table;
1305 
1306 typedef struct message_header message_header;
1307 
1308 struct message_header
1309 {
1310     u16                         id;
1311     u8                      opcode;
1312     u8                       flags;
1313     u16                    qdcount;
1314     u16                    ancount;
1315     u16                    nscount;
1316     u16                    arcount;
1317 };
1318 
1319 /*    ------------------------------------------------------------    */
1320 
1321 #define     CLASS_IN_NAME                   "IN"
1322 #define     CLASS_CS_NAME                   "CS"
1323 #define     CLASS_CH_NAME                   "CH"
1324 #define     CLASS_HS_NAME                   "HS"
1325 #define     CLASS_CTRL_NAME                 "CTRL"  /* @note YADIFA's personal class, maybe one day in a RFC */
1326 
1327 #if HAS_WHOIS
1328 #define     CLASS_WHOIS_NAME                "WHOIS"
1329 #endif // HAS_WHOIS
1330 
1331 #define     CLASS_NONE_NAME                 "NONE"
1332 #define     CLASS_ANY_NAME                  "ANY"
1333 
1334 extern const class_table qclass[];
1335 
1336 #define     TYPE_A_NAME                     "A"
1337 #define     TYPE_NS_NAME                    "NS"
1338 #define     TYPE_MD_NAME                    "MD"
1339 #define     TYPE_MF_NAME                    "MF"
1340 #define     TYPE_CNAME_NAME                 "CNAME"
1341 #define     TYPE_SOA_NAME                   "SOA"
1342 #define     TYPE_MB_NAME                    "MB"
1343 #define     TYPE_MG_NAME                    "MG"
1344 #define     TYPE_MR_NAME                    "MR"
1345 #define     TYPE_NULL_NAME                  "NULL"
1346 #define     TYPE_WKS_NAME                   "WKS"
1347 #define     TYPE_PTR_NAME                   "PTR"
1348 #define     TYPE_HINFO_NAME                 "HINFO"
1349 #define     TYPE_MINFO_NAME                 "MINFO"
1350 #define     TYPE_MX_NAME                    "MX"
1351 #define     TYPE_TXT_NAME                   "TXT"
1352 #define     TYPE_RP_NAME                    "RP"
1353 #define     TYPE_AFSDB_NAME                 "AFSDB"
1354 #define     TYPE_X25_NAME                   "X25"
1355 #define     TYPE_ISDN_NAME                  "ISDN"
1356 #define     TYPE_RT_NAME                    "RT"
1357 #define     TYPE_NSAP_NAME                  "NSAP"
1358 #define     TYPE_NSAP_PTR_NAME              "NSAP-PTR"
1359 #define     TYPE_SIG_NAME                   "SIG"
1360 #define     TYPE_KEY_NAME                   "KEY"
1361 #define     TYPE_PX_NAME                    "PX"
1362 #define     TYPE_GPOS_NAME                  "GPOS"
1363 #define     TYPE_AAAA_NAME                  "AAAA"
1364 #define     TYPE_LOC_NAME                   "LOC"
1365 #define     TYPE_NXT_NAME                   "NXT"
1366 #define     TYPE_EID_NAME                   "EID"       /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1367 #define     TYPE_NIMLOC_NAME                "NIMLOC"    /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1368 #define     TYPE_SRV_NAME                   "SRV"
1369 #define     TYPE_ATMA_NAME                  "ATMA"
1370 #define     TYPE_NAPTR_NAME                 "NAPTR"
1371 #define     TYPE_KX_NAME                    "KX"
1372 #define     TYPE_CERT_NAME                  "CERT"
1373 #define     TYPE_A6_NAME                    "A6"
1374 #define     TYPE_DNAME_NAME                 "DNAME"
1375 #define     TYPE_SINK_NAME                  "SINK"      /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1376 #define     TYPE_OPT_NAME                   "OPT"
1377 #define     TYPE_APL_NAME                   "APL"
1378 #define     TYPE_DS_NAME                    "DS"
1379 #define     TYPE_SSHFP_NAME                 "SSHFP"
1380 #define     TYPE_IPSECKEY_NAME              "IPSECKEY"
1381 #define     TYPE_RRSIG_NAME                 "RRSIG"
1382 #define     TYPE_NSEC_NAME                  "NSEC"
1383 #define     TYPE_DNSKEY_NAME                "DNSKEY"
1384 #define     TYPE_DHCID_NAME                 "DHCID"
1385 #define     TYPE_NSEC3_NAME                 "NSEC3"
1386 #define     TYPE_NSEC3PARAM_NAME            "NSEC3PARAM"
1387 #define     TYPE_TLSA_NAME                  "TLSA"
1388 #define     TYPE_HIP_NAME                   "HIP"
1389 #define     TYPE_NINFO_NAME                 "NINFO"     /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1390 #define     TYPE_RKEY_NAME                  "RKEY"      /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1391 #define     TYPE_TALINK_NAME                "TALINK"    /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1392 #define     TYPE_CDS_NAME                   "CDS"
1393 #define     TYPE_CDNSKEY_NAME               "CDNSKEY"
1394 #define     TYPE_OPENPGPKEY_NAME            "OPENPGPKEY"
1395 #define     TYPE_CSYNC_NAME                 "CSYNC"
1396 #define     TYPE_SPF_NAME                   "SPF"
1397 #define     TYPE_UINFO_NAME                 "UINFO"
1398 #define     TYPE_UID_NAME                   "UID"
1399 #define     TYPE_GID_NAME                   "GID"
1400 #define     TYPE_UNSPEC_NAME                "UNSPEC"
1401 #define     TYPE_NID_NAME                   "NID"
1402 #define     TYPE_L32_NAME                   "L32"
1403 #define     TYPE_L64_NAME                   "L64"
1404 #define     TYPE_LP_NAME                    "LP"
1405 #define     TYPE_EUI48_NAME                 "EUI48"
1406 #define     TYPE_EUI64_NAME                 "EUI64"
1407 
1408 #define     TYPE_TKEY_NAME                  "TKEY"
1409 #define     TYPE_TSIG_NAME                  "TSIG"
1410 #define     TYPE_IXFR_NAME                  "IXFR"
1411 #define     TYPE_AXFR_NAME                  "AXFR"
1412 #define     TYPE_MAILB_NAME                 "MAILB"
1413 #define     TYPE_MAILA_NAME                 "MAILA"
1414 #define     TYPE_ANY_NAME                   "ANY"  /** @note type ANY's string was set to '*' ?
1415                                                     *  Setting this to anything else will break
1416                                                     *        dnsformat:358
1417                                                     */
1418 #define     TYPE_URI_NAME                   "URI"       /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1419 #define     TYPE_CAA_NAME                   "CAA"       /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1420 #define     TYPE_AVC_NAME                   "AVC"   /* visibility and control */
1421 
1422 #define     TYPE_TA_NAME                    "TA"        /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1423 #define     TYPE_DLV_NAME                   "DLV"
1424 
1425 #define     OPT_NSID                        3       // the option value for NSID
1426 
1427 extern const type_table qtype[];
1428 
1429 /**
1430  * Static asciiz representation of a dns class
1431  *
1432  * @param c
1433  * @return the c-string
1434  */
1435 
1436 const char *dns_class_get_name(u16 c);
1437 
1438 /**
1439  * Static asciiz representation of a dns type
1440  *
1441  * @param c
1442  * @return the c-string
1443  */
1444 
1445 const char *dns_type_get_name(u16 t);
1446 
1447 /** \brief Get the numeric value of a class (network order) from its name
1448  *
1449  *  @param[in]  src the name of the class
1450  *  @param[out] dst value of the class, network order
1451  *
1452  *  @retval OK
1453  *  @retval NOK
1454  */
1455 int dns_class_from_name(const char *src, u16 *dst);
1456 
1457 /** \brief Get the numeric value of a class (network order) from its name
1458  *  Case insensitive
1459  *
1460  *  @param[in]  src the name of the class (case insensitive)
1461  *  @param[out] dst value of the class, network order
1462  *
1463  *  @retval OK
1464  *  @retval NOK
1465  */
1466 int dns_class_from_case_name(const char *src, u16 *dst);
1467 
1468 /** \brief Get the numeric value of a type (network order) from its name
1469  *
1470  *  @param[in]  src the name of the type
1471  *  @param[out] dst value of the type, network order
1472  *
1473  *  @retval OK
1474  *  @retval NOK
1475  */
1476 int dns_type_from_name(const char *src, u16 *dst);
1477 
1478 /** \brief Get the numeric value of a type (network order) from its name
1479  *  Case insensitive
1480  *
1481  *  @param[in]  src the name of the type (case insensitive)
1482  *  @param[out] dst value of the type, network order
1483  *
1484  *  @retval OK
1485  *  @retval NOK
1486  */
1487 int dns_type_from_case_name(const char *src, u16 *dst);
1488 
1489 int dns_type_from_case_name_length(const char *src, int src_len, u16 *dst);
1490 
1491 /**
1492  * @brief Case-insensitive search for the name in the table, returns the value
1493  *
1494  * @param table the name->value table
1495  * @param name the name to look for
1496  * @param out_value a pointer to an u32 that will hold the value in case of a match
1497  *
1498  * @return SUCCESS iff the name was matched
1499  */
1500 ya_result value_name_table_get_value_from_casename(const value_name_table *table, const char *name, u32 *out_value);
1501 ya_result value_name_table_get_name_from_value(const value_name_table *table, u32 value, const char** out_name);
1502 
1503 const char* dns_encryption_algorithm_get_name(u16 d);
1504 int dns_encryption_algorithm_from_name(const char *src, u8 *dst);
1505 int dns_encryption_algorithm_from_case_name(const char *src, u8 *dst);
1506 
1507 /**
1508  * @brief Static asciiz representation of a dns opcode
1509  *
1510  * @param c
1511  *
1512  * @return the c-string
1513  */
1514 const char *dns_message_opcode_get_name(u16 c);
1515 
1516 /**
1517  * @brief Static asciiz representation of a dns rcode
1518  *
1519  * @param c
1520  *
1521  * @return the c-string
1522  */
1523 const char *dns_message_rcode_get_name(u16 c);
1524 
1525 #if DNSCORE_HAS_NSID_SUPPORT
1526 
1527 #ifndef DNSCORE_RFC_C
1528 extern u32 edns0_record_size;
1529 extern u8 *edns0_rdatasize_nsid_option_wire;
1530 extern u32 edns0_rdatasize_nsid_option_wire_size;
1531 #endif
1532 
1533 void edns0_set_nsid(u8 *bytes, u16 size);
1534 #endif
1535 
1536 ya_result protocol_name_to_id(const char* name, int *out_port);
1537 ya_result protocol_id_to_name(int proto, char *name, size_t name_len);
1538 
1539 ya_result server_name_to_port(const char* name, int *out_value);
1540 ya_result server_port_to_name(int port, char *name, size_t name_len);
1541 
1542 /*
1543  * SOA
1544  */
1545 
1546 ya_result rr_soa_get_serial(const u8* rdata, u16 rdata_size, u32* out_serial);
1547 ya_result rr_soa_increase_serial(u8* rdata, u16 rdata_size, u32 increment);
1548 ya_result rr_soa_set_serial(u8* rdata, u16 rdata_size, u32 increment);
1549 
1550 ya_result rr_soa_get_minimumttl(const u8* rdata, u16 rdata_size, s32* out_minimum_ttl);
1551 
rrsig_get_type_covered_from_rdata(const void * rdata,u16 rdata_size)1552 static inline u16 rrsig_get_type_covered_from_rdata(const void *rdata, u16 rdata_size)
1553 {
1554     u16 tc = TYPE_NONE;
1555     if(rdata_size >= 2)
1556     {
1557         tc = GET_U16_AT_P(rdata);
1558     }
1559     return tc;
1560 }
1561 
rrsig_get_algorithm_from_rdata(const void * rdata,u16 rdata_size)1562 static inline u8 rrsig_get_algorithm_from_rdata(const void *rdata, u16 rdata_size)
1563 {
1564     u8 a = 0;
1565     if(rdata_size >= 3)
1566     {
1567         a = ((const u8*)rdata)[2];
1568     }
1569     return a;
1570 }
1571 
rrsig_get_labels_from_rdata(const void * rdata,u16 rdata_size)1572 static inline u8 rrsig_get_labels_from_rdata(const void *rdata, u16 rdata_size)
1573 {
1574     u8 l = 0;
1575     if(rdata_size >= 4)
1576     {
1577         l = ((const u8*)rdata)[3];
1578     }
1579     return l;
1580 }
1581 
rrsig_get_original_ttl_from_rdata(const void * rdata,u16 rdata_size)1582 static inline s32 rrsig_get_original_ttl_from_rdata(const void *rdata, u16 rdata_size)
1583 {
1584     s32 ottl = 0;
1585     if(rdata_size >= 8)
1586     {
1587         ottl = ntohl(GET_U32_AT(((const u8*)rdata)[4]));
1588     }
1589     return ottl;
1590 }
1591 
rrsig_get_valid_until_from_rdata(const void * rdata,u16 rdata_size)1592 static inline u32 rrsig_get_valid_until_from_rdata(const void *rdata, u16 rdata_size)
1593 {
1594     u32 t = 0;
1595     if(rdata_size >= RRSIG_RDATA_HEADER_LEN)
1596     {
1597         t = ntohl(GET_U32_AT(((const u8*)rdata)[8]));
1598     }
1599     return t;
1600 }
1601 
rrsig_get_valid_from_from_rdata(const void * rdata,u16 rdata_size)1602 static inline u32 rrsig_get_valid_from_from_rdata(const void *rdata, u16 rdata_size)
1603 {
1604     u32 t = 0;
1605     if(rdata_size >= RRSIG_RDATA_HEADER_LEN)
1606     {
1607         t = ntohl(GET_U32_AT(((const u8*)rdata)[12]));
1608     }
1609     return t;
1610 }
1611 
rrsig_get_key_tag_from_rdata(const void * rdata,u16 rdata_size)1612 static inline u16 rrsig_get_key_tag_from_rdata(const void *rdata, u16 rdata_size)
1613 {
1614     u16 tag = 0;
1615     if(rdata_size >= RRSIG_RDATA_HEADER_LEN)
1616     {
1617         tag = ntohs(GET_U16_AT(((const u8*)rdata)[16]));
1618     }
1619     return tag;
1620 }
1621 
rrsig_get_signer_name_from_rdata(const void * rdata,u16 rdata_size)1622 static inline const u8* rrsig_get_signer_name_from_rdata(const void *rdata, u16 rdata_size)
1623 {
1624     const u8 *signer_name = NULL;
1625     if(rdata_size >= RRSIG_RDATA_HEADER_LEN)
1626     {
1627         signer_name = &((const u8*)rdata)[18];
1628     }
1629     return signer_name;
1630 }
1631 
1632 #endif /* RFC_H_ */
1633 
1634 /** @} */
1635 
1636