124 query_error(
query_type* q, ldns_pkt_rcode rcode)
149 ldns_pkt_opcode opcode = LDNS_PACKET_QUERY;
159 return query_error(q, LDNS_RCODE_FORMERR);
177 return query_error(q, LDNS_RCODE_SERVFAIL);
192 return query_error(q, LDNS_RCODE_NOTIMPL);
207 return query_error(q, LDNS_RCODE_REFUSED);
222 return query_error(q, LDNS_RCODE_NOTAUTH);
232 query_parse_soa(
buffer_type* buffer, uint32_t* serial)
234 ldns_rr_type type = 0;
241 if (type != LDNS_RR_TYPE_SOA) {
274 query_process_notify(
query_type* q, ldns_rr_type qtype,
void* engine)
279 uint16_t rrcount = 0;
283 if (!e || !q || !q->
zone) {
300 qtype != LDNS_RR_TYPE_SOA) {
301 return query_formerr(q);
304 ods_log_error(
"[%s] zone %s is not configured to have input dns "
306 return query_notauth(q);
312 ods_log_info(
"[%s] unauthorized notify for zone %s from %s: "
315 ods_log_info(
"[%s] unauthorized notify for zone %s from unknown "
318 return query_notauth(q);
324 for (rrcount = 0; rrcount < count; rrcount++) {
327 ods_log_info(
"[%s] dropped packet: zone %s received bad "
328 "notify from %s (bad question section)",
query_str,
331 ods_log_info(
"[%s] dropped packet: zone %s received bad "
332 "notify from unknown source (bad question section)",
344 !query_parse_soa(q->
buffer, &serial)) {
346 ods_log_info(
"[%s] dropped packet: zone %s received bad "
347 "notify from %s (bad soa in answer section)",
query_str,
350 ods_log_info(
"[%s] dropped packet: zone %s received bad "
351 "notify from unknown source (bad soa in answer section)",
363 "zone %s serial %u on disk",
query_str, address,
374 "transfer in progress",
query_str, address,
433 ods_log_error(
"[%s] dropped packet: zone %s received bad ixfr "
445 ods_log_error(
"[%s] dropped packet: zone %s received bad ixfr "
466 ldns_pkt_section section)
468 if (!r || !rrset || !section) {
484 response_encode_rr(
query_type* q, ldns_rr* rr, ldns_pkt_section section)
486 uint8_t *data = NULL;
488 ldns_status status = LDNS_STATUS_OK;
492 status = ldns_rr2wire(&data, rr, section, &size);
493 if (status != LDNS_STATUS_OK) {
494 ods_log_error(
"[%s] unable to send good response: ldns_rr2wire() "
495 "failed (%s)",
query_str, ldns_get_errorstr_by_id(status));
517 for (i = 0; i < rrset->
rr_count; i++) {
518 added += response_encode_rr(q, rrset->
rrs[i].
rr, section);
522 added += response_encode_rr(q, rrset->
rrsigs[i].
rr, section);
537 uint16_t counts[LDNS_SECTION_ANY];
538 ldns_pkt_section s = LDNS_SECTION_QUESTION;
542 for (s = LDNS_SECTION_ANSWER; s < LDNS_SECTION_ANY; s++) {
545 for (s = LDNS_SECTION_ANSWER; s < LDNS_SECTION_ANY; s++) {
548 counts[s] += response_encode_rrset(q, r->
rrsets[i], s);
566 query_response(
query_type* q, ldns_rr_type qtype)
570 if (!q || !q->
zone) {
577 if (!response_add_rrset(&r, rrset, LDNS_SECTION_ANSWER)) {
579 return query_servfail(q);
584 if (!response_add_rrset(&r, rrset, LDNS_SECTION_AUTHORITY)) {
586 return query_servfail(q);
589 }
else if (qtype != LDNS_RR_TYPE_SOA) {
592 if (!response_add_rrset(&r, rrset, LDNS_SECTION_AUTHORITY)) {
594 return query_servfail(q);
599 return query_servfail(q);
603 response_encode(q, &r);
642 if (!q || !q->
zone) {
651 return query_formerr(q);
656 return query_formerr(q);
660 ods_log_error(
"[%s] zone %s is not configured to have output dns "
662 return query_refused(q);
670 return query_refused(q);
675 if (qtype == LDNS_RR_TYPE_IXFR) {
677 ods_log_debug(
"[%s] incoming ixfr request serial=%u for zone %s",
679 return ixfr(q, engine);
682 if (qtype == LDNS_RR_TYPE_AXFR) {
686 return axfr(q, engine, 0);
689 if (qtype == LDNS_RR_TYPE_SOA) {
696 return query_response(q, qtype);
707 if (!q || !q->
zone) {
711 return query_notimpl(q);
719 static ldns_pkt_rcode
723 return LDNS_RCODE_SERVFAIL;
726 return LDNS_RCODE_FORMERR;
731 return LDNS_RCODE_REFUSED;
739 return LDNS_RCODE_NOTAUTH;
742 return LDNS_RCODE_NOERROR;
750 static ldns_pkt_rcode
754 return LDNS_RCODE_SERVFAIL;
758 return LDNS_RCODE_FORMERR;
774 return LDNS_RCODE_NOERROR;
785 size_t saved_pos = 0;
800 for (i=0; i < rrcount; i++) {
847 ldns_status status = LDNS_STATUS_OK;
848 ldns_pkt* pkt = NULL;
850 ldns_pkt_rcode rcode = LDNS_RCODE_NOERROR;
851 ldns_pkt_opcode opcode = LDNS_PACKET_QUERY;
852 ldns_rr_type qtype = LDNS_RR_TYPE_SOA;
857 if (!e || !q || !q->
buffer) {
872 if (status != LDNS_STATUS_OK) {
874 ldns_get_errorstr_by_id(status));
875 return query_formerr(q);
877 rr = ldns_rr_list_rr(ldns_pkt_question(pkt), 0);
882 ldns_rr_get_class(rr));
893 return query_servfail(q);
896 if (!query_find_tsig(q)) {
897 return query_formerr(q);
902 opcode = ldns_pkt_get_opcode(pkt);
903 qtype = ldns_rr_get_type(rr);
904 if (qtype == LDNS_RR_TYPE_IXFR) {
909 return query_formerr(q);
913 rcode = query_process_tsig(q);
914 if (rcode != LDNS_RCODE_NOERROR) {
915 return query_error(q, rcode);
918 rcode = query_process_edns(q);
919 if (rcode != LDNS_RCODE_NOERROR) {
924 return query_error(q, LDNS_RCODE_NOERROR);
929 case LDNS_PACKET_NOTIFY:
930 return query_process_notify(q, qtype, engine);
931 case LDNS_PACKET_QUERY:
932 return query_process_query(q, qtype, engine);
933 case LDNS_PACKET_UPDATE:
934 return query_process_update(q);
938 return query_notimpl(q);
1045 size_t rdlength_pos = 0;
1046 uint16_t rdlength = 0;
1056 goto query_add_rr_tc;
1060 sizeof(uint32_t) +
sizeof(rdlength))) {
1061 goto query_add_rr_tc;
1070 for (i=0; i < ldns_rr_rd_count(rr); i++) {
1072 goto query_add_rr_tc;
1077 if (!query_overflow(q)) {
ldns_pkt_opcode buffer_pkt_opcode(buffer_type *buffer)
query_type * query_create(void)
void tsig_rr_update(tsig_rr_type *trr, buffer_type *buffer, size_t length)
int edns_rr_parse(edns_rr_type *err, buffer_type *buffer)
int buffer_pkt_rd(buffer_type *buffer)
const char * rrset_type2str(ldns_rr_type type)
void query_cleanup(query_type *q)
void ods_log_debug(const char *format,...)
#define UDP_MAX_MESSAGE_LEN
int tsig_rr_parse(tsig_rr_type *trr, buffer_type *buffer)
uint16_t buffer_pkt_arcount(buffer_type *buffer)
#define BUFFER_PKT_HEADER_SIZE
void * allocator_alloc(allocator_type *allocator, size_t size)
void edns_rr_reset(edns_rr_type *err)
uint16_t buffer_pkt_qdcount(buffer_type *buffer)
void buffer_skip(buffer_type *buffer, ssize_t count)
void buffer_pkt_set_flags(buffer_type *buffer, uint16_t flags)
uint16_t buffer_read_u16(buffer_type *buffer)
int buffer_skip_rr(buffer_type *buffer, unsigned qrr)
void buffer_pkt_set_qdcount(buffer_type *buffer, uint16_t count)
void buffer_clear(buffer_type *buffer)
void ods_log_info(const char *format,...)
time_t serial_notify_acquired
lock_basic_type zone_lock
void ods_log_error(const char *format,...)
void query_reset(query_type *q, size_t maxlen, int is_tcp)
int buffer_pkt_qr(buffer_type *buffer)
void tsig_rr_reset(tsig_rr_type *trr, tsig_algo_type *algo, tsig_key_type *key)
void tsig_rr_append(tsig_rr_type *trr, buffer_type *buffer)
void buffer_write(buffer_type *buffer, const void *data, size_t count)
struct sockaddr_storage addr
rrset_type * rrsets[QUERY_RESPONSE_MAX_RRSET]
lock_basic_type serial_lock
uint8_t * buffer_current(buffer_type *buffer)
adapter_type * adoutbound
int util_serial_gt(uint32_t serial_new, uint32_t serial_old)
buffer_type * buffer_create(allocator_type *allocator, size_t capacity)
uint16_t buffer_pkt_ancount(buffer_type *buffer)
size_t buffer_limit(buffer_type *buffer)
edns_rr_type * edns_rr_create(allocator_type *allocator)
void tsig_rr_prepare(tsig_rr_type *trr)
void buffer_pkt_set_ancount(buffer_type *buffer, uint16_t count)
#define lock_basic_lock(lock)
const char * tsig_status2str(tsig_status status)
void buffer_pkt_set_nscount(buffer_type *buffer, uint16_t count)
allocator_type * allocator
void buffer_set_limit(buffer_type *buffer, size_t limit)
allocator_type * allocator_create(void *(*allocator)(size_t size), void(*deallocator)(void *))
zone_type * zonelist_lookup_zone_by_dname(zonelist_type *zonelist, ldns_rdf *dname, ldns_rr_class klass)
uint16_t buffer_pkt_flags(buffer_type *buffer)
query_state axfr(query_type *q, engine_type *engine, int fallback)
void tsig_rr_cleanup(tsig_rr_type *trr)
query_state query_process(query_type *q, void *engine)
size_t buffer_capacity(buffer_type *buffer)
int buffer_skip_dname(buffer_type *buffer)
uint32_t buffer_read_u32(buffer_type *buffer)
void buffer_pkt_set_opcode(buffer_type *buffer, ldns_pkt_opcode opcode)
enum query_enum query_state
#define PACKET_BUFFER_SIZE
#define EDNS_MAX_MESSAGE_LEN
int tsig_rr_verify(tsig_rr_type *trr)
void buffer_write_u16(buffer_type *buffer, uint16_t data)
void buffer_write_u32(buffer_type *buffer, uint32_t data)
void buffer_pkt_set_aa(buffer_type *buffer)
tsig_rr_type * tsig_rr_create(allocator_type *allocator)
void tsig_rr_error(tsig_rr_type *trr)
int buffer_pkt_aa(buffer_type *buffer)
query_state ixfr(query_type *q, engine_type *engine)
void ods_log_verbose(const char *format,...)
uint16_t buffer_pkt_nscount(buffer_type *buffer)
acl_type * acl_find(acl_type *acl, struct sockaddr_storage *addr, tsig_rr_type *trr)
rrset_type * zone_lookup_rrset(zone_type *zone, ldns_rdf *owner, ldns_rr_type type)
void buffer_write_u16_at(buffer_type *buffer, size_t at, uint16_t data)
void buffer_set_position(buffer_type *buffer, size_t pos)
void ods_fclose(FILE *fd)
void xfrd_set_timer_now(xfrd_type *xfrd)
int buffer_available(buffer_type *buffer, size_t count)
int buffer_pkt_ad(buffer_type *buffer)
void allocator_cleanup(allocator_type *allocator)
int tsig_rr_lookup(tsig_rr_type *trr)
size_t buffer_remaining(buffer_type *buffer)
void buffer_pkt_set_rcode(buffer_type *buffer, ldns_pkt_rcode rcode)
query_state soa_request(query_type *q, engine_type *engine)
void buffer_write_rdf(buffer_type *buffer, ldns_rdf *rdf)
int buffer_pkt_ra(buffer_type *buffer)
void tsig_rr_sign(tsig_rr_type *trr)
void query_prepare(query_type *q)
void allocator_deallocate(allocator_type *allocator, void *data)
int query_add_rr(query_type *q, ldns_rr *rr)
size_t edns_rr_reserved_space(edns_rr_type *err)
size_t buffer_position(buffer_type *buffer)
unsigned char error[OPT_LEN]
void buffer_cleanup(buffer_type *buffer, allocator_type *allocator)
unsigned char ok[OPT_LEN]
void buffer_pkt_set_arcount(buffer_type *buffer, uint16_t count)
#define ods_log_assert(x)
int buffer_pkt_cd(buffer_type *buffer)
ldns_pkt_section sections[QUERY_RESPONSE_MAX_RRSET]
void dnshandler_fwd_notify(dnshandler_type *dnshandler, uint8_t *pkt, size_t len)
int addr2ip(struct sockaddr_storage addr, char *ip, size_t len)
#define lock_basic_unlock(lock)
void ods_log_warning(const char *format,...)
unsigned char rdata_none[OPT_RDATA]
void buffer_pkt_set_qr(buffer_type *buffer)
uint8_t * buffer_begin(buffer_type *buffer)
ldns_pkt_rcode buffer_pkt_rcode(buffer_type *buffer)
dnshandler_type * dnshandler
int buffer_pkt_tc(buffer_type *buffer)
size_t tsig_rr_reserved_space(tsig_rr_type *trr)
void query_add_optional(query_type *q, void *engine)