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