/*----------------------------------------------------------------------------*/ _public_ int knot_edns_init(knot_rrset_t *opt_rr, uint16_t max_pld, uint8_t ext_rcode, uint8_t ver, mm_ctx_t *mm) { if (opt_rr == NULL) { return KNOT_EINVAL; } /* Initialize RRSet. */ knot_dname_t *owner = knot_dname_copy((const uint8_t*)"", mm); if (owner == NULL) { return KNOT_ENOMEM; } knot_rrset_init(opt_rr, owner, KNOT_RRTYPE_OPT, max_pld); /* Create empty RDATA */ int ret = knot_rrset_add_rdata(opt_rr, NULL, 0, 0, mm); if (ret == KNOT_EOK) { knot_edns_set_ext_rcode(opt_rr, ext_rcode); knot_edns_set_version(opt_rr, ver); } return ret; }
static bool test_setters(knot_rrset_t *opt_rr, int *done) { assert(opt_rr != NULL); assert(done != NULL); /* Header-related setters. */ knot_edns_set_payload(opt_rr, E_MAX_PLD2); knot_edns_set_ext_rcode(opt_rr, E_RCODE2); knot_edns_set_version(opt_rr, E_VERSION2); knot_edns_set_do(opt_rr); bool success = true; bool check = check_header(opt_rr, E_MAX_PLD2, E_VERSION2, DO_FLAG, E_RCODE2, "OPT RR setters", done); success &= check; /* OPTION(RDATA)-related setters. */ /* Proper option. */ int ret = knot_edns_add_option(opt_rr, KNOT_EDNS_OPTION_NSID, E_NSID_LEN, (uint8_t *)E_NSID_STR, NULL); ok(ret == KNOT_EOK, "OPT RR setters: add option with data (ret = %s)", knot_strerror(ret)); (*done)++; /* Wrong argument: no OPT RR. */ ret = knot_edns_add_option(NULL, E_OPT3_CODE, E_OPT3_FAKE_LEN, (uint8_t *)E_OPT3_FAKE_DATA, NULL); ok(ret == KNOT_EINVAL, "OPT RR setters: add option (rr == NULL) " "(ret = %s)", knot_strerror(ret)); (*done)++; /* Wrong argument: option length != 0 && data == NULL. */ ret = knot_edns_add_option(opt_rr, E_OPT3_CODE, E_OPT3_FAKE_LEN, NULL, NULL); ok(ret == KNOT_EINVAL, "OPT RR setters: add option (data == NULL, " "len != 0) (ret = %s)", knot_strerror(ret)); (*done)++; /* Empty OPTION (length 0, data != NULL). */ ret = knot_edns_add_option(opt_rr, E_OPT3_CODE, E_OPT3_LEN, (uint8_t *)E_OPT3_FAKE_DATA, NULL); ok(ret == KNOT_EOK, "OPT RR setters: add empty option 1 (ret = %s)", knot_strerror(ret)); (*done)++; /* Empty OPTION (length 0, data == NULL). */ ret = knot_edns_add_option(opt_rr, E_OPT4_CODE, E_OPT4_LEN, (uint8_t *)E_OPT4_DATA, NULL); ok(ret == KNOT_EOK, "OPT RR setters: add empty option 2 (ret = %s)", knot_strerror(ret)); (*done)++; knot_rdata_t *rdata = knot_rdataset_at(&opt_rr->rrs, 0); if (rdata == NULL) { skip_block(2, "No RDATA in OPT RR."); return false; } /* Check proper option */ check = check_option(rdata, KNOT_EDNS_OPTION_NSID, E_NSID_LEN, (uint8_t *)E_NSID_STR, "OPT RR setters (proper option)", done); success &= check; /* Check empty option 1 */ check = check_option(rdata, E_OPT3_CODE, E_OPT3_LEN, (uint8_t *)E_OPT3_DATA, "OPT RR setters (empty option 1)", done); success &= check; /* Check empty option 2 */ check = check_option(rdata, E_OPT4_CODE, E_OPT4_LEN, (uint8_t *)E_OPT4_DATA, "OPT RR setters (empty option 2)", done); success &= check; return success; }