From 147bf96a32960215654ecaa8c520b533ffbc2761 Mon Sep 17 00:00:00 2001 From: Daniel Salzman <daniel.salzman@nic.cz> Date: Wed, 20 Aug 2014 10:25:29 +0200 Subject: [PATCH] descriptor: add decompressible rdata item type --- src/libknot/descriptor.c | 70 +++++++++++++++++++--------------------- src/libknot/descriptor.h | 29 +++++++---------- src/libknot/rrset.c | 7 ++-- tests/descriptor.c | 24 ++++++-------- 4 files changed, 59 insertions(+), 71 deletions(-) diff --git a/src/libknot/descriptor.c b/src/libknot/descriptor.c index 20b3df9e2..76b99783c 100644 --- a/src/libknot/descriptor.c +++ b/src/libknot/descriptor.c @@ -37,48 +37,48 @@ static const rdata_descriptor_t rdata_descriptors[] = { [0] = { { KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, NULL }, [KNOT_RRTYPE_A] = { { 4, KNOT_RDATA_WF_END }, "A" }, - [KNOT_RRTYPE_NS] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_NS] = { { KNOT_RDATA_WF_COMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "NS" }, - [KNOT_RRTYPE_CNAME] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_CNAME] = { { KNOT_RDATA_WF_COMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "CNAME" }, - [KNOT_RRTYPE_SOA] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, - KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_SOA] = { { KNOT_RDATA_WF_COMPRESSIBLE_DNAME, + KNOT_RDATA_WF_COMPRESSIBLE_DNAME, 20, KNOT_RDATA_WF_END }, "SOA" }, - [KNOT_RRTYPE_PTR] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_PTR] = { { KNOT_RDATA_WF_COMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "PTR" }, [KNOT_RRTYPE_HINFO] = { { KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "HINFO" }, - [KNOT_RRTYPE_MINFO] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, - KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_MINFO] = { { KNOT_RDATA_WF_COMPRESSIBLE_DNAME, + KNOT_RDATA_WF_COMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "MINFO" }, - [KNOT_RRTYPE_MX] = { { 2, KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_MX] = { { 2, KNOT_RDATA_WF_COMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "MX" }, [KNOT_RRTYPE_TXT] = { { KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "TXT" }, - [KNOT_RRTYPE_RP] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, - KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_RP] = { { KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, + KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "RP" }, - [KNOT_RRTYPE_AFSDB] = { { 2, KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_AFSDB] = { { 2, KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "AFSDB" }, - [KNOT_RRTYPE_RT] = { { 2, KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_RT] = { { 2, KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "RT" }, - [KNOT_RRTYPE_SIG] = { { 18, KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_SIG] = { { 18, KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "SIG" }, [KNOT_RRTYPE_KEY] = { { KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "KEY" }, [KNOT_RRTYPE_AAAA] = { { 16, KNOT_RDATA_WF_END }, "AAAA" }, [KNOT_RRTYPE_LOC] = { { 16, KNOT_RDATA_WF_END }, "LOC" }, - [KNOT_RRTYPE_SRV] = { { 6, KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_SRV] = { { 6, KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "SRV" }, [KNOT_RRTYPE_NAPTR] = { { KNOT_RDATA_WF_NAPTR_HEADER, - KNOT_RDATA_WF_COMPRESSED_DNAME, + KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "NAPTR" }, - [KNOT_RRTYPE_KX] = { { 2, KNOT_RDATA_WF_UNCOMPRESSED_DNAME, + [KNOT_RRTYPE_KX] = { { 2, KNOT_RDATA_WF_FIXED_DNAME, KNOT_RDATA_WF_END }, "KX" }, [KNOT_RRTYPE_CERT] = { { KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "CERT" }, - [KNOT_RRTYPE_DNAME] = { { KNOT_RDATA_WF_UNCOMPRESSED_DNAME, + [KNOT_RRTYPE_DNAME] = { { KNOT_RDATA_WF_FIXED_DNAME, KNOT_RDATA_WF_END }, "DNAME" }, [KNOT_RRTYPE_OPT] = { { KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "OPT" }, @@ -90,10 +90,10 @@ static const rdata_descriptor_t rdata_descriptors[] = { KNOT_RDATA_WF_END }, "SSHFP" }, [KNOT_RRTYPE_IPSECKEY] = { { KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "IPSECKEY" }, - [KNOT_RRTYPE_RRSIG] = { { 18, KNOT_RDATA_WF_UNCOMPRESSED_DNAME, + [KNOT_RRTYPE_RRSIG] = { { 18, KNOT_RDATA_WF_FIXED_DNAME, KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "RRSIG" }, - [KNOT_RRTYPE_NSEC] = { { KNOT_RDATA_WF_UNCOMPRESSED_DNAME, + [KNOT_RRTYPE_NSEC] = { { KNOT_RDATA_WF_FIXED_DNAME, KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "NSEC" }, [KNOT_RRTYPE_DNSKEY] = { { KNOT_RDATA_WF_REMAINDER, @@ -111,14 +111,14 @@ static const rdata_descriptor_t rdata_descriptors[] = { [KNOT_RRTYPE_NID] = { { 10, KNOT_RDATA_WF_END }, "NID" }, [KNOT_RRTYPE_L32] = { { 6, KNOT_RDATA_WF_END }, "L32" }, [KNOT_RRTYPE_L64] = { { 10, KNOT_RDATA_WF_END }, "L64" }, - [KNOT_RRTYPE_LP] = { { 2, KNOT_RDATA_WF_UNCOMPRESSED_DNAME, + [KNOT_RRTYPE_LP] = { { 2, KNOT_RDATA_WF_FIXED_DNAME, KNOT_RDATA_WF_END }, "LP" }, [KNOT_RRTYPE_EUI48] = { { 6, KNOT_RDATA_WF_END }, "EUI48" }, [KNOT_RRTYPE_EUI64] = { { 8, KNOT_RDATA_WF_END }, "EUI64" }, - [KNOT_RRTYPE_TKEY] = { { KNOT_RDATA_WF_UNCOMPRESSED_DNAME, + [KNOT_RRTYPE_TKEY] = { { KNOT_RDATA_WF_FIXED_DNAME, KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "TKEY" }, - [KNOT_RRTYPE_TSIG] = { { KNOT_RDATA_WF_UNCOMPRESSED_DNAME, + [KNOT_RRTYPE_TSIG] = { { KNOT_RDATA_WF_FIXED_DNAME, KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "TSIG" }, [KNOT_RRTYPE_IXFR] = { { KNOT_RDATA_WF_REMAINDER, @@ -135,20 +135,20 @@ static const rdata_descriptor_t rdata_descriptors[] = { static const rdata_descriptor_t obsolete_rdata_descriptors[] = { [0] = { { KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, NULL }, - [KNOT_RRTYPE_MD] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_MD] = { { KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "MD" }, - [KNOT_RRTYPE_MF] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_MF] = { { KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "MF" }, - [KNOT_RRTYPE_MB] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_MB] = { { KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "MB" }, - [KNOT_RRTYPE_MG] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_MG] = { { KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "MG" }, - [KNOT_RRTYPE_MR] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_MR] = { { KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "MR" }, - [KNOT_RRTYPE_PX] = { { 2, KNOT_RDATA_WF_COMPRESSED_DNAME, - KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_PX] = { { 2, KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, + KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_END }, "PX" }, - [KNOT_RRTYPE_NXT] = { { KNOT_RDATA_WF_COMPRESSED_DNAME, + [KNOT_RRTYPE_NXT] = { { KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, KNOT_RDATA_WF_REMAINDER, KNOT_RDATA_WF_END }, "NXT" }, }; @@ -295,13 +295,9 @@ int knot_rrclass_from_string(const char *name, uint16_t *num) int knot_descriptor_item_is_dname(const int item) { - return item == KNOT_RDATA_WF_COMPRESSED_DNAME || - item == KNOT_RDATA_WF_UNCOMPRESSED_DNAME; -} - -int knot_descriptor_item_is_compr_dname(const int item) -{ - return item == KNOT_RDATA_WF_COMPRESSED_DNAME; + return item == KNOT_RDATA_WF_FIXED_DNAME || + item == KNOT_RDATA_WF_COMPRESSIBLE_DNAME || + item == KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME; } int knot_descriptor_item_is_fixed(const int item) diff --git a/src/libknot/descriptor.h b/src/libknot/descriptor.h index 7c5076687..9cb24ae60 100644 --- a/src/libknot/descriptor.h +++ b/src/libknot/descriptor.h @@ -45,7 +45,9 @@ enum knot_rr_class { /*! * \brief Resource record type constants. * + * References: * http://www.iana.org/assignments/dns-parameters/dns-parameters.xml + * RFC 3597#4 * * METATYPE: Contains DNS data that can't be in a zone file. * QTYPE: Specifies DNS query type; can't be in a zone file. @@ -114,11 +116,12 @@ enum knot_rr_type { /*! * \brief Some (OBSOLETE) resource record type constants. * + * References: * http://www.iana.org/assignments/dns-parameters/dns-parameters.xml + * RFC 3597#4 * * \note These records can contain compressed domain name in rdata so - * it is important to know the position of it during transfers. - * See RFC 3597#4. + * it is important to know the position of them during transfers. */ enum knot_obsolete_rr_type { KNOT_RRTYPE_MD = 3, @@ -134,16 +137,18 @@ enum knot_obsolete_rr_type { * \brief Constants characterising the wire format of RDATA items. */ enum knot_rdata_wireformat { - /*!< Possibly compressed dname. */ - KNOT_RDATA_WF_COMPRESSED_DNAME = -10, - /*!< Uncompressed dname. */ - KNOT_RDATA_WF_UNCOMPRESSED_DNAME, + /*!< Dname must not be compressed. */ + KNOT_RDATA_WF_FIXED_DNAME = -10, + /*!< Dname can be both compressed and decompressed. */ + KNOT_RDATA_WF_COMPRESSIBLE_DNAME, + /*!< Dname can be decompressed. */ + KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, /*!< Initial part of NAPTR record before dname. */ KNOT_RDATA_WF_NAPTR_HEADER, /*!< Final part of a record. */ KNOT_RDATA_WF_REMAINDER, /*!< The last descriptor in array. */ - KNOT_RDATA_WF_END = 0 + KNOT_RDATA_WF_END = 0 }; /*! @@ -236,16 +241,6 @@ int knot_rrclass_from_string(const char *name, uint16_t *num); */ int knot_descriptor_item_is_dname(const int item); -/*! - * \brief Checks if given item is compressible dname. - * - * \param item Item value. - * - * \retval > 0 if YES. - * \retval 0 if NO. - */ -int knot_descriptor_item_is_compr_dname(const int item); - /*! * \brief Checks if given item has fixed size. * diff --git a/src/libknot/rrset.c b/src/libknot/rrset.c index b8e66f406..833f558af 100644 --- a/src/libknot/rrset.c +++ b/src/libknot/rrset.c @@ -293,10 +293,11 @@ static int write_rdata_block(uint8_t **src, size_t *src_avail, knot_rrset_wire_flags_t flags) { switch (type) { - case KNOT_RDATA_WF_COMPRESSED_DNAME: + case KNOT_RDATA_WF_COMPRESSIBLE_DNAME: return write_rdata_dname(src, src_avail, wire, capacity, compr, compr_hint_id, true, flags); - case KNOT_RDATA_WF_UNCOMPRESSED_DNAME: + case KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME: + case KNOT_RDATA_WF_FIXED_DNAME: return write_rdata_dname(src, src_avail, wire, capacity, compr, compr_hint_id, false, flags); case KNOT_RDATA_WF_NAPTR_HEADER: @@ -541,7 +542,7 @@ int knot_rrset_rdata_from_wire_one(knot_rrset_t *rrset, if (total_size - *pos < rdlength) { return KNOT_EMALF; } - + const rdata_descriptor_t *desc = knot_get_rdata_descriptor(rrset->type); /* Check for obsolete record. */ diff --git a/tests/descriptor.c b/tests/descriptor.c index a90486b05..8689bf561 100644 --- a/tests/descriptor.c +++ b/tests/descriptor.c @@ -25,7 +25,7 @@ int main(int argc, char *argv[]) { - plan(108); + plan(107); const rdata_descriptor_t *descr; char name[BUF_LEN]; @@ -60,7 +60,7 @@ int main(int argc, char *argv[]) // 3. CNAME descr = knot_get_rdata_descriptor(5); ok(strcmp(descr->type_name, "CNAME") == 0, "get CNAME descriptor name"); - ok(descr->block_types[0] == KNOT_RDATA_WF_COMPRESSED_DNAME, + ok(descr->block_types[0] == KNOT_RDATA_WF_COMPRESSIBLE_DNAME, "get CNAME descriptor 1. item type"); ok(descr->block_types[1] == KNOT_RDATA_WF_END, "get CNAME descriptor 2. item type"); @@ -228,7 +228,7 @@ int main(int argc, char *argv[]) // 31. MD descr = knot_get_obsolete_rdata_descriptor(3); ok(strcmp(descr->type_name, "MD") == 0, "get MD descriptor name"); - ok(descr->block_types[0] == KNOT_RDATA_WF_COMPRESSED_DNAME, + ok(descr->block_types[0] == KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, "get A descriptor 1. item type"); ok(descr->block_types[1] == KNOT_RDATA_WF_END, "get A descriptor 2. item type"); @@ -236,7 +236,7 @@ int main(int argc, char *argv[]) // 32. NXT descr = knot_get_obsolete_rdata_descriptor(30); ok(strcmp(descr->type_name, "NXT") == 0, "get NXT descriptor name"); - ok(descr->block_types[0] == KNOT_RDATA_WF_COMPRESSED_DNAME, + ok(descr->block_types[0] == KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME, "get CNAME descriptor 1. item type"); ok(descr->block_types[1] == KNOT_RDATA_WF_REMAINDER, "get CNAME descriptor 2. item type"); @@ -262,16 +262,12 @@ int main(int argc, char *argv[]) // descriptor_item_is_dname ok(knot_descriptor_item_is_dname(KNOT_RDATA_WF_END) == 0, "descriptor is not dname"); - ok(knot_descriptor_item_is_dname(KNOT_RDATA_WF_COMPRESSED_DNAME) != 0, - "descriptor is compressed dname"); - ok(knot_descriptor_item_is_dname(KNOT_RDATA_WF_UNCOMPRESSED_DNAME) != 0, - "descriptor is uncompressed dname"); - - // descriptor_item_is_compr_dname - ok(knot_descriptor_item_is_compr_dname(KNOT_RDATA_WF_END) == 0, - "descriptor is not compressed dname"); - ok(knot_descriptor_item_is_compr_dname(KNOT_RDATA_WF_COMPRESSED_DNAME) != 0, - "descriptor is compressed dname"); + ok(knot_descriptor_item_is_dname(KNOT_RDATA_WF_FIXED_DNAME) != 0, + "descriptor is fixed dname"); + ok(knot_descriptor_item_is_dname(KNOT_RDATA_WF_COMPRESSIBLE_DNAME) != 0, + "descriptor is compressible dname"); + ok(knot_descriptor_item_is_dname(KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME) != 0, + "descriptor is decompressible dname"); // descriptor_item_is_fixed ok(knot_descriptor_item_is_fixed(0) == 0, -- GitLab