]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
Updated RR rdata field descriptor table to be able to deal with variable
authorErik Rozendaal <erik@NLnetLabs.nl>
Wed, 15 Dec 2004 10:00:07 +0000 (10:00 +0000)
committerErik Rozendaal <erik@NLnetLabs.nl>
Wed, 15 Dec 2004 10:00:07 +0000 (10:00 +0000)
number of rdata fields.  Moved the table from rdata.{c,h} to rr.{c,h}.

ldns/rdata.h
ldns/rr.h
rdata.c
rr.c

index dadae330e77bdfb9c5057b4dcccbffb9b804907b..556c416b3051b48dcb35e537374ac66428047bb8 100644 (file)
 
 #define MAXRDATALEN 64
 
-enum type_enum_rdata
+enum ldns_enum_rdata_field_type
 {
+       /** none */
+       RD_NONE_T,
        /** domain name */
        RD_DNAME_T,
        /** 8 bits */
@@ -79,7 +81,7 @@ enum type_enum_rdata
        RD_LOC_T
        
 };
-typedef enum type_enum_rdata t_rd_type;
+typedef enum ldns_enum_rdata_field_type ldns_rdata_field_type;
 
 enum type_enum_class
 {
@@ -105,36 +107,19 @@ struct type_struct_rdata_field
        /** \brief The size of the data (in bytes) */
        uint16_t _size;
        /** \brief The type of the data */
-       t_rd_type _type;
+       ldns_rdata_field_type _type;
        /** \brief Pointer to the data (byte buffer) */
        uint8_t  *_data;
 };
 typedef struct type_struct_rdata_field t_rdata_field;
 
-/* 
- * \brief struct to hold the whole set of rd_fields
- *
- * How does the whole rdata_field list look. This is called
- * the rdata in dns speak
- */
-struct type_struct_rdata_field_descriptor
-{
-        uint16_t    _type;       /* RR type */
-        const char *_name;       /* Textual name.  */
-        uint8_t     _minimum;    /* Minimum number of RDATA FIELDs.  */
-        uint8_t     _maximum;    /* Maximum number of RDATA FIELDs.  */
-        uint8_t     _wireformat[MAXRDATALEN]; /* rdata_wireformat_type */
-};
-typedef struct type_struct_rdata_field_descriptor t_rdata_field_descriptor;
-
-
 /* prototypes */
 uint16_t        _ldns_rd_field_size(t_rdata_field *);
 void            _ldns_rd_field_set_size(t_rdata_field *, uint16_t);
-void            _ldns_rd_field_set_type(t_rdata_field *, t_rd_type);
+void            _ldns_rd_field_set_type(t_rdata_field *, ldns_rdata_field_type);
 void            _ldns_rd_field_set_data(t_rdata_field *, uint8_t *);
-t_rd_type       _ldns_rd_field_type(t_rdata_field *);
-t_rdata_field   *_ldns_rd_field_new(uint16_t, t_rd_type, uint8_t *);
+ldns_rdata_field_type _ldns_rd_field_type(t_rdata_field *);
+t_rdata_field   *_ldns_rd_field_new(uint16_t, ldns_rdata_field_type, uint8_t *);
 uint8_t         *_ldns_rd_field_data(t_rdata_field *);
 void            _ldns_rd_field_destroy(t_rdata_field *);
 
index de2a29ebb65bfdaf33399b201b8079b5886b2f11..cb1ba125c3812c4791110ae4a9cda0c82fc4054f 100644 (file)
--- a/ldns/rr.h
+++ b/ldns/rr.h
@@ -159,6 +159,24 @@ struct type_struct_rrset
 };
 typedef struct type_struct_rrset t_rrset;
 
+/* 
+ * \brief struct to hold the whole set of rd_fields
+ *
+ * How does the whole rdata_field list look. This is called
+ * the rdata in dns speak
+ */
+struct ldns_struct_rr_descriptor_type
+{
+        uint16_t    _type;       /* RR type */
+        const char *_name;       /* Textual name.  */
+        uint8_t     _minimum;    /* Minimum number of RDATA FIELDs.  */
+        uint8_t     _maximum;    /* Maximum number of RDATA FIELDs.  */
+        const ldns_rdata_field_type *_wireformat;
+       ldns_rdata_field_type _variable;
+};
+typedef struct ldns_struct_rr_descriptor_type ldns_rr_descriptor_type;
+
+
 /* prototypes */
 t_rr * ldns_rr_new(void);
 void ldns_rr_set_owner(t_rr *, uint8_t *);
@@ -170,4 +188,10 @@ uint8_t *ldns_rr_owner(t_rr *);
 uint8_t ldns_rr_ttl(t_rr *);
 uint16_t ldns_rr_rd_count(t_rr *);
 
+const ldns_rr_descriptor_type *ldns_rr_descriptor(uint16_t type);
+size_t ldns_rr_descriptor_minimum(ldns_rr_descriptor_type *descriptor);
+size_t ldns_rr_descriptor_maximum(ldns_rr_descriptor_type *descriptor);
+ldns_rdata_field_type ldns_rr_descriptor_field_type(
+    ldns_rr_descriptor_type *descriptor, size_t index);
+
 #endif /* _LDNS_RR_H */
diff --git a/rdata.c b/rdata.c
index df35fc059c36cda4608915db514a118bb5328c19..1de50aabadf41a067de86c9a6a45893b7c65699a 100644 (file)
--- a/rdata.c
+++ b/rdata.c
@@ -27,7 +27,7 @@ _ldns_rd_field_size(t_rdata_field *rd)
        return rd->_size;
 }
 
-t_rd_type
+ldns_rdata_field_type
 _ldns_rd_field_type(t_rdata_field *rd)
 {
        return rd->_type;
@@ -47,7 +47,7 @@ _ldns_rd_field_set_size(t_rdata_field *rd, uint16_t s)
 }
 
 void
-_ldns_rd_field_set_type(t_rdata_field *rd, t_rd_type t)
+_ldns_rd_field_set_type(t_rdata_field *rd, ldns_rdata_field_type t)
 {
        rd->_type = t;
 }
@@ -64,7 +64,7 @@ _ldns_rd_field_set_data(t_rdata_field *rd, uint8_t *d)
  * and return it
  */
 t_rdata_field *
-_ldns_rd_field_new(uint16_t s, t_rd_type t, uint8_t *d)
+_ldns_rd_field_new(uint16_t s, ldns_rdata_field_type t, uint8_t *d)
 {
        t_rdata_field *rd;
        rd = MALLOC(t_rdata_field);
@@ -85,7 +85,7 @@ _ldns_rd_field_new(uint16_t s, t_rd_type t, uint8_t *d)
  * and return it
  */
 t_rdata_field *
-_ldns_rd_field_new_frm_string(t_rd_type t, char *s)
+_ldns_rd_field_new_frm_string(ldns_rdata_field_type t, char *s)
 {
        return NULL;
 }
@@ -97,152 +97,3 @@ _ldns_rd_field_destroy(t_rdata_field *rd)
        /* empty */
 }
 
-
-t_rdata_field_descriptor rdata_field_descriptors[] = {
-       /* 0 */
-       { 0, NULL, 1, 1, { RD_UNKNOWN_T } },
-       /* 1 */
-       { TYPE_A, "A", 1, 1, { RD_A_T } },
-       /* 2 */
-       { TYPE_NS, "NS", 1, 1, { RD_DNAME_T } },
-       /* 3 */
-       { TYPE_MD, "MD", 1, 1, { RD_DNAME_T } },
-       /* 4 */ 
-       { TYPE_MF, "MF", 1, 1, { RD_DNAME_T } },
-       /* 5 */
-       { TYPE_CNAME, "CNAME", 1, 1, { RD_DNAME_T } },
-       /* 6 */
-       { TYPE_SOA, "SOA", 7, 7,
-         { RD_DNAME_T, RD_DNAME_T, RD_INT32_T, 
-           RD_INT32_T, RD_INT32_T, RD_INT32_T, RD_INT32_T } },
-       /* 7 */
-       { TYPE_MB, "MB", 1, 1, { RD_DNAME_T } },
-       /* 8 */
-       { TYPE_MG, "MG", 1, 1, { RD_DNAME_T } },
-       /* 9 */
-       { TYPE_MR, "MR", 1, 1, { RD_DNAME_T } },
-       /* 10 */
-       { TYPE_NULL, "NULL", 1, 1, { RD_UNKNOWN_T } },
-       /* 11 */
-       { TYPE_WKS, "WKS", 2, 2, { RD_A_T, RD_SERVICE_T } },
-       /* 12 */
-       { TYPE_PTR, "PTR", 1, 1, { RD_DNAME_T } },
-       /* 13 */
-       { TYPE_HINFO, "HINFO", 2, 2, { RD_STR_T, RD_STR_T } },
-       /* 14 */
-       { TYPE_MINFO, "MINFO", 2, 2, { RD_DNAME_T, RD_DNAME_T } },
-       /* 15 */
-       { TYPE_MX, "MX", 2, 2, { RD_INT8_T, RD_DNAME_T } },
-       /* 16 */
-       { TYPE_TXT, "TXT", 1, MAXRDATALEN,
-         { RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T,
-           RD_STR_T, RD_STR_T, RD_STR_T, RD_STR_T } },
-       /* 17 */
-       { TYPE_RP, "RP", 2, 2, { RD_DNAME_T, RD_DNAME_T } },
-       /* 18 */
-       { TYPE_AFSDB, "AFSDB", 2, 2, { RD_INT8_T, RD_DNAME_T } },
-       /* 19 */
-       { TYPE_X25, "X25", 1, 1, { RD_STR_T } },
-       /* 20 */
-       { TYPE_ISDN, "ISDN", 1, 2, { RD_STR_T, RD_STR_T } },
-       /* 21 */
-       { TYPE_RT, "RT", 2, 2, { RD_INT8_T, RD_DNAME_T } },
-       /* 22 */
-       { TYPE_NSAP, "NSAP", 1, 1, { RD_UNKNOWN_T } },
-       /* 23 */
-       { 23, NULL, 1, 1, { RD_UNKNOWN_T } },
-       /* 24 */
-       { TYPE_SIG, "SIG", 9, 9,
-         { RD_INT8_T, RD_INT8_T, RD_INT8_T, RD_INT32_T,
-           RD_INT32_T, RD_INT32_T, RD_INT16_T,
-           RD_DNAME_T, RD_B64_T } },
-       /* 25 */
-       { TYPE_KEY, "KEY", 4, 4,
-         { RD_INT16_T, RD_INT8_T, RD_INT8_T, RD_B64_T } },
-       /* 26 */
-       { TYPE_PX, "PX", 3, 3,
-         { RD_INT16_T, RD_DNAME_T, RD_DNAME_T } },
-       /* 27 */
-       { 27, NULL, 1, 1, { RD_UNKNOWN_T } },
-       /* 28 */
-       { TYPE_AAAA, "AAAA", 1, 1, { RD_AAAA_T } },
-       /* 29 */
-       { TYPE_LOC, "LOC", 1, 1, { RD_LOC_T } },
-       /* 30 */
-       { TYPE_NXT, "NXT", 2, 2, { RD_DNAME_T, RD_UNKNOWN_T } },
-       /* 31 */
-       { 31, NULL, 1, 1, { RD_UNKNOWN_T } },
-       /* 32 */
-       { 32, NULL, 1, 1, { RD_UNKNOWN_T } },
-       /* 33 */
-       { TYPE_SRV, "SRV", 4, 4,
-         { RD_INT16_T, RD_INT16_T, RD_INT16_T, RD_DNAME_T } },
-       /* 34 */
-       { 34, NULL, 1, 1, { RD_UNKNOWN_T } },
-       /* 35 */
-       { TYPE_NAPTR, "NAPTR", 6, 6,
-         { RD_INT16_T, RD_INT16_T, RD_STR_T, RD_STR_T, RD_STR_T, RD_DNAME_T } },
-       /* 36 */
-       { TYPE_KX, "KX", 2, 2,
-         { RD_INT16_T, RD_DNAME_T } },
-       /* 37 */
-       { TYPE_CERT, "CERT", 4, 4,
-         { RD_CERT_T, RD_INT16_T, RD_ALG_T, RD_B64_T } },
-       /* 38 */
-       { 38, NULL, 1, 1, { RD_UNKNOWN_T } },
-       /* 39 */
-       { TYPE_DNAME, "DNAME", 1, 1, { RD_DNAME_T } },
-       /* 40 */
-       { 40, NULL, 1, 1, { RD_UNKNOWN_T } },
-       /* 41 */
-       { TYPE_OPT, "OPT", 1, 1, { RD_UNKNOWN_T } },
-       /* 42 */
-       { TYPE_APL, "APL", 0, MAXRDATALEN,
-         { RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T,
-           RD_APL_T, RD_APL_T, RD_APL_T, RD_APL_T } },
-       /* 43 */
-       { TYPE_DS, "DS", 4, 4,
-         { RD_INT16_T, RD_INT8_T, RD_INT8_T, RD_HEX_T } },
-       /* 44 */
-       { TYPE_SSHFP, "SSHFP", 3, 3, { RD_INT8_T, RD_INT8_T, RD_HEX_T } },
-       /* 45 */
-       { 45, NULL, 1, 1, {  RD_UNKNOWN_T } },
-       /* 46 */
-       { TYPE_RRSIG, "RRSIG", 9, 9,
-         { RD_TYPE_T, RD_INT8_T, RD_INT8_T, RD_INT32_T,
-           RD_INT32_T, RD_INT32_T, RD_INT16_T, RD_DNAME_T, RD_B64_T } },
-       /* 47 */
-       { TYPE_NSEC, "NSEC", 2, 2,
-         { RD_DNAME_T, RD_NSEC_T } },
-       /* 48 */
-       { TYPE_DNSKEY, "DNSKEY", 4, 4,
-         { RD_INT16_T, RD_INT8_T, RD_ALG_T, RD_B64_T } },
-};
diff --git a/rr.c b/rr.c
index 5bb1202eba22207d88cd6943e51c958963f0a574..568309cf707851732c1577aedfc3441a935389d6 100644 (file)
--- a/rr.c
+++ b/rr.c
@@ -122,3 +122,231 @@ ldns_rr_rd_count(t_rr *rr)
 {
        return rr->_rd_count;
 }
+
+static const ldns_rdata_field_type type_0_wireformat[] = { RD_UNKNOWN_T };
+static const ldns_rdata_field_type type_a_wireformat[] = { RD_A_T };
+static const ldns_rdata_field_type type_ns_wireformat[] = { RD_DNAME_T };
+static const ldns_rdata_field_type type_md_wireformat[] = { RD_DNAME_T };
+static const ldns_rdata_field_type type_mf_wireformat[] = { RD_DNAME_T };
+static const ldns_rdata_field_type type_cname_wireformat[] = { RD_DNAME_T };
+static const ldns_rdata_field_type type_soa_wireformat[] = {
+       RD_DNAME_T, RD_DNAME_T, RD_INT32_T, RD_INT32_T,
+       RD_INT32_T, RD_INT32_T, RD_INT32_T
+};
+static const ldns_rdata_field_type type_mb_wireformat[] = { RD_DNAME_T };
+static const ldns_rdata_field_type type_mg_wireformat[] = { RD_DNAME_T };
+static const ldns_rdata_field_type type_mr_wireformat[] = { RD_DNAME_T };
+static const ldns_rdata_field_type type_wks_wireformat[] = {
+       RD_A_T, RD_SERVICE_T
+};
+static const ldns_rdata_field_type type_ptr_wireformat[] = { RD_DNAME_T };
+static const ldns_rdata_field_type type_hinfo_wireformat[] = {
+       RD_STR_T, RD_STR_T
+};
+static const ldns_rdata_field_type type_minfo_wireformat[] = {
+       RD_DNAME_T, RD_DNAME_T
+};
+static const ldns_rdata_field_type type_mx_wireformat[] = {
+       RD_INT8_T, RD_DNAME_T
+};
+static const ldns_rdata_field_type type_rp_wireformat[] = {
+       RD_DNAME_T, RD_DNAME_T
+};
+static const ldns_rdata_field_type type_afsdb_wireformat[] = {
+       RD_INT8_T, RD_DNAME_T
+};
+static const ldns_rdata_field_type type_x25_wireformat[] = { RD_STR_T };
+static const ldns_rdata_field_type type_isdn_wireformat[] = {
+       RD_STR_T, RD_STR_T
+};
+static const ldns_rdata_field_type type_rt_wireformat[] = {
+       RD_INT8_T, RD_DNAME_T
+};
+static const ldns_rdata_field_type type_sig_wireformat[] = {
+       RD_INT8_T, RD_INT8_T, RD_INT8_T, RD_INT32_T,
+       RD_INT32_T, RD_INT32_T, RD_INT16_T,
+       RD_DNAME_T, RD_B64_T
+};
+static const ldns_rdata_field_type type_key_wireformat[] = {
+       RD_INT16_T, RD_INT8_T, RD_INT8_T, RD_B64_T
+};
+static const ldns_rdata_field_type type_px_wireformat[] = {
+       RD_INT16_T, RD_DNAME_T, RD_DNAME_T
+};
+static const ldns_rdata_field_type type_aaaa_wireformat[] = { RD_AAAA_T };
+static const ldns_rdata_field_type type_loc_wireformat[] = { RD_LOC_T };
+static const ldns_rdata_field_type type_nxt_wireformat[] = {
+       RD_DNAME_T, RD_UNKNOWN_T
+};
+static const ldns_rdata_field_type type_srv_wireformat[] = {
+       RD_INT16_T, RD_INT16_T, RD_INT16_T, RD_DNAME_T
+};
+static const ldns_rdata_field_type type_naptr_wireformat[] = {
+       RD_INT16_T, RD_INT16_T, RD_STR_T, RD_STR_T, RD_STR_T, RD_DNAME_T
+};
+static const ldns_rdata_field_type type_kx_wireformat[] = {
+       RD_INT16_T, RD_DNAME_T
+};
+static const ldns_rdata_field_type type_cert_wireformat[] = {
+        RD_CERT_T, RD_INT16_T, RD_ALG_T, RD_B64_T
+};
+static const ldns_rdata_field_type type_dname_wireformat[] = { RD_DNAME_T };
+static const ldns_rdata_field_type type_ds_wireformat[] = {
+       RD_INT16_T, RD_INT8_T, RD_INT8_T, RD_HEX_T
+};
+static const ldns_rdata_field_type type_sshfp_wireformat[] = {
+       RD_INT8_T, RD_INT8_T, RD_HEX_T
+};
+static const ldns_rdata_field_type type_rrsig_wireformat[] = {
+       RD_TYPE_T, RD_INT8_T, RD_INT8_T, RD_INT32_T,
+       RD_INT32_T, RD_INT32_T, RD_INT16_T, RD_DNAME_T, RD_B64_T
+};
+static const ldns_rdata_field_type type_nsec_wireformat[] = {
+       RD_DNAME_T, RD_NSEC_T
+};
+static const ldns_rdata_field_type type_dnskey_wireformat[] = {
+       RD_INT16_T, RD_INT8_T, RD_ALG_T, RD_B64_T
+};
+
+static ldns_rr_descriptor_type rdata_field_descriptors[] = {
+       /* 0 */
+       { 0, NULL, 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 1 */
+       { TYPE_A, "A", 1, 1, type_a_wireformat, RD_NONE_T },
+       /* 2 */
+       { TYPE_NS, "NS", 1, 1, type_ns_wireformat, RD_NONE_T },
+       /* 3 */
+       { TYPE_MD, "MD", 1, 1, type_md_wireformat, RD_NONE_T },
+       /* 4 */ 
+       { TYPE_MF, "MF", 1, 1, type_mf_wireformat, RD_NONE_T },
+       /* 5 */
+       { TYPE_CNAME, "CNAME", 1, 1, type_cname_wireformat, RD_NONE_T },
+       /* 6 */
+       { TYPE_SOA, "SOA", 7, 7, type_soa_wireformat, RD_NONE_T },
+       /* 7 */
+       { TYPE_MB, "MB", 1, 1, type_mb_wireformat, RD_NONE_T },
+       /* 8 */
+       { TYPE_MG, "MG", 1, 1, type_mg_wireformat, RD_NONE_T },
+       /* 9 */
+       { TYPE_MR, "MR", 1, 1, type_mr_wireformat, RD_NONE_T },
+       /* 10 */
+       { TYPE_NULL, "NULL", 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 11 */
+       { TYPE_WKS, "WKS", 2, 2, type_wks_wireformat, RD_NONE_T },
+       /* 12 */
+       { TYPE_PTR, "PTR", 1, 1, type_ptr_wireformat, RD_NONE_T },
+       /* 13 */
+       { TYPE_HINFO, "HINFO", 2, 2, type_hinfo_wireformat, RD_NONE_T },
+       /* 14 */
+       { TYPE_MINFO, "MINFO", 2, 2, type_minfo_wireformat, RD_NONE_T },
+       /* 15 */
+       { TYPE_MX, "MX", 2, 2, type_mx_wireformat, RD_NONE_T },
+       /* 16 */
+       { TYPE_TXT, "TXT", 1, 0, NULL, RD_STR_T },
+       /* 17 */
+       { TYPE_RP, "RP", 2, 2, type_rp_wireformat, RD_NONE_T },
+       /* 18 */
+       { TYPE_AFSDB, "AFSDB", 2, 2, type_afsdb_wireformat, RD_NONE_T },
+       /* 19 */
+       { TYPE_X25, "X25", 1, 1, type_x25_wireformat, RD_NONE_T },
+       /* 20 */
+       { TYPE_ISDN, "ISDN", 1, 2, type_isdn_wireformat, RD_NONE_T },
+       /* 21 */
+       { TYPE_RT, "RT", 2, 2, type_rt_wireformat, RD_NONE_T },
+       /* 22 */
+       { TYPE_NSAP, "NSAP", 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 23 */
+       { 23, NULL, 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 24 */
+       { TYPE_SIG, "SIG", 9, 9, type_sig_wireformat, RD_NONE_T },
+       /* 25 */
+       { TYPE_KEY, "KEY", 4, 4, type_key_wireformat, RD_NONE_T },
+       /* 26 */
+       { TYPE_PX, "PX", 3, 3, type_px_wireformat, RD_NONE_T },
+       /* 27 */
+       { 27, NULL, 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 28 */
+       { TYPE_AAAA, "AAAA", 1, 1, type_aaaa_wireformat, RD_NONE_T },
+       /* 29 */
+       { TYPE_LOC, "LOC", 1, 1, type_loc_wireformat, RD_NONE_T },
+       /* 30 */
+       { TYPE_NXT, "NXT", 2, 2, type_nxt_wireformat, RD_NONE_T },
+       /* 31 */
+       { 31, NULL, 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 32 */
+       { 32, NULL, 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 33 */
+       { TYPE_SRV, "SRV", 4, 4, type_srv_wireformat, RD_NONE_T },
+       /* 34 */
+       { 34, NULL, 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 35 */
+       { TYPE_NAPTR, "NAPTR", 6, 6, type_naptr_wireformat, RD_NONE_T },
+       /* 36 */
+       { TYPE_KX, "KX", 2, 2, type_kx_wireformat, RD_NONE_T },
+       /* 37 */
+       { TYPE_CERT, "CERT", 4, 4, type_cert_wireformat, RD_NONE_T },
+       /* 38 */
+       { 38, NULL, 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 39 */
+       { TYPE_DNAME, "DNAME", 1, 1, type_dname_wireformat, RD_NONE_T },
+       /* 40 */
+       { 40, NULL, 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 41 */
+       { TYPE_OPT, "OPT", 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 42 */
+       { TYPE_APL, "APL", 0, 0, NULL, RD_APL_T },
+       /* 43 */
+       { TYPE_DS, "DS", 4, 4, type_ds_wireformat, RD_NONE_T },
+       /* 44 */
+       { TYPE_SSHFP, "SSHFP", 3, 3, type_sshfp_wireformat, RD_NONE_T },
+       /* 45 */
+       { 45, NULL, 1, 1, type_0_wireformat, RD_NONE_T },
+       /* 46 */
+       { TYPE_RRSIG, "RRSIG", 9, 9, type_rrsig_wireformat, RD_NONE_T },
+       /* 47 */
+       { TYPE_NSEC, "NSEC", 2, 2, type_nsec_wireformat, RD_NONE_T },
+       /* 48 */
+       { TYPE_DNSKEY, "DNSKEY", 4, 4, type_dnskey_wireformat, RD_NONE_T }
+};
+
+#define RDATA_FIELD_DESCRIPTORS_COUNT \
+       (sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0]))
+
+const ldns_rr_descriptor_type *
+ldns_rr_descriptor(uint16_t type)
+{
+       if (type < RDATA_FIELD_DESCRIPTORS_COUNT) {
+               return &rdata_field_descriptors[type];
+       } else {
+               return &rdata_field_descriptors[0];
+       }
+}
+
+size_t
+ldns_rr_descriptor_minimum(ldns_rr_descriptor_type *descriptor)
+{
+       return descriptor->_minimum;
+}
+
+size_t
+ldns_rr_descriptor_maximum(ldns_rr_descriptor_type *descriptor)
+{
+       if (descriptor->_variable != RD_NONE_T) {
+               return SIZE_MAX;
+       } else {
+               return descriptor->_maximum;
+       }
+}
+
+ldns_rdata_field_type
+ldns_rr_descriptor_field_type(ldns_rr_descriptor_type *descriptor, size_t index)
+{
+       assert(descriptor);
+       assert(index < descriptor->_maximum
+              || descriptor->_variable != RD_NONE_T);
+       if (index < descriptor->_maximum) {
+               return descriptor->_wireformat[index];
+       } else {
+               return descriptor->_variable;
+       }
+}