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

Add descriptors for some obsolete records

parent 754f1105
No related branches found
No related tags found
No related merge requests found
......@@ -136,6 +136,30 @@ static const rdata_descriptor_t rdata_descriptors[] = {
KNOT_RDATA_WF_END }, "ANY" },
};
/*!
* \brief Some (OBSOLETE) RR type 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_RDATA_WF_END }, "MD" },
[KNOT_RRTYPE_MF] = { { KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "MF" },
[KNOT_RRTYPE_MB] = { { KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "MB" },
[KNOT_RRTYPE_MG] = { { KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "MG" },
[KNOT_RRTYPE_MR] = { { KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "MR" },
[KNOT_RRTYPE_PX] = { { 2, KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "PX" },
[KNOT_RRTYPE_NXT] = { { KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_REMAINDER,
KNOT_RDATA_WF_END }, "NXT" },
};
const rdata_descriptor_t *get_rdata_descriptor(const uint16_t type)
{
if (type <= KNOT_RRTYPE_ANY && rdata_descriptors[type].type_name != 0) {
......@@ -145,6 +169,16 @@ const rdata_descriptor_t *get_rdata_descriptor(const uint16_t type)
}
}
const rdata_descriptor_t *get_obsolete_rdata_descriptor(const uint16_t type)
{
if (type <= KNOT_RRTYPE_NXT &&
obsolete_rdata_descriptors[type].type_name != 0) {
return &obsolete_rdata_descriptors[type];
} else {
return &obsolete_rdata_descriptors[0];
}
}
int knot_rrtype_to_string(const uint16_t rrtype,
char *out,
const size_t out_len)
......
......@@ -109,6 +109,25 @@ enum knot_rr_type {
KNOT_RRTYPE_ANY = 255 /*!< QTYPE. Any record. */
};
/*!
* \brief Some (OBSOLETE) resource record type constants.
*
* http://www.iana.org/assignments/dns-parameters/dns-parameters.xml
*
* \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.
*/
enum knot_obsolete_rr_type {
KNOT_RRTYPE_MD = 3,
KNOT_RRTYPE_MF = 4,
KNOT_RRTYPE_MB = 7,
KNOT_RRTYPE_MG = 8,
KNOT_RRTYPE_MR = 9,
KNOT_RRTYPE_PX = 26,
KNOT_RRTYPE_NXT = 30
};
/*!
* \brief Constants characterising the wire format of RDATA items.
*/
......@@ -138,13 +157,23 @@ typedef struct {
/*!
* \brief Gets rdata descriptor for given RR name.
*
* \param name Mnemonic of RR type whose descriptor should be retvaled.
* \param name Mnemonic of RR type whose descriptor should be returned.
*
* \retval RR descriptor for given name, NULL descriptor if
* unknown type.
*/
const rdata_descriptor_t *get_rdata_descriptor(const uint16_t type);
/*!
* \brief Gets rdata descriptor for given RR name (obsolete version).
*
* \param name Mnemonic of RR type whose descriptor should be returned.
*
* \retval RR descriptor for given name, NULL descriptor if
* unknown type.
*/
const rdata_descriptor_t *get_obsolete_rdata_descriptor(const uint16_t type);
/*!
* \brief Converts numeric type representation to mnemonic string.
*
......
......@@ -36,7 +36,7 @@ unit_api descriptor_tests_api = {
static int descriptor_tests_count(int argc, char *argv[])
{
return 68;
return 81;
}
static int descriptor_tests_run(int argc, char *argv[])
......@@ -230,5 +230,40 @@ static int descriptor_tests_run(int argc, char *argv[])
ret = knot_rrclass_from_string("CLASS65536", &num);
cmp_ok(ret, "==", -1, "get CLASS65536 num ret");
// Get obsolete descriptor:
// 30. TYPE0
descr = get_obsolete_rdata_descriptor(0);
ok(descr->type_name == 0, "get TYPE0 descriptor name");
cmp_ok(descr->block_types[0], "==", KNOT_RDATA_WF_REMAINDER,
"get TYPE0 descriptor 1. item type");
cmp_ok(descr->block_types[1], "==", KNOT_RDATA_WF_END,
"get TYPE0 descriptor 2. item type");
// 31. MD
descr = get_obsolete_rdata_descriptor(3);
ok(strcmp(descr->type_name, "MD") == 0, "get MD descriptor name");
cmp_ok(descr->block_types[0], "==", KNOT_RDATA_WF_COMPRESSED_DNAME,
"get A descriptor 1. item type");
cmp_ok(descr->block_types[1], "==", KNOT_RDATA_WF_END,
"get A descriptor 2. item type");
// 32. NXT
descr = get_obsolete_rdata_descriptor(30);
ok(strcmp(descr->type_name, "NXT") == 0, "get NXT descriptor name");
cmp_ok(descr->block_types[0], "==", KNOT_RDATA_WF_COMPRESSED_DNAME,
"get CNAME descriptor 1. item type");
cmp_ok(descr->block_types[1], "==", KNOT_RDATA_WF_REMAINDER,
"get CNAME descriptor 2. item type");
cmp_ok(descr->block_types[2], "==", KNOT_RDATA_WF_END,
"get CNAME descriptor 3. item type");
// 33. TYPE38 (A6)
descr = get_obsolete_rdata_descriptor(38);
ok(descr->type_name == 0, "get TYPE38 descriptor name");
cmp_ok(descr->block_types[0], "==", KNOT_RDATA_WF_REMAINDER,
"get TYPE38 descriptor 1. item type");
cmp_ok(descr->block_types[1], "==", KNOT_RDATA_WF_END,
"get TYPE38 descriptor 2. item type");
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment