/* rejects packets that arrive with OPCODE != QUERY, or QDCOUNT != 1 */ void query_only(evldns_server_request *srq, void *user_data, ldns_rdf *qname, ldns_rr_type qtype, ldns_rr_class qclass) { ldns_pkt *req = srq->request; if (ldns_pkt_get_opcode(req) != LDNS_PACKET_QUERY) { srq->response = evldns_response(req, LDNS_RCODE_NOTIMPL); } if (ldns_pkt_qdcount(req) != 1) { srq->response = evldns_response(req, LDNS_RCODE_FORMERR); } }
void query_check(evldns_server_request *srq, ATTR_UNUSED(void *user_data), ATTR_UNUSED(ldns_rdf *qname), ldns_rr_type qtype, ldns_rr_class qclass) { ldns_pkt *req = srq->request; /* only QUERY is supported */ if (ldns_pkt_get_opcode(req) != LDNS_PACKET_QUERY) { srq->response = evldns_response(req, LDNS_RCODE_NOTIMPL); return; } /* QDCOUNT == 1, NB: QR == 1 now handled upstream */ if (ldns_pkt_qdcount(req) != 1) { srq->response = evldns_response(req, LDNS_RCODE_FORMERR); return; } /* Unexpected QCLASS */ if (qclass != LDNS_RR_CLASS_IN) { srq->response = evldns_response(req, LDNS_RCODE_NOTIMPL); return; } /* Unexpected QTYPE */ if (qtype == LDNS_RR_TYPE_AXFR || qtype == LDNS_RR_TYPE_IXFR) { srq->response = evldns_response(req, LDNS_RCODE_NOTIMPL); return; } /* Not going to handle QTYPE == ANY either */ if (qtype == LDNS_RR_TYPE_ANY) { srq->response = evldns_response(req, LDNS_RCODE_NOTIMPL); return; } }