diff --git a/lib/defines.h b/lib/defines.h index ae41050d062802e0345d61feceeeb4519112a5c6..e0cf92d80e347b59ab130237d2f40cadab40efad 100644 --- a/lib/defines.h +++ b/lib/defines.h @@ -35,3 +35,5 @@ */ #define KR_DNS_PORT 53 #define KR_DNAME_ROOT ((const knot_dname_t*)"") +#define KR_EDNS_VERSION 0 +#define KR_EDNS_PAYLOAD 4096 diff --git a/lib/layer/iterate.c b/lib/layer/iterate.c index 99ab3aa1a7062f64042bc61a3dc64e55a7a20caa..ddcf7c2f94bc8cd15cac4d932f738f9ae7926af5 100644 --- a/lib/layer/iterate.c +++ b/lib/layer/iterate.c @@ -296,6 +296,20 @@ static int prepare_query(knot_layer_t *ctx, knot_pkt_t *pkt) cur->id = knot_random_uint16_t(); knot_wire_set_id(pkt->wire, cur->id); + + /* Declare EDNS0 support. */ + knot_rrset_t opt_rr; + ret = knot_edns_init(&opt_rr, KR_EDNS_PAYLOAD, 0, KR_EDNS_VERSION, &pkt->mm); + if (ret != KNOT_EOK) { + return KNOT_NS_PROC_FAIL; + } + + knot_pkt_begin(pkt, KNOT_ADDITIONAL); + ret = knot_pkt_put(pkt, KNOT_COMPR_HINT_NONE, &opt_rr, KNOT_PF_FREE); + if (ret != KNOT_EOK) { + knot_rrset_clear(&opt_rr, &pkt->mm); + return KNOT_NS_PROC_FAIL; + } #ifndef NDEBUG char name_str[KNOT_DNAME_MAXLEN], zonecut_str[KNOT_DNAME_MAXLEN], ns_str[KNOT_DNAME_MAXLEN], type_str[16];