/* Check if wildcard expansion detected for final query.
* If yes, copy authority. */
if ((qry->parent == NULL) && (qry->flags & QUERY_DNSSEC_WEXPAND)) {
- kr_ranked_rrarray_set_wire(&req->auth_selected, true, qry->uid);
+ kr_ranked_rrarray_set_wire(&req->auth_selected, true, qry->uid, true);
}
/* Check and update current delegation point security status. */
return kr_ok();
}
-int kr_ranked_rrarray_set_wire(ranked_rr_array_t *array, bool to_wire, uint32_t qry_uid)
+int kr_ranked_rrarray_set_wire(ranked_rr_array_t *array, bool to_wire,
+ uint32_t qry_uid, bool check_dups)
{
for (size_t i = 0; i < array->len; ++i) {
ranked_rr_array_entry_t *entry = array->at[i];
- if (entry->qry_uid == qry_uid) {
- entry->to_wire = to_wire;
+ if (entry->qry_uid != qry_uid) {
+ continue;
+ }
+ entry->to_wire = to_wire;
+ if (!check_dups) {
+ continue;
+ }
+ knot_rrset_t *rr = entry->rr;
+ for (size_t j = 0; j < array->len; ++j) {
+ ranked_rr_array_entry_t *stashed = array->at[j];
+ if (stashed->qry_uid == qry_uid) {
+ continue;
+ }
+ if (stashed->rr->rclass != rr->rclass ||
+ stashed->rr->type != rr->type) {
+ continue;
+ }
+ bool is_equal = knot_rrset_equal(rr, stashed->rr,
+ KNOT_RRSET_COMPARE_WHOLE);
+ if (is_equal && to_wire) {
+ stashed->to_wire = false;
+ }
}
}
return kr_ok();
int kr_ranked_rrarray_add(ranked_rr_array_t *array, const knot_rrset_t *rr,
uint8_t rank, bool to_wire, uint32_t qry_uid, knot_mm_t *pool);
-int kr_ranked_rrarray_set_wire(ranked_rr_array_t *array, bool to_wire, uint32_t qry_uid);
+int kr_ranked_rrarray_set_wire(ranked_rr_array_t *array, bool to_wire,
+ uint32_t qry_uid, bool check_dups);
void kr_rrset_print(const knot_rrset_t *rr, const char *prefix);
void kr_pkt_print(knot_pkt_t *pkt);