Skip to content
Snippets Groups Projects
Commit 147bf96a authored by Daniel Salzman's avatar Daniel Salzman
Browse files

descriptor: add decompressible rdata item type

parent 3c8a4b95
Branches
Tags
No related merge requests found
......@@ -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)
......
......@@ -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.
*
......
......@@ -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. */
......
......@@ -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,
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment