acl = acl_get_control(acladdr);
if((ret=deny_refuse_all(c, acl, worker, repinfo)) != -1)
{
+ /* parse packet to check for EDNS. Add EDE blocked if possible */
+ sldns_buffer_rewind(c->buffer)
+ if (msgparse_check_edns_in_packet(c->buffer))
+ EDNS_OPT_APPEND_EDE(edns, worker->scratchpad,
+ LDNS_EDE_BLOCKED, "");
+
if(ret == 1)
goto send_reply;
return ret;
}
}
}
+
+
+/** parse a DNS packet to find out if it contains an EDNS section */
+int
+msgparse_check_edns_in_packet(sldns_buffer* pkt)
+{
+ size_t rdata_len;
+ uint8_t* rdata_ptr;
+ log_assert(LDNS_QDCOUNT(sldns_buffer_begin(pkt)) == 1);
+ if(LDNS_ANCOUNT(sldns_buffer_begin(pkt)) != 0 ||
+ LDNS_NSCOUNT(sldns_buffer_begin(pkt)) != 0) {
+ if(!skip_pkt_rrs(pkt, ((int)LDNS_ANCOUNT(sldns_buffer_begin(pkt)))+
+ ((int)LDNS_NSCOUNT(sldns_buffer_begin(pkt)))))
+ return LDNS_RCODE_FORMERR;
+ }
+ /* check edns section is present */
+ if(LDNS_ARCOUNT(sldns_buffer_begin(pkt)) == 1)
+ return 0;
+ else
+ return 1;
+}
+
void log_edns_opt_list(enum verbosity_value level, const char* info_str,
struct edns_option* list);
+/**
+ * Verify if the packet contains EDNS (RFC6891)
+ * @param pkt: the packet.
+ * @return 0 if true, 1 if false
+ */
+int msgparse_check_edns_in_packet(sldns_buffer* pkt);
+
+
#endif /* UTIL_DATA_MSGPARSE_H */