/** match edns sections */ static int match_edns(ldns_pkt* q, ldns_pkt* p) { if(ldns_pkt_edns_udp_size(q) != ldns_pkt_edns_udp_size(p)) return 0; if(ldns_pkt_edns_extended_rcode(q) != ldns_pkt_edns_extended_rcode(p)) return 0; if(ldns_pkt_edns_version(q) != ldns_pkt_edns_version(p)) return 0; if(ldns_pkt_edns_do(q) != ldns_pkt_edns_do(p)) return 0; if(ldns_pkt_edns_z(q) != ldns_pkt_edns_z(p)) return 0; if(ldns_rdf_compare(ldns_pkt_edns_data(q), ldns_pkt_edns_data(p)) != 0) return 0; return 1; }
/** Match q edns data to p raw edns data */ static int match_ednsdata(ldns_pkt* q, struct reply_packet* p) { size_t qdlen, pdlen; uint8_t *qd, *pd; if(!ldns_pkt_edns(q) || !ldns_pkt_edns_data(q)) { verbose(3, "No EDNS data\n"); return 0; } qdlen = ldns_rdf_size(ldns_pkt_edns_data(q)); pdlen = ldns_buffer_limit(p->raw_ednsdata); qd = ldns_rdf_data(ldns_pkt_edns_data(q)); pd = ldns_buffer_begin(p->raw_ednsdata); if( qdlen == pdlen && 0 == memcmp(qd, pd, qdlen) ) return 1; verbose(3, "EDNS data does not match.\n"); verbose_hex(3, qd, qdlen, "q:"); verbose_hex(3, pd, pdlen, "p:"); return 0; }