Home | History | Annotate | Line # | Download | only in dist
      1 /*
      2  * dns.c -- DNS definitions.
      3  *
      4  * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
      5  *
      6  * See LICENSE for the license.
      7  *
      8  */
      9 
     10 #include "config.h"
     11 
     12 #include <sys/types.h>
     13 #include <sys/socket.h>
     14 #include <netinet/in.h>
     15 #include <arpa/inet.h>
     16 #include <ctype.h>
     17 #include <netdb.h>
     18 #include <string.h>
     19 #ifdef HAVE_STRINGS_H
     20 #include <strings.h>
     21 #endif
     22 
     23 #include "dns.h"
     24 #include "rdata.h"
     25 
     26 /* Taken from RFC 1035, section 3.2.4.  */
     27 static lookup_table_type dns_rrclasses[] = {
     28 	{ CLASS_IN, "IN" },	/* the Internet */
     29 	{ CLASS_CS, "CS" },	/* the CSNET class (Obsolete) */
     30 	{ CLASS_CH, "CH" },	/* the CHAOS class */
     31 	{ CLASS_HS, "HS" },	/* Hesiod */
     32 	{ 0, NULL }
     33 };
     34 
     35 /* For a standard field, it is not optional, has no rdata field functions. */
     36 #define FIELD(name, size) { name, 0 /* is_optional */, size, NULL /* calc_len_func */, NULL /* calc_len_uncompressed_wire_func */ }
     37 
     38 /* For a field entry with all values, for optional fields, or with defined
     39  * rdata field functions. */
     40 #define FIELD_ENTRY(name, is_optional, size, calc_len_func, cal_len_uncompressed_wire_func ) { name, is_optional, size, calc_len_func, cal_len_uncompressed_wire_func }
     41 
     42 static const struct nsd_rdata_descriptor generic_rdata_fields[] = {
     43 	FIELD("", RDATA_REMAINDER)
     44 };
     45 
     46 static const struct nsd_rdata_descriptor a_rdata_fields[] = {
     47 	FIELD("address", 4)
     48 };
     49 
     50 static const struct nsd_rdata_descriptor ns_rdata_fields[] = {
     51 	FIELD("host", RDATA_COMPRESSED_DNAME)
     52 };
     53 
     54 static const struct nsd_rdata_descriptor md_rdata_fields[] = {
     55 	FIELD("madname", RDATA_UNCOMPRESSED_DNAME)
     56 };
     57 
     58 static const struct nsd_rdata_descriptor mf_rdata_fields[] = {
     59 	FIELD("madname", RDATA_UNCOMPRESSED_DNAME)
     60 };
     61 
     62 static const struct nsd_rdata_descriptor cname_rdata_fields[] = {
     63 	FIELD("host", RDATA_COMPRESSED_DNAME)
     64 };
     65 
     66 static const struct nsd_rdata_descriptor soa_rdata_fields[] = {
     67 	FIELD("primary", RDATA_COMPRESSED_DNAME),
     68 	FIELD("mailbox", RDATA_COMPRESSED_DNAME),
     69 	FIELD("serial", 4),
     70 	FIELD("refresh", 4),
     71 	FIELD("retry", 4),
     72 	FIELD("expire", 4),
     73 	FIELD("minimum", 4)
     74 };
     75 
     76 static const struct nsd_rdata_descriptor mb_rdata_fields[] = {
     77 	FIELD("madname", RDATA_COMPRESSED_DNAME)
     78 };
     79 
     80 static const struct nsd_rdata_descriptor mg_rdata_fields[] = {
     81 	FIELD("mgmname", RDATA_COMPRESSED_DNAME)
     82 };
     83 
     84 static const struct nsd_rdata_descriptor mr_rdata_fields[] = {
     85 	FIELD("newname", RDATA_COMPRESSED_DNAME)
     86 };
     87 
     88 static const struct nsd_rdata_descriptor wks_rdata_fields[] = {
     89 	FIELD("address", 4),
     90 	FIELD("protocol", 1),
     91 	FIELD("bitmap", RDATA_REMAINDER)
     92 };
     93 
     94 static const struct nsd_rdata_descriptor ptr_rdata_fields[] = {
     95 	FIELD("ptrdname", RDATA_COMPRESSED_DNAME)
     96 };
     97 
     98 static const struct nsd_rdata_descriptor hinfo_rdata_fields[] = {
     99 	FIELD("cpu", RDATA_STRING),
    100 	FIELD("os", RDATA_STRING)
    101 };
    102 
    103 static const struct nsd_rdata_descriptor minfo_rdata_fields[] = {
    104 	FIELD("rmailbx", RDATA_COMPRESSED_DNAME),
    105 	FIELD("emailbx", RDATA_COMPRESSED_DNAME)
    106 };
    107 
    108 static const struct nsd_rdata_descriptor mx_rdata_fields[] = {
    109 	FIELD("priority", 2),
    110 	FIELD("hostname", RDATA_COMPRESSED_DNAME)
    111 };
    112 
    113 static const struct nsd_rdata_descriptor txt_rdata_fields[] = {
    114 	FIELD("text", RDATA_REMAINDER)
    115 };
    116 
    117 static const struct nsd_rdata_descriptor rp_rdata_fields[] = {
    118 	FIELD("mailbox", RDATA_UNCOMPRESSED_DNAME),
    119 	FIELD("text", RDATA_UNCOMPRESSED_DNAME)
    120 };
    121 
    122 static const struct nsd_rdata_descriptor afsdb_rdata_fields[] = {
    123 	FIELD("subtype", 2),
    124 	FIELD("hostname", RDATA_UNCOMPRESSED_DNAME)
    125 };
    126 
    127 static const struct nsd_rdata_descriptor x25_rdata_fields[] = {
    128 	FIELD("address", RDATA_STRING)
    129 };
    130 
    131 static const struct nsd_rdata_descriptor isdn_rdata_fields[] = {
    132 	FIELD("address", RDATA_STRING),
    133 	FIELD_ENTRY("subaddress", 1, RDATA_STRING, NULL, NULL)
    134 };
    135 
    136 static const struct nsd_rdata_descriptor rt_rdata_fields[] = {
    137 	FIELD("preference", 2),
    138 	FIELD("hostname", RDATA_UNCOMPRESSED_DNAME)
    139 };
    140 
    141 static const struct nsd_rdata_descriptor nsap_rdata_fields[] = {
    142 	FIELD("address", RDATA_REMAINDER)
    143 };
    144 
    145 static const struct nsd_rdata_descriptor nsap_ptr_rdata_fields[] = {
    146 	FIELD("hostname", RDATA_STRING)
    147 };
    148 
    149 static const struct nsd_rdata_descriptor sig_rdata_fields[] = {
    150 	FIELD("sigtype", 2),
    151 	FIELD("algorithm", 1),
    152 	FIELD("labels", 1),
    153 	FIELD("origttl", 4),
    154 	FIELD("expire", 4),
    155 	FIELD("inception", 4),
    156 	FIELD("keytag", 2),
    157 	FIELD("signer", RDATA_LITERAL_DNAME),
    158 	FIELD("signature", RDATA_REMAINDER)
    159 };
    160 
    161 static const struct nsd_rdata_descriptor key_rdata_fields[] = {
    162 	FIELD("flags", 2),
    163 	FIELD("protocol", 1),
    164 	FIELD("algorithm", 1),
    165 	FIELD("publickey", RDATA_REMAINDER)
    166 };
    167 
    168 static const struct nsd_rdata_descriptor px_rdata_fields[] = {
    169 	FIELD("preference", 2),
    170 	FIELD("map822", RDATA_UNCOMPRESSED_DNAME),
    171 	FIELD("mapx400", RDATA_UNCOMPRESSED_DNAME)
    172 };
    173 
    174 static const struct nsd_rdata_descriptor gpos_rdata_fields[] = {
    175 	FIELD("latitude", RDATA_STRING),
    176 	FIELD("longitude", RDATA_STRING),
    177 	FIELD("altitude", RDATA_STRING)
    178 };
    179 
    180 static const struct nsd_rdata_descriptor aaaa_rdata_fields[] = {
    181 	FIELD("address", 16)
    182 };
    183 
    184 static const struct nsd_rdata_descriptor loc_rdata_fields[] = {
    185 	FIELD("version", 1),
    186 	FIELD("size", 1),
    187 	FIELD("horizontal precision", 1),
    188 	FIELD("vertical precision", 1),
    189 	FIELD("latitude", 4),
    190 	FIELD("longitude", 4),
    191 	FIELD("altitude", 4),
    192 };
    193 
    194 static const struct nsd_rdata_descriptor nxt_rdata_fields[] = {
    195 	FIELD("next domain name", RDATA_UNCOMPRESSED_DNAME),
    196 	FIELD("type bit map", RDATA_REMAINDER)
    197 };
    198 
    199 static const struct nsd_rdata_descriptor eid_rdata_fields[] = {
    200 	FIELD("end point identifier", RDATA_REMAINDER)
    201 };
    202 
    203 static const struct nsd_rdata_descriptor nimloc_rdata_fields[] = {
    204 	FIELD("nimrod locator", RDATA_REMAINDER)
    205 };
    206 
    207 static const struct nsd_rdata_descriptor srv_rdata_fields[] = {
    208 	FIELD("priority", 2),
    209 	FIELD("weight", 2),
    210 	FIELD("port", 2),
    211 	FIELD("target", RDATA_UNCOMPRESSED_DNAME)
    212 };
    213 
    214 static const struct nsd_rdata_descriptor atma_rdata_fields[] = {
    215 	FIELD("address", RDATA_REMAINDER)
    216 };
    217 
    218 static const struct nsd_rdata_descriptor naptr_rdata_fields[] = {
    219 	FIELD("order", 2),
    220 	FIELD("preference", 2),
    221 	FIELD("flags", RDATA_STRING),
    222 	FIELD("services", RDATA_STRING),
    223 	FIELD("regex", RDATA_STRING),
    224 	FIELD("replacement", RDATA_UNCOMPRESSED_DNAME)
    225 };
    226 
    227 static const struct nsd_rdata_descriptor kx_rdata_fields[] = {
    228 	FIELD("preference", 2),
    229 	FIELD("exchanger", RDATA_UNCOMPRESSED_DNAME)
    230 };
    231 
    232 static const struct nsd_rdata_descriptor cert_rdata_fields[] = {
    233 	FIELD("type", 2),
    234 	FIELD("key tag", 2),
    235 	FIELD("algorithm", 1),
    236 	FIELD("certificate", RDATA_REMAINDER)
    237 };
    238 
    239 static const struct nsd_rdata_descriptor a6_rdata_fields[] = {
    240 	FIELD("address", RDATA_REMAINDER)
    241 };
    242 
    243 static const struct nsd_rdata_descriptor dname_rdata_fields[] = {
    244 	FIELD("source", RDATA_UNCOMPRESSED_DNAME)
    245 };
    246 
    247 static const struct nsd_rdata_descriptor sink_rdata_fields[] = {
    248 	FIELD("coding", 1),
    249 	FIELD("subcoding", 1),
    250 	FIELD("data", RDATA_REMAINDER),
    251 };
    252 
    253 static const struct nsd_rdata_descriptor apl_rdata_fields[] = {
    254 	FIELD_ENTRY("prefix", 1, RDATA_REMAINDER, NULL, NULL)
    255 };
    256 
    257 static const struct nsd_rdata_descriptor ds_rdata_fields[] = {
    258 	FIELD("keytag", 2),
    259 	FIELD("algorithm", 1),
    260 	FIELD("digtype", 1),
    261 	FIELD("digest", RDATA_REMAINDER)
    262 };
    263 
    264 static const struct nsd_rdata_descriptor sshfp_rdata_fields[] = {
    265 	FIELD("algorithm", 1),
    266 	FIELD("ftype", 1),
    267 	FIELD("fingerprint", RDATA_REMAINDER)
    268 };
    269 
    270 static const struct nsd_rdata_descriptor ipseckey_rdata_fields[] = {
    271 	FIELD("precedence", 1),
    272 	FIELD("gateway type", 1),
    273 	FIELD("algorithm", 1),
    274 	FIELD_ENTRY("gateway", 0, RDATA_IPSECGATEWAY,
    275 		ipseckey_gateway_length, ipseckey_gateway_length),
    276 	FIELD_ENTRY("public key", 1, RDATA_REMAINDER, NULL, NULL)
    277 };
    278 
    279 static const struct nsd_rdata_descriptor rrsig_rdata_fields[] = {
    280 	FIELD("rrtype", 2),
    281 	FIELD("algorithm", 1),
    282 	FIELD("labels", 1),
    283 	FIELD("origttl", 4),
    284 	FIELD("expire", 4),
    285 	FIELD("inception", 4),
    286 	FIELD("keytag", 2),
    287 	FIELD("signer", RDATA_LITERAL_DNAME),
    288 	FIELD("signature", RDATA_REMAINDER)
    289 };
    290 
    291 static const struct nsd_rdata_descriptor nsec_rdata_fields[] = {
    292 	FIELD("next", RDATA_LITERAL_DNAME),
    293 	FIELD("types", RDATA_REMAINDER)
    294 };
    295 
    296 static const struct nsd_rdata_descriptor dnskey_rdata_fields[] = {
    297 	FIELD("flags", 2),
    298 	FIELD("protocol", 1),
    299 	FIELD("algorithm", 1),
    300 	FIELD("publickey", RDATA_REMAINDER)
    301 };
    302 
    303 static const struct nsd_rdata_descriptor dhcid_rdata_fields[] = {
    304 	FIELD("dhcpinfo", RDATA_REMAINDER)
    305 };
    306 
    307 static const struct nsd_rdata_descriptor nsec3_rdata_fields[] = {
    308 	FIELD("algorithm", 1),
    309 	FIELD("flags", 1),
    310 	FIELD("iterations", 2),
    311 	FIELD("salt", RDATA_BINARY),
    312 	FIELD("next", RDATA_BINARY),
    313 	FIELD("types", RDATA_REMAINDER)
    314 };
    315 
    316 static const struct nsd_rdata_descriptor nsec3param_rdata_fields[] = {
    317 	FIELD("algorithm", 1),
    318 	FIELD("flags", 1),
    319 	FIELD("iterations", 2),
    320 	FIELD("salt", RDATA_BINARY)
    321 };
    322 
    323 static const struct nsd_rdata_descriptor tlsa_rdata_fields[] = {
    324 	FIELD("usage", 1),
    325 	FIELD("selector", 1),
    326 	FIELD("matching type", 1),
    327 	FIELD("certificate association data", RDATA_REMAINDER)
    328 };
    329 
    330 static const struct nsd_rdata_descriptor smimea_rdata_fields[] = {
    331 	FIELD("usage", 1),
    332 	FIELD("selector", 1),
    333 	FIELD("matching type", 1),
    334 	FIELD("certificate association data", RDATA_REMAINDER)
    335 };
    336 
    337 static const struct nsd_rdata_descriptor hip_rdata_fields[] = {
    338 	FIELD("hip", RDATA_REMAINDER)
    339 };
    340 
    341 static const struct nsd_rdata_descriptor ninfo_rdata_fields[] = {
    342 	FIELD("text", RDATA_REMAINDER)
    343 };
    344 
    345 static const struct nsd_rdata_descriptor rkey_rdata_fields[] = {
    346 	FIELD("flags", 2),
    347 	FIELD("protocol", 1),
    348 	FIELD("algorithm", 1),
    349 	FIELD("publickey", RDATA_REMAINDER)
    350 };
    351 
    352 static const struct nsd_rdata_descriptor talink_rdata_fields[] = {
    353 	FIELD("start or previous", RDATA_LITERAL_DNAME),
    354 	FIELD("end or next", RDATA_LITERAL_DNAME)
    355 };
    356 
    357 static const struct nsd_rdata_descriptor cds_rdata_fields[] = {
    358 	FIELD("keytag", 2),
    359 	FIELD("algorithm", 1),
    360 	FIELD("digtype", 1),
    361 	FIELD("digest", RDATA_REMAINDER)
    362 };
    363 
    364 static const struct nsd_rdata_descriptor cdnskey_rdata_fields[] = {
    365 	FIELD("flags", 2),
    366 	FIELD("protocol", 1),
    367 	FIELD("algorithm", 1),
    368 	FIELD("publickey", RDATA_REMAINDER)
    369 };
    370 
    371 static const struct nsd_rdata_descriptor openpgpkey_rdata_fields[] = {
    372 	FIELD("key", RDATA_REMAINDER)
    373 };
    374 
    375 static const struct nsd_rdata_descriptor csync_rdata_fields[] = {
    376 	FIELD("serial", 4),
    377 	FIELD("flags", 2),
    378 	FIELD("types", RDATA_REMAINDER)
    379 };
    380 
    381 static const struct nsd_rdata_descriptor zonemd_rdata_fields[] = {
    382 	FIELD("serial", 4),
    383 	FIELD("scheme", 1),
    384 	FIELD("algorithm", 1),
    385 	FIELD("digest", RDATA_REMAINDER)
    386 };
    387 
    388 static const struct nsd_rdata_descriptor svcb_rdata_fields[] = {
    389 	FIELD("priority", 2),
    390 	FIELD("target", RDATA_UNCOMPRESSED_DNAME),
    391 	FIELD("params", RDATA_REMAINDER)
    392 };
    393 
    394 static const struct nsd_rdata_descriptor https_rdata_fields[] = {
    395 	FIELD("priority", 2),
    396 	FIELD("target", RDATA_UNCOMPRESSED_DNAME),
    397 	FIELD("params", RDATA_REMAINDER)
    398 };
    399 
    400 static const struct nsd_rdata_descriptor dsync_rdata_fields[] = {
    401 	FIELD("rrtype", 2),
    402 	FIELD("scheme", 1),
    403 	FIELD("port", 2),
    404 	FIELD("target", RDATA_LITERAL_DNAME)
    405 };
    406 
    407 static const struct nsd_rdata_descriptor spf_rdata_fields[] = {
    408 	FIELD("text", RDATA_REMAINDER)
    409 };
    410 
    411 static const struct nsd_rdata_descriptor nid_rdata_fields[] = {
    412 	FIELD("nid", 2),
    413 	FIELD("locator", 8)
    414 };
    415 
    416 static const struct nsd_rdata_descriptor l32_rdata_fields[] = {
    417 	FIELD("preference", 2),
    418 	FIELD("locator", 4)
    419 };
    420 
    421 static const struct nsd_rdata_descriptor l64_rdata_fields[] = {
    422 	FIELD("preference", 2),
    423 	FIELD("locator", 8)
    424 };
    425 
    426 static const struct nsd_rdata_descriptor lp_rdata_fields[] = {
    427 	FIELD("preference", 2),
    428 	FIELD("pointer", RDATA_UNCOMPRESSED_DNAME)
    429 };
    430 
    431 static const struct nsd_rdata_descriptor eui48_rdata_fields[] = {
    432 	FIELD("address", 6)
    433 };
    434 
    435 static const struct nsd_rdata_descriptor eui64_rdata_fields[] = {
    436 	FIELD("address", 8)
    437 };
    438 
    439 static const struct nsd_rdata_descriptor uri_rdata_fields[] = {
    440 	FIELD("priority", 2),
    441 	FIELD("weight", 2),
    442 	FIELD("target", RDATA_REMAINDER)
    443 };
    444 
    445 static const struct nsd_rdata_descriptor caa_rdata_fields[] = {
    446 	FIELD("flags", 1),
    447 	FIELD("tag", RDATA_STRING),
    448 	FIELD("value", RDATA_REMAINDER)
    449 };
    450 
    451 static const struct nsd_rdata_descriptor avc_rdata_fields[] = {
    452 	FIELD("text", RDATA_REMAINDER)
    453 };
    454 
    455 static const struct nsd_rdata_descriptor doa_rdata_fields[] = {
    456 	FIELD("enterprise", 4),
    457 	FIELD("type", 4),
    458 	FIELD("location", 1),
    459 	FIELD("media type", RDATA_STRING),
    460 	FIELD("data", RDATA_REMAINDER)
    461 };
    462 
    463 static const struct nsd_rdata_descriptor amtrelay_rdata_fields[] = {
    464 	FIELD("precedence", 1),
    465 	FIELD("discovery_type", 1),
    466 	FIELD_ENTRY("relay", 0, RDATA_AMTRELAY_RELAY,
    467 		amtrelay_relay_length, amtrelay_relay_length)
    468 };
    469 
    470 static const struct nsd_rdata_descriptor resinfo_rdata_fields[] = {
    471 	FIELD("text", RDATA_REMAINDER)
    472 };
    473 
    474 static const struct nsd_rdata_descriptor wallet_rdata_fields[] = {
    475 	FIELD("wallet", RDATA_REMAINDER)
    476 };
    477 
    478 static const struct nsd_rdata_descriptor cla_rdata_fields[] = {
    479 	FIELD("CLA", RDATA_REMAINDER)
    480 };
    481 
    482 static const struct nsd_rdata_descriptor ipn_rdata_fields[] = {
    483 	FIELD("CBHE Node Number", 8)
    484 };
    485 
    486 static const struct nsd_rdata_descriptor ta_rdata_fields[] = {
    487 	FIELD("key", 2),
    488 	FIELD("algorithm", 1),
    489 	FIELD("type", 1),
    490 	FIELD("digest", RDATA_REMAINDER)
    491 };
    492 
    493 static const struct nsd_rdata_descriptor dlv_rdata_fields[] = {
    494 	FIELD("key", 2),
    495 	FIELD("algorithm", 1),
    496 	FIELD("type", 1),
    497 	FIELD("digest", RDATA_REMAINDER)
    498 };
    499 
    500 #define TYPE(name, code, bools, read, write, print, fields) \
    501   { code, name, bools, read, write, print, { sizeof(fields)/sizeof(fields[0]), fields } }
    502 
    503 #define UNKNOWN_TYPE(code) \
    504   { code, NULL /* mnemonic */, 0 /* has_references */, 0 /* is_compressible */, 0 /* has_dnames */, read_generic_rdata, write_generic_rdata, print_generic_rdata, { sizeof(generic_rdata_fields)/sizeof(generic_rdata_fields[0]), generic_rdata_fields } }
    505 
    506 /* The RR type has no references, it is a binary wireformat.
    507  * has_references, is_compressible, has_dnames. */
    508 #define TYPE_HAS_NO_REFS 0, 0, 0
    509 /* The RR type has references, it has compressed dnames. */
    510 #define TYPE_HAS_COMPRESSED_DNAME 1, 1, 1
    511 /* The RR type has references, it has uncompressed dnames. */
    512 #define TYPE_HAS_UNCOMPRESSED_DNAME 1, 0, 1
    513 /* The RR type has no references, it has literal dnames. */
    514 #define TYPE_HAS_LITERAL_DNAME 0, 0, 1
    515 /* Set the bools, has_references, is_compressible, has_dnames. */
    516 #define TYPE_HAS_FLAGS(has_references, is_compressible, has_dnames) has_references, is_compressible, has_dnames
    517 
    518 const nsd_type_descriptor_type type_descriptors[] = {
    519 	/* 0 */
    520 	UNKNOWN_TYPE(0), /* Type 0 - Reserved [RFC 6895] */
    521 	/* 1 */
    522 	TYPE("A", TYPE_A, TYPE_HAS_NO_REFS,
    523 		read_a_rdata, write_generic_rdata,
    524 		print_a_rdata, a_rdata_fields),
    525 	/* 2 */
    526 	TYPE("NS", TYPE_NS, TYPE_HAS_COMPRESSED_DNAME,
    527 		read_compressed_name_rdata, write_compressed_name_rdata,
    528 		print_name_rdata, ns_rdata_fields),
    529 	/* 3 */
    530 	TYPE("MD", TYPE_MD, TYPE_HAS_UNCOMPRESSED_DNAME,
    531 		read_uncompressed_name_rdata, write_uncompressed_name_rdata,
    532 		print_name_rdata, md_rdata_fields),
    533 	/* 4 */
    534 	TYPE("MF", TYPE_MF, TYPE_HAS_UNCOMPRESSED_DNAME,
    535 		read_uncompressed_name_rdata, write_uncompressed_name_rdata,
    536 		print_name_rdata, mf_rdata_fields),
    537 	/* 5 */
    538 	TYPE("CNAME", TYPE_CNAME, TYPE_HAS_COMPRESSED_DNAME,
    539 		read_compressed_name_rdata, write_compressed_name_rdata,
    540 		print_name_rdata, cname_rdata_fields),
    541 	/* 6 */
    542 	TYPE("SOA", TYPE_SOA, TYPE_HAS_COMPRESSED_DNAME,
    543 		read_soa_rdata, write_soa_rdata,
    544 		print_soa_rdata, soa_rdata_fields),
    545 	/* 7 */
    546 	TYPE("MB", TYPE_MB, TYPE_HAS_COMPRESSED_DNAME,
    547 		read_compressed_name_rdata, write_compressed_name_rdata,
    548 		print_name_rdata, mb_rdata_fields),
    549 	/* 8 */
    550 	TYPE("MG", TYPE_MG, TYPE_HAS_COMPRESSED_DNAME,
    551 		read_compressed_name_rdata, write_compressed_name_rdata,
    552 		print_name_rdata, mg_rdata_fields),
    553 	/* 9 */
    554 	TYPE("MR", TYPE_MR, TYPE_HAS_COMPRESSED_DNAME,
    555 		read_compressed_name_rdata, write_compressed_name_rdata,
    556 		print_name_rdata, mr_rdata_fields),
    557 	/* 10 */
    558 	TYPE("NULL", TYPE_NULL, TYPE_HAS_NO_REFS,
    559 		read_generic_rdata, write_generic_rdata,
    560 		print_generic_rdata, generic_rdata_fields),
    561 	/* 11 */
    562 	TYPE("WKS", TYPE_WKS, TYPE_HAS_NO_REFS,
    563 		read_wks_rdata, write_generic_rdata,
    564 		print_wks_rdata, wks_rdata_fields),
    565 	/* 12 */
    566 	TYPE("PTR", TYPE_PTR, TYPE_HAS_COMPRESSED_DNAME,
    567 		read_compressed_name_rdata, write_compressed_name_rdata,
    568 		print_name_rdata, ptr_rdata_fields),
    569 	/* 13 */
    570 	TYPE("HINFO", TYPE_HINFO, TYPE_HAS_NO_REFS,
    571 		read_hinfo_rdata, write_generic_rdata,
    572 		print_hinfo_rdata, hinfo_rdata_fields),
    573 	/* 14 */
    574 	TYPE("MINFO", TYPE_MINFO, TYPE_HAS_COMPRESSED_DNAME,
    575 		read_minfo_rdata, write_minfo_rdata,
    576 		print_minfo_rdata, minfo_rdata_fields),
    577 	/* 15 */
    578 	TYPE("MX", TYPE_MX, TYPE_HAS_COMPRESSED_DNAME,
    579 		read_mx_rdata, write_mx_rdata,
    580 		print_mx_rdata, mx_rdata_fields),
    581 	/* 16 */
    582 	TYPE("TXT", TYPE_TXT, TYPE_HAS_NO_REFS,
    583 		read_txt_rdata, write_generic_rdata,
    584 		print_txt_rdata, txt_rdata_fields),
    585 	/* 17 */
    586 	TYPE("RP", TYPE_RP, TYPE_HAS_UNCOMPRESSED_DNAME,
    587 		read_rp_rdata, write_rp_rdata, print_rp_rdata,
    588 		rp_rdata_fields),
    589 	/* 18 */
    590 	TYPE("AFSDB", TYPE_AFSDB, TYPE_HAS_UNCOMPRESSED_DNAME,
    591 		read_afsdb_rdata, write_afsdb_rdata, print_afsdb_rdata,
    592 		afsdb_rdata_fields),
    593 	/* 19 */
    594 	TYPE("X25", TYPE_X25, TYPE_HAS_NO_REFS,
    595 		read_x25_rdata, write_generic_rdata, print_x25_rdata,
    596 		x25_rdata_fields),
    597 	/* 20 */
    598 	TYPE("ISDN", TYPE_ISDN, TYPE_HAS_NO_REFS,
    599 		read_isdn_rdata, write_generic_rdata, print_isdn_rdata,
    600 		isdn_rdata_fields),
    601 	/* 21 */
    602 	TYPE("RT", TYPE_RT, TYPE_HAS_UNCOMPRESSED_DNAME,
    603 		read_rt_rdata, write_rt_rdata, print_mx_rdata,
    604 		rt_rdata_fields),
    605 	/* 22 */
    606 	TYPE("NSAP", TYPE_NSAP, TYPE_HAS_NO_REFS,
    607 		read_generic_rdata, write_generic_rdata, print_nsap_rdata,
    608 		nsap_rdata_fields),
    609 	/* 23 */
    610 	TYPE("NSAP-PTR", TYPE_NSAP_PTR, TYPE_HAS_NO_REFS,
    611 		read_generic_rdata, write_generic_rdata,
    612 		print_nsap_ptr_rdata, nsap_ptr_rdata_fields),
    613 	/* 24 */
    614 	TYPE("SIG", TYPE_SIG, TYPE_HAS_LITERAL_DNAME,
    615 		read_rrsig_rdata, write_generic_rdata, print_rrsig_rdata,
    616 		sig_rdata_fields),
    617 	/* 25 */
    618 	TYPE("KEY", TYPE_KEY, TYPE_HAS_NO_REFS,
    619 		read_generic_rdata, write_generic_rdata, print_key_rdata,
    620 		key_rdata_fields),
    621 	/* 26 */
    622 	TYPE("PX", TYPE_PX, TYPE_HAS_UNCOMPRESSED_DNAME,
    623 		read_px_rdata, write_px_rdata, print_px_rdata,
    624 		px_rdata_fields),
    625 	/* 27 */
    626 	TYPE("GPOS", TYPE_GPOS, TYPE_HAS_NO_REFS,
    627 		read_generic_rdata, write_generic_rdata, print_gpos_rdata,
    628 		gpos_rdata_fields),
    629 	/* 28 */
    630 	TYPE("AAAA", TYPE_AAAA, TYPE_HAS_NO_REFS,
    631 		read_aaaa_rdata, write_generic_rdata, print_aaaa_rdata,
    632 		aaaa_rdata_fields),
    633 	/* 29 */
    634 	TYPE("LOC", TYPE_LOC, TYPE_HAS_NO_REFS,
    635 		read_loc_rdata, write_generic_rdata, print_loc_rdata,
    636 		loc_rdata_fields),
    637 	/* 30 */
    638 	TYPE("NXT", TYPE_NXT, TYPE_HAS_UNCOMPRESSED_DNAME,
    639 		read_nxt_rdata, write_nxt_rdata, print_nxt_rdata,
    640 		nxt_rdata_fields),
    641 	/* 31 */
    642 	TYPE("EID", TYPE_EID, TYPE_HAS_NO_REFS,
    643 		read_generic_rdata, write_generic_rdata, print_eid_rdata,
    644 		eid_rdata_fields),
    645 	/* 32 */
    646 	TYPE("NIMLOC", TYPE_NIMLOC, TYPE_HAS_NO_REFS,
    647 		read_generic_rdata, write_generic_rdata, print_nimloc_rdata,
    648 		nimloc_rdata_fields),
    649 	/* 33 */
    650 	TYPE("SRV", TYPE_SRV, TYPE_HAS_UNCOMPRESSED_DNAME,
    651 		read_srv_rdata, write_srv_rdata,
    652 		print_srv_rdata, srv_rdata_fields),
    653 	/* 34 */
    654 	TYPE("ATMA", TYPE_ATMA, TYPE_HAS_NO_REFS,
    655 		read_generic_rdata, write_generic_rdata, print_atma_rdata,
    656 		atma_rdata_fields),
    657 	/* 35 */
    658 	TYPE("NAPTR", TYPE_NAPTR, TYPE_HAS_UNCOMPRESSED_DNAME,
    659 		read_naptr_rdata, write_naptr_rdata,
    660 		print_naptr_rdata, naptr_rdata_fields),
    661 	/* 36 */
    662 	TYPE("KX", TYPE_KX, TYPE_HAS_UNCOMPRESSED_DNAME,
    663 		read_kx_rdata, write_kx_rdata,
    664 		print_mx_rdata, kx_rdata_fields),
    665 	/* 37 */
    666 	TYPE("CERT", TYPE_CERT, TYPE_HAS_NO_REFS,
    667 		read_cert_rdata, write_generic_rdata,
    668 		print_cert_rdata, cert_rdata_fields),
    669 	/* 38 */
    670 	TYPE("A6", TYPE_A6, TYPE_HAS_NO_REFS,
    671 		read_generic_rdata, write_generic_rdata,
    672 		print_generic_rdata, a6_rdata_fields),
    673 	/* 39 */
    674 	TYPE("DNAME", TYPE_DNAME, TYPE_HAS_UNCOMPRESSED_DNAME,
    675 		read_uncompressed_name_rdata, write_uncompressed_name_rdata,
    676 		print_name_rdata, dname_rdata_fields),
    677 	/* 40 */
    678 	TYPE("SINK", TYPE_SINK, TYPE_HAS_NO_REFS,
    679 		read_generic_rdata, write_generic_rdata, print_sink_rdata,
    680 		sink_rdata_fields),
    681 
    682 	UNKNOWN_TYPE(41), /* Type 41 - OPT */
    683 
    684 	/* 42 */
    685 	TYPE("APL", TYPE_APL, TYPE_HAS_NO_REFS,
    686 		read_apl_rdata, write_generic_rdata,
    687 		print_apl_rdata, apl_rdata_fields),
    688 	/* 43 */
    689 	TYPE("DS", TYPE_DS, TYPE_HAS_NO_REFS,
    690 		read_ds_rdata, write_generic_rdata,
    691 		print_ds_rdata, ds_rdata_fields),
    692 	/* 44 */
    693 	TYPE("SSHFP", TYPE_SSHFP, TYPE_HAS_NO_REFS,
    694 		read_sshfp_rdata, write_generic_rdata,
    695 		print_sshfp_rdata, sshfp_rdata_fields),
    696 	/* 45 */
    697 	TYPE("IPSECKEY", TYPE_IPSECKEY, TYPE_HAS_LITERAL_DNAME,
    698 		read_ipseckey_rdata, write_generic_rdata,
    699 		print_ipseckey_rdata, ipseckey_rdata_fields),
    700 	/* 46 */
    701 	TYPE("RRSIG", TYPE_RRSIG, TYPE_HAS_LITERAL_DNAME,
    702 		read_rrsig_rdata, write_generic_rdata,
    703 		print_rrsig_rdata, rrsig_rdata_fields),
    704 	/* 47 */
    705 	TYPE("NSEC", TYPE_NSEC, TYPE_HAS_LITERAL_DNAME,
    706 		read_nsec_rdata, write_generic_rdata,
    707 		print_nsec_rdata, nsec_rdata_fields),
    708 	/* 48 */
    709 	TYPE("DNSKEY", TYPE_DNSKEY, TYPE_HAS_NO_REFS,
    710 		read_dnskey_rdata, write_generic_rdata,
    711 		print_dnskey_rdata, dnskey_rdata_fields),
    712 	/* 49 */
    713 	TYPE("DHCID", TYPE_DHCID, TYPE_HAS_NO_REFS,
    714 		read_dhcid_rdata, write_generic_rdata,
    715 		print_dhcid_rdata, dhcid_rdata_fields),
    716 	/* 50 */
    717 	TYPE("NSEC3", TYPE_NSEC3, TYPE_HAS_NO_REFS,
    718 		read_nsec3_rdata, write_generic_rdata,
    719 		print_nsec3_rdata, nsec3_rdata_fields),
    720 	/* 51 */
    721 	TYPE("NSEC3PARAM", TYPE_NSEC3PARAM, TYPE_HAS_NO_REFS,
    722 		read_nsec3param_rdata, write_generic_rdata,
    723 		print_nsec3param_rdata, nsec3param_rdata_fields),
    724 	/* 52 */
    725 	TYPE("TLSA", TYPE_TLSA, TYPE_HAS_NO_REFS,
    726 		read_tlsa_rdata, write_generic_rdata,
    727 		print_tlsa_rdata, tlsa_rdata_fields),
    728 	/* 53 */
    729 	TYPE("SMIMEA", TYPE_SMIMEA, TYPE_HAS_NO_REFS,
    730 		read_tlsa_rdata, write_generic_rdata,
    731 		print_tlsa_rdata, smimea_rdata_fields),
    732 
    733 	UNKNOWN_TYPE(54),
    734 
    735 	/* 55 */
    736 	TYPE("HIP", TYPE_HIP, TYPE_HAS_LITERAL_DNAME,
    737 		read_hip_rdata, write_generic_rdata,
    738 		print_hip_rdata, hip_rdata_fields),
    739 	/* 56 */
    740 	TYPE("NINFO", TYPE_NINFO, TYPE_HAS_NO_REFS,
    741 		read_txt_rdata, write_generic_rdata,
    742 		print_txt_rdata, ninfo_rdata_fields),
    743 	/* 57 */
    744 	TYPE("RKEY", TYPE_RKEY, TYPE_HAS_NO_REFS,
    745 		read_rkey_rdata, write_generic_rdata,
    746 		print_rkey_rdata, rkey_rdata_fields),
    747 	/* 58 */
    748 	TYPE("TALINK", TYPE_TALINK, TYPE_HAS_LITERAL_DNAME,
    749 		read_talink_rdata, write_generic_rdata,
    750 		print_talink_rdata, talink_rdata_fields),
    751 	/* 59 */
    752 	TYPE("CDS", TYPE_CDS, TYPE_HAS_NO_REFS,
    753 		read_ds_rdata, write_generic_rdata,
    754 		print_ds_rdata, cds_rdata_fields),
    755 	/* 60 */
    756 	TYPE("CDNSKEY", TYPE_CDNSKEY, TYPE_HAS_NO_REFS,
    757 		read_dnskey_rdata, write_generic_rdata,
    758 		print_dnskey_rdata, cdnskey_rdata_fields),
    759 	/* 61 */
    760 	TYPE("OPENPGPKEY", TYPE_OPENPGPKEY, TYPE_HAS_NO_REFS,
    761 		read_generic_rdata, write_generic_rdata,
    762 		print_openpgpkey_rdata, openpgpkey_rdata_fields),
    763 	/* 62 */
    764 	TYPE("CSYNC", TYPE_CSYNC, TYPE_HAS_NO_REFS,
    765 		read_csync_rdata, write_generic_rdata,
    766 		print_csync_rdata, csync_rdata_fields),
    767 	/* 63 */
    768 	TYPE("ZONEMD", TYPE_ZONEMD, TYPE_HAS_NO_REFS,
    769 		read_zonemd_rdata, write_generic_rdata,
    770 		print_zonemd_rdata, zonemd_rdata_fields),
    771 	/* 64 */
    772 	TYPE("SVCB", TYPE_SVCB, TYPE_HAS_UNCOMPRESSED_DNAME,
    773 		read_svcb_rdata, write_svcb_rdata,
    774 		print_svcb_rdata, svcb_rdata_fields),
    775 	/* 65 */
    776 	TYPE("HTTPS", TYPE_HTTPS, TYPE_HAS_UNCOMPRESSED_DNAME,
    777 		read_svcb_rdata, write_svcb_rdata,
    778 		print_svcb_rdata, https_rdata_fields),
    779 	/* 66 */
    780 	TYPE("DSYNC", TYPE_DSYNC, TYPE_HAS_LITERAL_DNAME,
    781 		read_dsync_rdata, write_generic_rdata,
    782 		print_dsync_rdata, dsync_rdata_fields),
    783 
    784 	UNKNOWN_TYPE(67),
    785 	UNKNOWN_TYPE(68),
    786 	UNKNOWN_TYPE(69),
    787 	UNKNOWN_TYPE(70),
    788 	UNKNOWN_TYPE(71),
    789 	UNKNOWN_TYPE(72),
    790 	UNKNOWN_TYPE(73),
    791 	UNKNOWN_TYPE(74),
    792 	UNKNOWN_TYPE(75),
    793 	UNKNOWN_TYPE(76),
    794 	UNKNOWN_TYPE(77),
    795 	UNKNOWN_TYPE(78),
    796 	UNKNOWN_TYPE(79),
    797 	UNKNOWN_TYPE(80),
    798 	UNKNOWN_TYPE(81),
    799 	UNKNOWN_TYPE(82),
    800 	UNKNOWN_TYPE(83),
    801 	UNKNOWN_TYPE(84),
    802 	UNKNOWN_TYPE(85),
    803 	UNKNOWN_TYPE(86),
    804 	UNKNOWN_TYPE(87),
    805 	UNKNOWN_TYPE(88),
    806 	UNKNOWN_TYPE(89),
    807 	UNKNOWN_TYPE(90),
    808 	UNKNOWN_TYPE(91),
    809 	UNKNOWN_TYPE(92),
    810 	UNKNOWN_TYPE(93),
    811 	UNKNOWN_TYPE(94),
    812 	UNKNOWN_TYPE(95),
    813 	UNKNOWN_TYPE(96),
    814 	UNKNOWN_TYPE(97),
    815 	UNKNOWN_TYPE(98),
    816 
    817 	/* 99 */
    818 	TYPE("SPF", TYPE_SPF, TYPE_HAS_NO_REFS,
    819 		read_txt_rdata, write_generic_rdata,
    820 		print_txt_rdata, spf_rdata_fields),
    821 
    822 	UNKNOWN_TYPE(100), /* Type 100 - UINFO [The RR type code is reserved, no reference] */
    823 	UNKNOWN_TYPE(101), /* Type 101 - UID [The RR type code is reserved, no reference] */
    824 	UNKNOWN_TYPE(102), /* Type 102 - GID [The RR type code is reserved, no reference] */
    825 	UNKNOWN_TYPE(103), /* Type 103 - UNSPEC [The RR type code is reserved, no reference] */
    826 
    827 	/* 104 */
    828 	TYPE("NID", TYPE_NID, TYPE_HAS_NO_REFS,
    829 		read_nid_rdata, write_generic_rdata,
    830 		print_nid_rdata, nid_rdata_fields),
    831 	/* 105 */
    832 	TYPE("L32", TYPE_L32, TYPE_HAS_NO_REFS,
    833 		read_l32_rdata, write_generic_rdata,
    834 		print_l32_rdata, l32_rdata_fields),
    835 	/* 106 */
    836 	TYPE("L64", TYPE_L64, TYPE_HAS_NO_REFS,
    837 		read_l64_rdata, write_generic_rdata,
    838 		print_l64_rdata, l64_rdata_fields),
    839 	/* 107 */
    840 	TYPE("LP", TYPE_LP, TYPE_HAS_UNCOMPRESSED_DNAME,
    841 		read_lp_rdata, write_lp_rdata,
    842 		print_lp_rdata, lp_rdata_fields),
    843 	/* 108 */
    844 	TYPE("EUI48", TYPE_EUI48, TYPE_HAS_NO_REFS,
    845 		read_eui48_rdata, write_generic_rdata,
    846 		print_eui48_rdata, eui48_rdata_fields),
    847 	/* 109 */
    848 	TYPE("EUI64", TYPE_EUI64, TYPE_HAS_NO_REFS,
    849 		read_eui64_rdata, write_generic_rdata,
    850 		print_eui64_rdata, eui64_rdata_fields),
    851 
    852 	UNKNOWN_TYPE(110),
    853 	UNKNOWN_TYPE(111),
    854 	UNKNOWN_TYPE(112),
    855 	UNKNOWN_TYPE(113),
    856 	UNKNOWN_TYPE(114),
    857 	UNKNOWN_TYPE(115),
    858 	UNKNOWN_TYPE(116),
    859 	UNKNOWN_TYPE(117),
    860 	UNKNOWN_TYPE(118),
    861 	UNKNOWN_TYPE(119),
    862 	UNKNOWN_TYPE(120),
    863 	UNKNOWN_TYPE(121),
    864 	UNKNOWN_TYPE(122),
    865 	UNKNOWN_TYPE(123),
    866 	UNKNOWN_TYPE(124),
    867 	UNKNOWN_TYPE(125),
    868 	UNKNOWN_TYPE(126),
    869 	UNKNOWN_TYPE(127),
    870 
    871 	/* 128 */
    872 	/* The mnemonic is included so it can be printed in type bitmaps.*/
    873 	TYPE("NXNAME", TYPE_NXNAME, TYPE_HAS_NO_REFS,
    874 		read_generic_rdata, write_generic_rdata,
    875 		print_generic_rdata, generic_rdata_fields),
    876 
    877 	UNKNOWN_TYPE(129),
    878 	UNKNOWN_TYPE(130),
    879 	UNKNOWN_TYPE(131),
    880 	UNKNOWN_TYPE(132),
    881 	UNKNOWN_TYPE(133),
    882 	UNKNOWN_TYPE(134),
    883 	UNKNOWN_TYPE(135),
    884 	UNKNOWN_TYPE(136),
    885 	UNKNOWN_TYPE(137),
    886 	UNKNOWN_TYPE(138),
    887 	UNKNOWN_TYPE(139),
    888 	UNKNOWN_TYPE(140),
    889 	UNKNOWN_TYPE(141),
    890 	UNKNOWN_TYPE(142),
    891 	UNKNOWN_TYPE(143),
    892 	UNKNOWN_TYPE(144),
    893 	UNKNOWN_TYPE(145),
    894 	UNKNOWN_TYPE(146),
    895 	UNKNOWN_TYPE(147),
    896 	UNKNOWN_TYPE(148),
    897 	UNKNOWN_TYPE(149),
    898 	UNKNOWN_TYPE(150),
    899 	UNKNOWN_TYPE(151),
    900 	UNKNOWN_TYPE(152),
    901 	UNKNOWN_TYPE(153),
    902 	UNKNOWN_TYPE(154),
    903 	UNKNOWN_TYPE(155),
    904 	UNKNOWN_TYPE(156),
    905 	UNKNOWN_TYPE(157),
    906 	UNKNOWN_TYPE(158),
    907 	UNKNOWN_TYPE(159),
    908 	UNKNOWN_TYPE(160),
    909 	UNKNOWN_TYPE(161),
    910 	UNKNOWN_TYPE(162),
    911 	UNKNOWN_TYPE(163),
    912 	UNKNOWN_TYPE(164),
    913 	UNKNOWN_TYPE(165),
    914 	UNKNOWN_TYPE(166),
    915 	UNKNOWN_TYPE(167),
    916 	UNKNOWN_TYPE(168),
    917 	UNKNOWN_TYPE(169),
    918 	UNKNOWN_TYPE(170),
    919 	UNKNOWN_TYPE(171),
    920 	UNKNOWN_TYPE(172),
    921 	UNKNOWN_TYPE(173),
    922 	UNKNOWN_TYPE(174),
    923 	UNKNOWN_TYPE(175),
    924 	UNKNOWN_TYPE(176),
    925 	UNKNOWN_TYPE(177),
    926 	UNKNOWN_TYPE(178),
    927 	UNKNOWN_TYPE(179),
    928 	UNKNOWN_TYPE(180),
    929 	UNKNOWN_TYPE(181),
    930 	UNKNOWN_TYPE(182),
    931 	UNKNOWN_TYPE(183),
    932 	UNKNOWN_TYPE(184),
    933 	UNKNOWN_TYPE(185),
    934 	UNKNOWN_TYPE(186),
    935 	UNKNOWN_TYPE(187),
    936 	UNKNOWN_TYPE(188),
    937 	UNKNOWN_TYPE(189),
    938 	UNKNOWN_TYPE(190),
    939 	UNKNOWN_TYPE(191),
    940 	UNKNOWN_TYPE(192),
    941 	UNKNOWN_TYPE(193),
    942 	UNKNOWN_TYPE(194),
    943 	UNKNOWN_TYPE(195),
    944 	UNKNOWN_TYPE(196),
    945 	UNKNOWN_TYPE(197),
    946 	UNKNOWN_TYPE(198),
    947 	UNKNOWN_TYPE(199),
    948 	UNKNOWN_TYPE(200),
    949 	UNKNOWN_TYPE(201),
    950 	UNKNOWN_TYPE(202),
    951 	UNKNOWN_TYPE(203),
    952 	UNKNOWN_TYPE(204),
    953 	UNKNOWN_TYPE(205),
    954 	UNKNOWN_TYPE(206),
    955 	UNKNOWN_TYPE(207),
    956 	UNKNOWN_TYPE(208),
    957 	UNKNOWN_TYPE(209),
    958 	UNKNOWN_TYPE(210),
    959 	UNKNOWN_TYPE(211),
    960 	UNKNOWN_TYPE(212),
    961 	UNKNOWN_TYPE(213),
    962 	UNKNOWN_TYPE(214),
    963 	UNKNOWN_TYPE(215),
    964 	UNKNOWN_TYPE(216),
    965 	UNKNOWN_TYPE(217),
    966 	UNKNOWN_TYPE(218),
    967 	UNKNOWN_TYPE(219),
    968 	UNKNOWN_TYPE(220),
    969 	UNKNOWN_TYPE(221),
    970 	UNKNOWN_TYPE(222),
    971 	UNKNOWN_TYPE(223),
    972 	UNKNOWN_TYPE(224),
    973 	UNKNOWN_TYPE(225),
    974 	UNKNOWN_TYPE(226),
    975 	UNKNOWN_TYPE(227),
    976 	UNKNOWN_TYPE(228),
    977 	UNKNOWN_TYPE(229),
    978 	UNKNOWN_TYPE(230),
    979 	UNKNOWN_TYPE(231),
    980 	UNKNOWN_TYPE(232),
    981 	UNKNOWN_TYPE(233),
    982 	UNKNOWN_TYPE(234),
    983 	UNKNOWN_TYPE(235),
    984 	UNKNOWN_TYPE(236),
    985 	UNKNOWN_TYPE(237),
    986 	UNKNOWN_TYPE(238),
    987 	UNKNOWN_TYPE(239),
    988 	UNKNOWN_TYPE(240),
    989 	UNKNOWN_TYPE(241),
    990 	UNKNOWN_TYPE(242),
    991 	UNKNOWN_TYPE(243),
    992 	UNKNOWN_TYPE(244),
    993 	UNKNOWN_TYPE(245),
    994 	UNKNOWN_TYPE(246),
    995 	UNKNOWN_TYPE(247),
    996 	UNKNOWN_TYPE(248),
    997 	UNKNOWN_TYPE(249), /* Type 249 - TKEY [RFC 2930] */
    998 	UNKNOWN_TYPE(250), /* Type 250 - TSIG */
    999 	UNKNOWN_TYPE(251), /* Type 251 - IXFR */
   1000 	UNKNOWN_TYPE(252), /* Type 252 - AXFR */
   1001 	UNKNOWN_TYPE(253), /* Type 253 - MAILB */
   1002 	UNKNOWN_TYPE(254), /* Type 254 - MAILA */
   1003 	UNKNOWN_TYPE(255), /* Type 255 - ANY */
   1004 
   1005 	/* 256 */
   1006 	TYPE("URI", TYPE_URI, TYPE_HAS_NO_REFS,
   1007 		read_uri_rdata, write_generic_rdata,
   1008 		print_uri_rdata, uri_rdata_fields),
   1009 	/* 257 */
   1010 	TYPE("CAA", TYPE_CAA, TYPE_HAS_NO_REFS,
   1011 		read_caa_rdata, write_generic_rdata,
   1012 		print_caa_rdata, caa_rdata_fields),
   1013 	/* 258 */
   1014 	TYPE("AVC", TYPE_AVC, TYPE_HAS_NO_REFS,
   1015 		read_txt_rdata, write_generic_rdata,
   1016 		print_txt_rdata, avc_rdata_fields),
   1017 	/* 259 */
   1018 	TYPE("DOA", TYPE_DOA, TYPE_HAS_NO_REFS,
   1019 		read_generic_rdata, write_generic_rdata,
   1020 		print_doa_rdata, doa_rdata_fields),
   1021 	/* 260 */
   1022 	TYPE("AMTRELAY", TYPE_AMTRELAY, TYPE_HAS_LITERAL_DNAME,
   1023 		read_amtrelay_rdata, write_generic_rdata,
   1024 		print_amtrelay_rdata, amtrelay_rdata_fields),
   1025 	/* 261 */
   1026 	TYPE("RESINFO", TYPE_RESINFO, TYPE_HAS_NO_REFS,
   1027 		read_txt_rdata, write_generic_rdata,
   1028 		print_resinfo_rdata, resinfo_rdata_fields),
   1029 	/* 262 */
   1030 	TYPE("WALLET", TYPE_WALLET, TYPE_HAS_NO_REFS,
   1031 		read_txt_rdata, write_generic_rdata,
   1032 		print_txt_rdata, wallet_rdata_fields),
   1033 	/* 263 */
   1034 	TYPE("CLA", TYPE_CLA, TYPE_HAS_NO_REFS,
   1035 		read_txt_rdata, write_generic_rdata,
   1036 		print_txt_rdata, cla_rdata_fields),
   1037 	/* 264 */
   1038 	TYPE("IPN", TYPE_IPN, TYPE_HAS_NO_REFS,
   1039 		read_generic_rdata, write_generic_rdata,
   1040 		print_ipn_rdata, ipn_rdata_fields),
   1041 
   1042 	/* 32768 */
   1043 	TYPE("TA", TYPE_TA, TYPE_HAS_NO_REFS,
   1044 		read_dlv_rdata, write_generic_rdata,
   1045 		print_dlv_rdata, ta_rdata_fields),
   1046 	/* 32769 */
   1047 	TYPE("DLV", TYPE_DLV, TYPE_HAS_NO_REFS,
   1048 		read_dlv_rdata, write_generic_rdata,
   1049 		print_dlv_rdata, dlv_rdata_fields)
   1050 };
   1051 
   1052 #undef UNKNOWN_TYPE
   1053 #undef TYPE
   1054 #undef FIELD
   1055 #undef FIELD_ENTRY
   1056 #undef TYPE_HAS_NO_REFS
   1057 #undef TYPE_HAS_COMPRESSED_DNAME
   1058 #undef TYPE_HAS_UNCOMPRESSED_DNAME
   1059 #undef TYPE_HAS_LITERAL_DNAME
   1060 #undef TYPE_HAS_FLAGS
   1061 
   1062 const char *
   1063 rrtype_to_string(uint16_t rrtype)
   1064 {
   1065 	static char buf[20];
   1066 	const nsd_type_descriptor_type *descriptor =
   1067 		nsd_type_descriptor(rrtype);
   1068 	if (descriptor->name) {
   1069 		return descriptor->name;
   1070 	} else {
   1071 		snprintf(buf, sizeof(buf), "TYPE%d", (int) rrtype);
   1072 		return buf;
   1073 	}
   1074 }
   1075 
   1076 /*
   1077  * Lookup the type in the ztypes lookup table.  If not found, check if
   1078  * the type uses the "TYPExxx" notation for unknown types.
   1079  *
   1080  * Return 0 if no type matches.
   1081  */
   1082 uint16_t
   1083 rrtype_from_string(const char *name)
   1084 {
   1085 	char *end;
   1086 	long rrtype;
   1087 
   1088 	/* Because this routine is called during zone parse for every record,
   1089 	 * we optimise for frequently occurring records.
   1090 	 * Also, we optimise for 'IN' and numbers are not rr types, because
   1091 	 * during parse this routine is called for every rr class and TTL
   1092 	 * to determine that it is not an RR type */
   1093 	switch(name[0]) {
   1094 	case 'r':
   1095 	case 'R':
   1096 		if(strcasecmp(name+1, "RSIG") == 0) return TYPE_RRSIG;
   1097 		break;
   1098 	case 'n':
   1099 	case 'N':
   1100 		switch(name[1]) {
   1101 		case 's':
   1102 		case 'S':
   1103 			switch(name[2]) {
   1104 			case 0: return TYPE_NS;
   1105 			case 'e':
   1106 			case 'E':
   1107 				if(strcasecmp(name+2, "EC") == 0) return TYPE_NSEC;
   1108 				if(strcasecmp(name+2, "EC3") == 0) return TYPE_NSEC3;
   1109 				if(strcasecmp(name+2, "EC3PARAM") == 0) return TYPE_NSEC3PARAM;
   1110 				break;
   1111 			}
   1112 			break;
   1113 		}
   1114 		break;
   1115 	case 'd':
   1116 	case 'D':
   1117 		switch(name[1]) {
   1118 		case 's':
   1119 		case 'S':
   1120 			if(name[2]==0) return TYPE_DS;
   1121 			break;
   1122 		case 'n':
   1123 		case 'N':
   1124 			if(strcasecmp(name+2, "SKEY") == 0) return TYPE_DNSKEY;
   1125 			break;
   1126 		}
   1127 		break;
   1128 	case 'a':
   1129 	case 'A':
   1130 		switch(name[1]) {
   1131 		case 0:	return TYPE_A;
   1132 		case 'a':
   1133 		case 'A':
   1134 			if(strcasecmp(name+2, "AA") == 0) return TYPE_AAAA;
   1135 			break;
   1136 		}
   1137 		break;
   1138 	case 's':
   1139 	case 'S':
   1140 		if(strcasecmp(name+1, "OA") == 0) return TYPE_SOA;
   1141 		break;
   1142 	case 't':
   1143 	case 'T':
   1144 		if(strcasecmp(name+1, "XT") == 0) return TYPE_TXT;
   1145 		break;
   1146 	case '0':
   1147 	case '1':
   1148 	case '2':
   1149 	case '3':
   1150 	case '4':
   1151 	case '5':
   1152 	case '6':
   1153 	case '7':
   1154 	case '8':
   1155 	case '9':
   1156 		return 0; /* no RR types start with 0-9 */
   1157 	case 'i':
   1158 	case 'I':
   1159 		switch(name[1]) {
   1160 		case 'n':
   1161 		case 'N':
   1162 			return 0; /* 'IN' is a class not a type */
   1163 		}
   1164 		break;
   1165 	}
   1166 
   1167 	for (int i=0, n=sizeof(type_descriptors)/sizeof(type_descriptors[0]); i < n; i++) {
   1168 		if (type_descriptors[i].name && strcasecmp(type_descriptors[i].name, name) == 0)
   1169 			return type_descriptors[i].type;
   1170 	}
   1171 
   1172 	if (strlen(name) < 5)
   1173 		return 0;
   1174 
   1175 	if (strncasecmp(name, "TYPE", 4) != 0)
   1176 		return 0;
   1177 
   1178 	if (!isdigit((unsigned char)name[4]))
   1179 		return 0;
   1180 
   1181 	/* The rest from the string must be a number.  */
   1182 	rrtype = strtol(name + 4, &end, 10);
   1183 	if (*end != '\0')
   1184 		return 0;
   1185 	if (rrtype < 0 || rrtype > 65535L)
   1186 		return 0;
   1187 
   1188 	return (uint16_t) rrtype;
   1189 }
   1190 
   1191 const char *
   1192 rrclass_to_string(uint16_t rrclass)
   1193 {
   1194 	static char buf[20];
   1195 	lookup_table_type *entry = lookup_by_id(dns_rrclasses, rrclass);
   1196 	if (entry) {
   1197 		assert(strlen(entry->name) < sizeof(buf));
   1198 		strlcpy(buf, entry->name, sizeof(buf));
   1199 	} else {
   1200 		snprintf(buf, sizeof(buf), "CLASS%d", (int) rrclass);
   1201 	}
   1202 	return buf;
   1203 }
   1204 
   1205 uint16_t
   1206 rrclass_from_string(const char *name)
   1207 {
   1208         char *end;
   1209         long rrclass;
   1210 	lookup_table_type *entry;
   1211 
   1212 	entry = lookup_by_name(dns_rrclasses, name);
   1213 	if (entry) {
   1214 		return (uint16_t) entry->id;
   1215 	}
   1216 
   1217 	if (strlen(name) < 6)
   1218 		return 0;
   1219 
   1220 	if (strncasecmp(name, "CLASS", 5) != 0)
   1221 		return 0;
   1222 
   1223 	if (!isdigit((unsigned char)name[5]))
   1224 		return 0;
   1225 
   1226 	/* The rest from the string must be a number.  */
   1227 	rrclass = strtol(name + 5, &end, 10);
   1228 	if (*end != '\0')
   1229 		return 0;
   1230 	if (rrclass < 0 || rrclass > 65535L)
   1231 		return 0;
   1232 
   1233 	return (uint16_t) rrclass;
   1234 }
   1235