Lines Matching full:iq

82 static void target_count_increase_nx(struct iter_qstate* iq, int num);
141 struct iter_qstate* iq = (struct iter_qstate*)regional_alloc( in iter_new() local
143 qstate->minfo[id] = iq; in iter_new()
144 if(!iq) in iter_new()
146 memset(iq, 0, sizeof(*iq)); in iter_new()
147 iq->state = INIT_REQUEST_STATE; in iter_new()
148 iq->final_state = FINISHED_STATE; in iter_new()
149 iq->an_prepend_list = NULL; in iter_new()
150 iq->an_prepend_last = NULL; in iter_new()
151 iq->ns_prepend_list = NULL; in iter_new()
152 iq->ns_prepend_last = NULL; in iter_new()
153 iq->dp = NULL; in iter_new()
154 iq->depth = 0; in iter_new()
155 iq->num_target_queries = 0; in iter_new()
156 iq->num_current_queries = 0; in iter_new()
157 iq->query_restart_count = 0; in iter_new()
158 iq->referral_count = 0; in iter_new()
159 iq->sent_count = 0; in iter_new()
160 iq->ratelimit_ok = 0; in iter_new()
161 iq->target_count = NULL; in iter_new()
162 iq->dp_target_count = 0; in iter_new()
163 iq->wait_priming_stub = 0; in iter_new()
164 iq->refetch_glue = 0; in iter_new()
165 iq->dnssec_expected = 0; in iter_new()
166 iq->dnssec_lame_query = 0; in iter_new()
167 iq->chase_flags = qstate->query_flags; in iter_new()
169 iq->qchase = qstate->qinfo; in iter_new()
170 outbound_list_init(&iq->outlist); in iter_new()
171 iq->minimise_count = 0; in iter_new()
172 iq->timeout_count = 0; in iter_new()
174 iq->minimisation_state = INIT_MINIMISE_STATE; in iter_new()
176 iq->minimisation_state = DONOT_MINIMISE_STATE; in iter_new()
178 memset(&iq->qinfo_out, 0, sizeof(struct query_info)); in iter_new()
186 * @param iq: iterator query state
193 next_state(struct iter_qstate* iq, enum iter_state nextstate) in next_state() argument
198 if(iq->response == NULL) { in next_state()
203 iq->state = nextstate; in next_state()
215 * @param iq: iterator query state
220 final_state(struct iter_qstate* iq) in final_state() argument
222 return next_state(iq, iq->final_state); in final_state()
394 iter_prepend(struct iter_qstate* iq, struct dns_msg* msg, in iter_prepend() argument
400 for(p = iq->an_prepend_list; p; p = p->next) in iter_prepend()
402 for(p = iq->ns_prepend_list; p; p = p->next) in iter_prepend()
415 for(p = iq->an_prepend_list; p; p = p->next) { in iter_prepend()
427 for(p = iq->ns_prepend_list; p; p = p->next) { in iter_prepend()
457 * @param iq: iterator query state.
462 iter_find_rrset_in_prepend_answer(struct iter_qstate* iq, in iter_find_rrset_in_prepend_answer() argument
465 struct iter_prep_list* p = iq->an_prepend_list; in iter_find_rrset_in_prepend_answer()
480 * @param iq: iterator query state.
485 iter_add_prepend_answer(struct module_qstate* qstate, struct iter_qstate* iq, in iter_add_prepend_answer() argument
495 if(iq->an_prepend_last) in iter_add_prepend_answer()
496 iq->an_prepend_last->next = p; in iter_add_prepend_answer()
497 else iq->an_prepend_list = p; in iter_add_prepend_answer()
498 iq->an_prepend_last = p; in iter_add_prepend_answer()
505 * @param iq: iterator query state.
510 iter_add_prepend_auth(struct module_qstate* qstate, struct iter_qstate* iq, in iter_add_prepend_auth() argument
520 if(iq->ns_prepend_last) in iter_add_prepend_auth()
521 iq->ns_prepend_last->next = p; in iter_add_prepend_auth()
522 else iq->ns_prepend_list = p; in iter_add_prepend_auth()
523 iq->ns_prepend_last = p; in iter_add_prepend_auth()
535 * @param iq: iterator query state.
542 handle_cname_response(struct module_qstate* qstate, struct iter_qstate* iq, in handle_cname_response() argument
547 *mname = iq->qchase.qname; in handle_cname_response()
548 *mname_len = iq->qchase.qname_len; in handle_cname_response()
560 !iter_find_rrset_in_prepend_answer(iq, r)) { in handle_cname_response()
561 if(!iter_add_prepend_answer(qstate, iq, r)) in handle_cname_response()
568 !iter_find_rrset_in_prepend_answer(iq, r)) { in handle_cname_response()
570 if(!iter_add_prepend_answer(qstate, iq, r)) in handle_cname_response()
584 if(!iter_add_prepend_auth(qstate, iq, r)) in handle_cname_response()
593 fill_fail_addr(struct iter_qstate* iq, struct sockaddr_storage* addr, in fill_fail_addr() argument
597 iq->fail_addr_type = 0; in fill_fail_addr()
601 iq->fail_addr_type = 4; in fill_fail_addr()
602 memcpy(&iq->fail_addr.in, in fill_fail_addr()
604 sizeof(iq->fail_addr.in)); in fill_fail_addr()
608 iq->fail_addr_type = 6; in fill_fail_addr()
609 memcpy(&iq->fail_addr.in6, in fill_fail_addr()
611 sizeof(iq->fail_addr.in6)); in fill_fail_addr()
615 iq->fail_addr_type = 0; in fill_fail_addr()
621 print_fail_addr(struct iter_qstate* iq, char* buf, size_t len) in print_fail_addr() argument
623 if(iq->fail_addr_type == 4) { in print_fail_addr()
624 if(inet_ntop(AF_INET, &iq->fail_addr.in, buf, in print_fail_addr()
629 else if(iq->fail_addr_type == 6) { in print_fail_addr()
630 if(inet_ntop(AF_INET6, &iq->fail_addr.in6, buf, in print_fail_addr()
641 errinf_reply(struct module_qstate* qstate, struct iter_qstate* iq) in errinf_reply() argument
646 (iq->fail_addr_type != 0)) { in errinf_reply()
653 print_fail_addr(iq, from, sizeof(from)); in errinf_reply()
657 if(iq->scrub_failures || iq->parse_failures) { in errinf_reply()
658 if(iq->scrub_failures) in errinf_reply()
660 if(iq->parse_failures) in errinf_reply()
662 } else if(iq->response == NULL && iq->timeout_count != 0) { in errinf_reply()
664 } else if(iq->response == NULL) { in errinf_reply()
666 if(iq->dp) { in errinf_reply()
667 if(iq->dp->target_list == NULL) in errinf_reply()
670 if(iq->dp->nslist == NULL) in errinf_reply()
672 if(iq->dp->bogus) in errinf_reply()
676 if(iq->response && iq->response->rep) { in errinf_reply()
677 if(FLAGS_GET_RCODE(iq->response->rep->flags) != 0) { in errinf_reply()
680 FLAGS_GET_RCODE(iq->response->rep->flags), in errinf_reply()
686 if(iq->response->rep->an_numrrsets == 0) { in errinf_reply()
734 is_caps_whitelisted(struct iter_env* ie, struct iter_qstate* iq) in is_caps_whitelisted() argument
737 return name_tree_lookup(ie->caps_white, iq->qchase.qname, in is_caps_whitelisted()
738 iq->qchase.qname_len, dname_count_labels(iq->qchase.qname), in is_caps_whitelisted()
739 iq->qchase.qclass) != NULL; in is_caps_whitelisted()
747 target_count_create(struct iter_qstate* iq) in target_count_create() argument
749 if(!iq->target_count) { in target_count_create()
750 iq->target_count = (int*)calloc(TARGET_COUNT_MAX, sizeof(int)); in target_count_create()
752 if(iq->target_count) { in target_count_create()
753 iq->target_count[TARGET_COUNT_REF] = 1; in target_count_create()
754 iq->nxns_dp = (uint8_t**)calloc(1, sizeof(uint8_t*)); in target_count_create()
760 target_count_increase(struct iter_qstate* iq, int num) in target_count_increase() argument
762 target_count_create(iq); in target_count_increase()
763 if(iq->target_count) in target_count_increase()
764 iq->target_count[TARGET_COUNT_QUERIES] += num; in target_count_increase()
765 iq->dp_target_count++; in target_count_increase()
769 target_count_increase_nx(struct iter_qstate* iq, int num) in target_count_increase_nx() argument
771 target_count_create(iq); in target_count_increase_nx()
772 if(iq->target_count) in target_count_increase_nx()
773 iq->target_count[TARGET_COUNT_NX] += num; in target_count_increase_nx()
777 target_count_increase_global_quota(struct iter_qstate* iq, int num) in target_count_increase_global_quota() argument
779 target_count_create(iq); in target_count_increase_global_quota()
780 if(iq->target_count) in target_count_increase_global_quota()
781 iq->target_count[TARGET_COUNT_GLOBAL_QUOTA] += num; in target_count_increase_global_quota()
796 * @param iq: The iterator state that is generating this event.
810 struct iter_qstate* iq, enum iter_state initial_state, in generate_sub_request() argument
874 target_count_create(iq); in generate_sub_request()
875 subiq->target_count = iq->target_count; in generate_sub_request()
876 if(iq->target_count) { in generate_sub_request()
877 iq->target_count[TARGET_COUNT_REF] ++; /* extra reference */ in generate_sub_request()
878 subiq->nxns_dp = iq->nxns_dp; in generate_sub_request()
882 subiq->depth = iq->depth+1; in generate_sub_request()
901 * @param iq: iterator query state.
907 prime_root(struct module_qstate* qstate, struct iter_qstate* iq, int id, in prime_root() argument
924 qclass, qstate, id, iq, QUERYTARGETS_STATE, PRIME_RESP_STATE, in prime_root()
963 * @param iq: iterator query state.
973 prime_stub(struct module_qstate* qstate, struct iter_qstate* iq, int id, in prime_stub() argument
984 stub = hints_lookup_stub(qstate->env->hints, qname, qclass, iq->dp, in prime_stub()
991 if(!iq->auth_zone_avoid && iq->dp && iq->dp->auth_dp && in prime_stub()
992 query_dname_compare(iq->dp->name, stub_dp->name) == 0) { in prime_stub()
1000 if(iq->dp == NULL) r = 2; in prime_stub()
1003 iq->dp = delegpt_copy(stub_dp, qstate->region); in prime_stub()
1005 if(!iq->dp) { in prime_stub()
1011 log_nametypeclass(VERB_DETAIL, "use stub", iq->dp->name, in prime_stub()
1023 LDNS_RR_TYPE_NS, qclass, qstate, id, iq, in prime_stub()
1069 auth_zone_delegpt(struct module_qstate* qstate, struct iter_qstate* iq, in auth_zone_delegpt() argument
1073 if(iq->auth_zone_avoid) in auth_zone_delegpt()
1076 delname = iq->qchase.qname; in auth_zone_delegpt()
1077 delnamelen = iq->qchase.qname_len; in auth_zone_delegpt()
1089 if(iq->dp && query_dname_compare(z->name, iq->dp->name) == 0 in auth_zone_delegpt()
1090 && iq->dp->auth_dp && qstate->blacklist && in auth_zone_delegpt()
1102 iq->dp = NULL; in auth_zone_delegpt()
1105 if(iq->dp==NULL || dname_subdomain_c(z->name, iq->dp->name)) { in auth_zone_delegpt()
1148 iq->dp = dp; in auth_zone_delegpt()
1161 * @param iq: iterator query state.
1165 generate_a_aaaa_check(struct module_qstate* qstate, struct iter_qstate* iq, in generate_a_aaaa_check() argument
1171 struct reply_info* rep = iq->response->rep; in generate_a_aaaa_check()
1173 log_assert(iq->dp); in generate_a_aaaa_check()
1175 if(iq->depth == ie->max_dependency_depth) in generate_a_aaaa_check()
1202 qstate, id, iq, in generate_a_aaaa_check()
1216 * @param iq: iterator query state.
1220 generate_ns_check(struct module_qstate* qstate, struct iter_qstate* iq, int id) in generate_ns_check() argument
1224 log_assert(iq->dp); in generate_ns_check()
1226 if(iq->depth == ie->max_dependency_depth) in generate_ns_check()
1228 if(!can_have_last_resort(qstate->env, iq->dp->name, iq->dp->namelen, in generate_ns_check()
1229 iq->qchase.qclass, NULL, NULL, NULL)) in generate_ns_check()
1233 query_dname_compare(iq->dp->name, qstate->qinfo.qname)==0 && in generate_ns_check()
1236 generate_a_aaaa_check(qstate, iq, id); in generate_ns_check()
1244 iq->dp->name, LDNS_RR_TYPE_NS, iq->qchase.qclass); in generate_ns_check()
1245 if(!generate_sub_request(iq->dp->name, iq->dp->namelen, in generate_ns_check()
1246 LDNS_RR_TYPE_NS, iq->qchase.qclass, qstate, id, iq, in generate_ns_check()
1258 subiq->dp = delegpt_copy(iq->dp, subq->region); in generate_ns_check()
1282 * @param iq: iterator query state.
1287 struct iter_qstate* iq, int id) in generate_dnskey_prefetch() argument
1290 log_assert(iq->dp); in generate_dnskey_prefetch()
1294 query_dname_compare(iq->dp->name, qstate->qinfo.qname)==0 && in generate_dnskey_prefetch()
1310 iq->dp->name, LDNS_RR_TYPE_DNSKEY, iq->qchase.qclass); in generate_dnskey_prefetch()
1311 if(!generate_sub_request(iq->dp->name, iq->dp->namelen, in generate_dnskey_prefetch()
1312 LDNS_RR_TYPE_DNSKEY, iq->qchase.qclass, qstate, id, iq, in generate_dnskey_prefetch()
1323 subiq->dp = delegpt_copy(iq->dp, subq->region); in generate_dnskey_prefetch()
1332 * @param iq: iterator query state.
1334 * If returns true but, iq->dp is NULL then a malloc failure occurred.
1337 forward_request(struct module_qstate* qstate, struct iter_qstate* iq) in forward_request() argument
1340 uint8_t* delname = iq->qchase.qname; in forward_request()
1341 size_t delnamelen = iq->qchase.qname_len; in forward_request()
1343 if(iq->refetch_glue && iq->dp) { in forward_request()
1344 delname = iq->dp->name; in forward_request()
1345 delnamelen = iq->dp->namelen; in forward_request()
1348 if( (iq->qchase.qtype == LDNS_RR_TYPE_DS || iq->refetch_glue) in forward_request()
1349 && !dname_is_root(iq->qchase.qname)) in forward_request()
1351 dp = forwards_lookup(qstate->env->fwds, delname, iq->qchase.qclass, in forward_request()
1355 iq->chase_flags |= BIT_RD; in forward_request()
1356 iq->dp = delegpt_copy(dp, qstate->region); in forward_request()
1358 /* iq->dp checked by caller */ in forward_request()
1375 * @param iq: iterator query state.
1382 processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq, in processInitRequest() argument
1395 if(iq->query_restart_count > ie->max_query_restarts) { in processInitRequest()
1397 " of query restarts with %d", iq->query_restart_count); in processInitRequest()
1400 if(iq->qchase.qname) in processInitRequest()
1401 errinf_dname(qstate, "stop at", iq->qchase.qname); in processInitRequest()
1409 verbose(VERB_ALGO, "request has dependency depth of %d", iq->depth); in processInitRequest()
1410 if(iq->depth > ie->max_dependency_depth) { in processInitRequest()
1412 "dependency depth with depth of %d", iq->depth); in processInitRequest()
1420 iq->qchase.qclass = 0; in processInitRequest()
1421 return next_state(iq, COLLECT_CLASS_STATE); in processInitRequest()
1427 * we won’t try to re-fetch glue if the iq->dp is null. in processInitRequest()
1429 if (iq->refetch_glue && in processInitRequest()
1430 iq->dp && in processInitRequest()
1431 !can_have_last_resort(qstate->env, iq->dp->name, in processInitRequest()
1432 iq->dp->namelen, iq->qchase.qclass, NULL, NULL, NULL)) { in processInitRequest()
1433 iq->refetch_glue = 0; in processInitRequest()
1445 rpz_callback_from_iterator_cname(qstate, iq); in processInitRequest()
1451 forged_response->rep, iq->qchase.qname, in processInitRequest()
1452 iq->qchase.qname_len, LDNS_RR_TYPE_CNAME, in processInitRequest()
1453 iq->qchase.qclass) && in processInitRequest()
1454 iq->qchase.qtype != LDNS_RR_TYPE_CNAME && in processInitRequest()
1457 if(!handle_cname_response(qstate, iq, forged_response, in processInitRequest()
1462 iq->qchase.qname = sname; in processInitRequest()
1463 iq->qchase.qname_len = slen; in processInitRequest()
1465 rpz_callback_from_iterator_cname(qstate, iq); in processInitRequest()
1471 iq->response = forged_response; in processInitRequest()
1472 next_state(iq, FINISHED_STATE); in processInitRequest()
1473 if(!iter_prepend(iq, qstate->return_msg, qstate->region)) { in processInitRequest()
1481 iq->dp = NULL; in processInitRequest()
1482 iq->refetch_glue = 0; in processInitRequest()
1483 iq->query_restart_count++; in processInitRequest()
1484 iq->sent_count = 0; in processInitRequest()
1485 iq->dp_target_count = 0; in processInitRequest()
1488 iq->minimisation_state = INIT_MINIMISE_STATE; in processInitRequest()
1489 return next_state(iq, INIT_REQUEST_STATE); in processInitRequest()
1493 if (iter_stub_fwd_no_cache(qstate, &iq->qchase, &dpname, &dpnamelen, in processInitRequest()
1506 msg = dns_cache_lookup(qstate->env, iq->qchase.qname, in processInitRequest()
1507 iq->qchase.qname_len, iq->qchase.qtype, in processInitRequest()
1508 iq->qchase.qclass, qstate->query_flags, in processInitRequest()
1512 iter_qname_indicates_dnssec(qstate->env, &iq->qchase)) { in processInitRequest()
1515 msg = val_neg_getmsg(qstate->env->neg_cache, &iq->qchase, in processInitRequest()
1524 iq->qchase.qname) != 0) in processInitRequest()
1530 &iq->qchase); in processInitRequest()
1544 if(!handle_cname_response(qstate, iq, msg, in processInitRequest()
1551 iq->qchase.qname = sname; in processInitRequest()
1552 iq->qchase.qname_len = slen; in processInitRequest()
1555 iq->dp = NULL; in processInitRequest()
1556 iq->refetch_glue = 0; in processInitRequest()
1557 iq->query_restart_count++; in processInitRequest()
1558 iq->sent_count = 0; in processInitRequest()
1559 iq->dp_target_count = 0; in processInitRequest()
1562 iq->minimisation_state = INIT_MINIMISE_STATE; in processInitRequest()
1563 return next_state(iq, INIT_REQUEST_STATE); in processInitRequest()
1572 iq->response = msg; in processInitRequest()
1573 return final_state(iq); in processInitRequest()
1577 if(forward_request(qstate, iq)) in processInitRequest()
1579 if(!iq->dp) { in processInitRequest()
1584 if(!cache_fill_missing(qstate->env, iq->qchase.qclass, in processInitRequest()
1585 qstate->region, iq->dp, 0)) { in processInitRequest()
1602 iq->refetch_glue = 0; in processInitRequest()
1603 iq->minimisation_state = DONOT_MINIMISE_STATE; in processInitRequest()
1607 return next_state(iq, QUERYTARGETS_STATE); in processInitRequest()
1616 if(iq->refetch_glue) { in processInitRequest()
1617 if(!iq->dp) { in processInitRequest()
1622 delname = iq->dp->name; in processInitRequest()
1623 delnamelen = iq->dp->namelen; in processInitRequest()
1625 delname = iq->qchase.qname; in processInitRequest()
1626 delnamelen = iq->qchase.qname_len; in processInitRequest()
1628 if(iq->qchase.qtype == LDNS_RR_TYPE_DS || iq->refetch_glue || in processInitRequest()
1629 (iq->qchase.qtype == LDNS_RR_TYPE_NS && qstate->prefetch_leeway in processInitRequest()
1630 … && can_have_last_resort(qstate->env, delname, delnamelen, iq->qchase.qclass, NULL, NULL, NULL))) { in processInitRequest()
1636 if(dname_is_root(delname) && (iq->refetch_glue || in processInitRequest()
1637 (iq->qchase.qtype == LDNS_RR_TYPE_NS && in processInitRequest()
1648 iq->dp = dns_cache_find_delegation(qstate->env, delname, in processInitRequest()
1649 delnamelen, iq->qchase.qtype, iq->qchase.qclass, in processInitRequest()
1650 qstate->region, &iq->deleg_msg, in processInitRequest()
1653 else iq->dp = NULL; in processInitRequest()
1657 if(iq->dp == NULL) { in processInitRequest()
1661 if(!auth_zone_delegpt(qstate, iq, delname, delnamelen)) in processInitRequest()
1664 if(iq->dp) /* use auth zone dp */ in processInitRequest()
1665 return next_state(iq, INIT_REQUEST_2_STATE); in processInitRequest()
1667 r = prime_stub(qstate, iq, id, delname, in processInitRequest()
1668 iq->qchase.qclass); in processInitRequest()
1674 iq->qchase.qclass, nolock)) { in processInitRequest()
1678 iq->dp = hints_find_root(qstate->env->hints, in processInitRequest()
1679 iq->qchase.qclass, nolock); in processInitRequest()
1680 if(!iq->dp) { in processInitRequest()
1686 iq->dp = delegpt_copy(iq->dp, qstate->region); in processInitRequest()
1688 if(!iq->dp) { in processInitRequest()
1694 return next_state(iq, INIT_REQUEST_2_STATE); in processInitRequest()
1698 if(!prime_root(qstate, iq, id, iq->qchase.qclass)) in processInitRequest()
1708 if(!iq->ratelimit_ok && qstate->prefetch_leeway) in processInitRequest()
1709 iq->ratelimit_ok = 1; /* allow prefetches, this keeps in processInitRequest()
1725 iq->dp, ie->supports_ipv4, ie->supports_ipv6, in processInitRequest()
1728 …if(!can_have_last_resort(qstate->env, iq->dp->name, iq->dp->namelen, iq->qchase.qclass, &have_dp, … in processInitRequest()
1733 if(have_dp && !iq->dp) { in processInitRequest()
1744 delegpt_log(VERB_ALGO, iq->dp); in processInitRequest()
1747 errinf_dname(qstate, "for zone", iq->dp->name); in processInitRequest()
1751 if(dname_is_root(iq->dp->name)) { in processInitRequest()
1756 iq->dp = hints_find_root(qstate->env->hints, in processInitRequest()
1757 iq->qchase.qclass, nolock); in processInitRequest()
1760 if(!iq->dp) { in processInitRequest()
1765 iq->dp = delegpt_copy(iq->dp, qstate->region); in processInitRequest()
1767 if(!iq->dp) { in processInitRequest()
1777 delegpt_log(VERB_ALGO, iq->dp); in processInitRequest()
1779 delname = iq->dp->name; in processInitRequest()
1780 delnamelen = iq->dp->namelen; in processInitRequest()
1787 delegpt_log(VERB_ALGO, iq->dp); in processInitRequest()
1791 return next_state(iq, INIT_REQUEST_2_STATE); in processInitRequest()
1804 * @param iq: iterator query state.
1810 processInitRequest2(struct module_qstate* qstate, struct iter_qstate* iq, in processInitRequest2() argument
1818 delname = iq->qchase.qname; in processInitRequest2()
1819 delnamelen = iq->qchase.qname_len; in processInitRequest2()
1820 if(iq->refetch_glue) { in processInitRequest2()
1823 if(!iq->dp) { in processInitRequest2()
1831 qstate->env->hints, iq->qchase.qname, iq->qchase.qclass, in processInitRequest2()
1832 iq->dp, nolock); in processInitRequest2()
1834 dname_subdomain_c(iq->dp->name, stub->dp->name)) { in processInitRequest2()
1835 delname = iq->dp->name; in processInitRequest2()
1836 delnamelen = iq->dp->namelen; in processInitRequest2()
1841 if(iq->qchase.qtype == LDNS_RR_TYPE_DS || iq->refetch_glue) { in processInitRequest2()
1844 iq->refetch_glue = 0; /* if CNAME causes restart, no refetch */ in processInitRequest2()
1849 if(!auth_zone_delegpt(qstate, iq, delname, delnamelen)) in processInitRequest2()
1853 if(prime_stub(qstate, iq, id, delname, iq->qchase.qclass)) { in processInitRequest2()
1859 return next_state(iq, INIT_REQUEST_3_STATE); in processInitRequest2()
1869 * @param iq: iterator query state.
1874 processInitRequest3(struct module_qstate* qstate, struct iter_qstate* iq, in processInitRequest3() argument
1881 iq->dnssec_expected = iter_indicates_dnssec(qstate->env, iq->dp, in processInitRequest3()
1882 iq->deleg_msg, iq->qchase.qclass); in processInitRequest3()
1886 if(!(qstate->query_flags & BIT_RD) && iq->deleg_msg) { in processInitRequest3()
1887 iq->response = iq->deleg_msg; in processInitRequest3()
1888 if(verbosity >= VERB_ALGO && iq->response) in processInitRequest3()
1890 &iq->response->qinfo, iq->response->rep); in processInitRequest3()
1893 return final_state(iq); in processInitRequest3()
1897 iq->chase_flags &= ~BIT_RD; in processInitRequest3()
1900 if(iq->dnssec_expected && qstate->env->cfg->prefetch_key && in processInitRequest3()
1902 generate_dnskey_prefetch(qstate, iq, id); in processInitRequest3()
1909 return next_state(iq, QUERYTARGETS_STATE); in processInitRequest3()
1918 * @param iq: iterator query state.
1928 struct iter_qstate* iq, int id, uint8_t* name, size_t namelen, in generate_parentside_target_query() argument
1933 id, iq, INIT_REQUEST_STATE, FINISHED_STATE, &subq, 0, 0)) in generate_parentside_target_query()
1941 if(dname_subdomain_c(name, iq->dp->name)) { in generate_parentside_target_query()
1942 subiq->dp = delegpt_copy(iq->dp, subq->region); in generate_parentside_target_query()
1971 * @param iq: iterator query state.
1980 generate_target_query(struct module_qstate* qstate, struct iter_qstate* iq, in generate_target_query() argument
1985 id, iq, INIT_REQUEST_STATE, FINISHED_STATE, &subq, 0, 0)) in generate_target_query()
1996 * @param iq: iterator query state.
2007 query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq, in query_for_targets() argument
2015 iter_mark_cycle_targets(qstate, iq->dp); in query_for_targets()
2016 missing = (int)delegpt_count_missing_targets(iq->dp, NULL); in query_for_targets()
2032 if(iq->depth == ie->max_dependency_depth) in query_for_targets()
2034 if(iq->depth > 0 && iq->target_count && in query_for_targets()
2035 iq->target_count[TARGET_COUNT_QUERIES] > MAX_TARGET_COUNT) { in query_for_targets()
2040 iq->target_count[TARGET_COUNT_QUERIES]); in query_for_targets()
2043 if(iq->dp_target_count > MAX_DP_TARGET_COUNT) { in query_for_targets()
2048 s, iq->dp_target_count); in query_for_targets()
2056 for(ns = iq->dp->nslist; ns; ns = ns->next) { in query_for_targets()
2072 if(!generate_target_query(qstate, iq, id, in query_for_targets()
2074 LDNS_RR_TYPE_AAAA, iq->qchase.qclass)) { in query_for_targets()
2102 if(!generate_target_query(qstate, iq, id, in query_for_targets()
2104 LDNS_RR_TYPE_A, iq->qchase.qclass)) { in query_for_targets()
2141 * @param iq: iterator query state.
2148 processLastResort(struct module_qstate* qstate, struct iter_qstate* iq, in processLastResort() argument
2154 log_assert(iq->dp); in processLastResort()
2156 if(!can_have_last_resort(qstate->env, iq->dp->name, iq->dp->namelen, in processLastResort()
2157 iq->qchase.qclass, NULL, NULL, NULL)) { in processLastResort()
2161 errinf_dname(qstate, "at zone", iq->dp->name); in processLastResort()
2162 errinf_reply(qstate, iq); in processLastResort()
2167 if(!cache_fill_missing(qstate->env, iq->qchase.qclass, in processLastResort()
2168 qstate->region, iq->dp, PACKED_RRSET_UNVERIFIED_GLUE)) in processLastResort()
2170 if(iq->dp->usable_list) { in processLastResort()
2172 return next_state(iq, QUERYTARGETS_STATE); in processLastResort()
2175 if(!iq->dp->has_parent_side_NS && dname_is_root(iq->dp->name)) { in processLastResort()
2179 iq->qchase.qclass, nolock); in processLastResort()
2182 iq->chase_flags &= ~BIT_RD; /* go to authorities */ in processLastResort()
2184 (void)delegpt_add_ns(iq->dp, qstate->region, in processLastResort()
2189 (void)delegpt_add_addr(iq->dp, qstate->region, in processLastResort()
2195 iq->dp->has_parent_side_NS = 1; in processLastResort()
2196 } else if(!iq->dp->has_parent_side_NS) { in processLastResort()
2197 if(!iter_lookup_parent_NS_from_cache(qstate->env, iq->dp, in processLastResort()
2199 || !iq->dp->has_parent_side_NS) { in processLastResort()
2203 iq->store_parent_NS = iq->dp; in processLastResort()
2204 iq->chase_flags &= ~BIT_RD; /* go to authorities */ in processLastResort()
2205 iq->deleg_msg = NULL; in processLastResort()
2206 iq->refetch_glue = 1; in processLastResort()
2207 iq->query_restart_count++; in processLastResort()
2208 iq->sent_count = 0; in processLastResort()
2209 iq->dp_target_count = 0; in processLastResort()
2211 iq->minimisation_state = INIT_MINIMISE_STATE; in processLastResort()
2212 return next_state(iq, INIT_REQUEST_STATE); in processLastResort()
2216 if(!cache_fill_missing(qstate->env, iq->qchase.qclass, in processLastResort()
2217 qstate->region, iq->dp, 0)) in processLastResort()
2219 if(iq->dp->usable_list) { in processLastResort()
2221 return next_state(iq, QUERYTARGETS_STATE); in processLastResort()
2224 if(iter_lookup_parent_glue_from_cache(qstate->env, iq->dp, in processLastResort()
2228 return next_state(iq, QUERYTARGETS_STATE); in processLastResort()
2231 if(delegpt_count_missing_targets(iq->dp, NULL) > 0) { in processLastResort()
2234 if((ret=query_for_targets(qstate, iq, ie, id, 1, &qs))!=0) { in processLastResort()
2236 errinf_dname(qstate, "at zone", iq->dp->name); in processLastResort()
2241 iq->num_target_queries += qs; in processLastResort()
2242 target_count_increase(iq, qs); in processLastResort()
2248 if(iq->depth == ie->max_dependency_depth) { in processLastResort()
2253 if(iq->depth > 0 && iq->target_count && in processLastResort()
2254 iq->target_count[TARGET_COUNT_QUERIES] > MAX_TARGET_COUNT) { in processLastResort()
2259 iq->target_count[TARGET_COUNT_QUERIES]); in processLastResort()
2264 iter_mark_pside_cycle_targets(qstate, iq->dp); in processLastResort()
2267 for(ns = iq->dp->nslist; ns; ns = ns->next) { in processLastResort()
2273 iq->qchase.qclass, NULL, NULL, NULL)) { in processLastResort()
2276 ns->name, LDNS_RR_TYPE_NS, iq->qchase.qclass); in processLastResort()
2284 if(!generate_parentside_target_query(qstate, iq, id, in processLastResort()
2286 LDNS_RR_TYPE_AAAA, iq->qchase.qclass)) { in processLastResort()
2297 iq->num_target_queries += query_count; in processLastResort()
2298 target_count_increase(iq, query_count); in processLastResort()
2305 if(!generate_parentside_target_query(qstate, iq, id, in processLastResort()
2307 LDNS_RR_TYPE_A, iq->qchase.qclass)) { in processLastResort()
2317 iq->num_target_queries += query_count; in processLastResort()
2318 target_count_increase(iq, query_count); in processLastResort()
2326 if(!qstate->no_cache_store && iq->query_for_pside_glue in processLastResort()
2327 && !iq->pside_glue) in processLastResort()
2329 iq->deleg_msg?iq->deleg_msg->rep: in processLastResort()
2330 (iq->response?iq->response->rep:NULL)); in processLastResort()
2333 errinf_dname(qstate, "at zone", iq->dp->name); in processLastResort()
2334 errinf_reply(qstate, iq); in processLastResort()
2349 * @param iq: iterator query state.
2356 processDSNSFind(struct module_qstate* qstate, struct iter_qstate* iq, int id) in processDSNSFind() argument
2361 if(!iq->dsns_point) { in processDSNSFind()
2363 iq->dsns_point = iq->qchase.qname; in processDSNSFind()
2364 iq->dsns_point_len = iq->qchase.qname_len; in processDSNSFind()
2367 if(!dname_subdomain_c(iq->dsns_point, iq->dp->name)) { in processDSNSFind()
2368 …tate, "for DS query parent-child nameserver search the query is not under the zone", iq->dp->name); in processDSNSFind()
2373 dname_remove_label(&iq->dsns_point, &iq->dsns_point_len); in processDSNSFind()
2374 if(query_dname_compare(iq->dsns_point, iq->dp->name) == 0) { in processDSNSFind()
2378 iq->state = QUERYTARGETS_STATE; in processDSNSFind()
2381 iq->state = DSNS_FIND_STATE; in processDSNSFind()
2385 iq->dsns_point, LDNS_RR_TYPE_NS, iq->qchase.qclass); in processDSNSFind()
2386 if(!generate_sub_request(iq->dsns_point, iq->dsns_point_len, in processDSNSFind()
2387 LDNS_RR_TYPE_NS, iq->qchase.qclass, qstate, id, iq, in processDSNSFind()
2389 …, "for DS query parent-child nameserver search, could not generate NS lookup for", iq->dsns_point); in processDSNSFind()
2401 check_waiting_queries(struct iter_qstate* iq, struct module_qstate* qstate, in check_waiting_queries() argument
2404 if(iq->num_target_queries>0 && iq->num_current_queries>0) { in check_waiting_queries()
2407 "respond", iq->num_target_queries, in check_waiting_queries()
2408 iq->num_current_queries); in check_waiting_queries()
2410 } else if(iq->num_target_queries>0) { in check_waiting_queries()
2412 "resolve", iq->num_target_queries); in check_waiting_queries()
2417 iq->num_current_queries); in check_waiting_queries()
2431 * @param iq: iterator query state.
2439 processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq, in processQueryTargets() argument
2460 "currentqueries %d sentcount %d", iq->num_target_queries, in processQueryTargets()
2461 iq->num_current_queries, iq->sent_count); in processQueryTargets()
2464 if(iq->referral_count > MAX_REFERRAL_COUNT) { in processQueryTargets()
2466 "number of referrrals with %d", iq->referral_count); in processQueryTargets()
2470 if(iq->sent_count > ie->max_sent_count) { in processQueryTargets()
2472 "number of sends with %d", iq->sent_count); in processQueryTargets()
2478 if(iq->target_count && !*iq->nxns_dp && in processQueryTargets()
2479 iq->target_count[TARGET_COUNT_NX] > MAX_TARGET_NX) { in processQueryTargets()
2482 if(iq->num_target_queries>0 || iq->num_current_queries>0) { in processQueryTargets()
2483 check_waiting_queries(iq, qstate, id); in processQueryTargets()
2488 MAX_TARGET_NX, iq->target_count[TARGET_COUNT_NX]); in processQueryTargets()
2490 if(!iq->dp) { in processQueryTargets()
2499 if(iq->dp->has_parent_side_NS) { in processQueryTargets()
2510 for(ns=iq->dp->nslist; ns; ns=ns->next) { in processQueryTargets()
2516 *iq->nxns_dp = malloc(iq->dp->namelen); in processQueryTargets()
2517 if(!*iq->nxns_dp) { in processQueryTargets()
2524 memcpy(*iq->nxns_dp, iq->dp->name, iq->dp->namelen); in processQueryTargets()
2525 } else if(iq->target_count && *iq->nxns_dp) { in processQueryTargets()
2528 if(iq->num_target_queries>0 || iq->num_current_queries>0) { in processQueryTargets()
2529 check_waiting_queries(iq, qstate, id); in processQueryTargets()
2533 if(!iq->dp) { in processQueryTargets()
2541 if(iq->target_count[TARGET_COUNT_NX] > MAX_TARGET_NX_FALLBACK) { in processQueryTargets()
2545 iq->target_count[TARGET_COUNT_NX]); in processQueryTargets()
2550 if(!iq->dp->has_parent_side_NS) { in processQueryTargets()
2552 if(!dname_canonical_compare(*iq->nxns_dp, iq->dp->name)) { in processQueryTargets()
2556 for(ns=iq->dp->nslist; ns; ns=ns->next) { in processQueryTargets()
2565 if(!iq->dp) { in processQueryTargets()
2571 delegpt_no_ipv6(iq->dp); in processQueryTargets()
2573 delegpt_no_ipv4(iq->dp); in processQueryTargets()
2574 delegpt_log(VERB_ALGO, iq->dp); in processQueryTargets()
2576 if(iq->num_current_queries>0) { in processQueryTargets()
2585 if(iq->minimisation_state == INIT_MINIMISE_STATE in processQueryTargets()
2586 && !(iq->chase_flags & BIT_RD)) { in processQueryTargets()
2591 if(!(iq->qinfo_out.qname_len in processQueryTargets()
2592 && dname_subdomain_c(iq->qchase.qname, in processQueryTargets()
2593 iq->qinfo_out.qname) in processQueryTargets()
2594 && dname_subdomain_c(iq->qinfo_out.qname, in processQueryTargets()
2595 iq->dp->name))) { in processQueryTargets()
2596 iq->qinfo_out.qname = iq->dp->name; in processQueryTargets()
2597 iq->qinfo_out.qname_len = iq->dp->namelen; in processQueryTargets()
2598 iq->qinfo_out.qtype = LDNS_RR_TYPE_A; in processQueryTargets()
2599 iq->qinfo_out.qclass = iq->qchase.qclass; in processQueryTargets()
2600 iq->qinfo_out.local_alias = NULL; in processQueryTargets()
2601 iq->minimise_count = 0; in processQueryTargets()
2604 iq->minimisation_state = MINIMISE_STATE; in processQueryTargets()
2606 if(iq->minimisation_state == MINIMISE_STATE) { in processQueryTargets()
2607 int qchaselabs = dname_count_labels(iq->qchase.qname); in processQueryTargets()
2609 dname_count_labels(iq->qinfo_out.qname); in processQueryTargets()
2611 qout_orig = iq->qinfo_out.qname; in processQueryTargets()
2612 qout_orig_len = iq->qinfo_out.qname_len; in processQueryTargets()
2613 iq->qinfo_out.qname = iq->qchase.qname; in processQueryTargets()
2614 iq->qinfo_out.qname_len = iq->qchase.qname_len; in processQueryTargets()
2615 iq->minimise_count++; in processQueryTargets()
2616 iq->timeout_count = 0; in processQueryTargets()
2618 iter_dec_attempts(iq->dp, 1, ie->outbound_msg_retry); in processQueryTargets()
2625 iq->minimise_count > MINIMISE_ONE_LAB) { in processQueryTargets()
2626 if(iq->minimise_count < MAX_MINIMISE_COUNT) { in processQueryTargets()
2632 if (MAX_MINIMISE_COUNT - iq->minimise_count >= in processQueryTargets()
2651 dname_remove_labels(&iq->qinfo_out.qname, in processQueryTargets()
2652 &iq->qinfo_out.qname_len, in processQueryTargets()
2656 && (iq->qchase.qtype == LDNS_RR_TYPE_DS in processQueryTargets()
2657 || iq->qchase.qtype == LDNS_RR_TYPE_A))) in processQueryTargets()
2659 iq->minimisation_state = DONOT_MINIMISE_STATE; in processQueryTargets()
2662 iq->qinfo_out.qname, iq->qinfo_out.qname_len, in processQueryTargets()
2663 iq->qinfo_out.qtype, iq->qinfo_out.qclass, in processQueryTargets()
2665 qstate->env->scratch, 0, iq->dp->name, in processQueryTargets()
2666 iq->dp->namelen); in processQueryTargets()
2677 iq->response = msg; in processQueryTargets()
2678 return final_state(iq); in processQueryTargets()
2683 iq->qinfo_out.qname, in processQueryTargets()
2684 iq->qinfo_out.qname_len, in processQueryTargets()
2685 iq->qinfo_out.qtype, in processQueryTargets()
2686 iq->qinfo_out.qclass, in processQueryTargets()
2687 qstate, id, iq, in processQueryTargets()
2704 if(iq->minimisation_state == SKIP_MINIMISE_STATE) { in processQueryTargets()
2705 if(iq->timeout_count < MAX_MINIMISE_TIMEOUT_COUNT) in processQueryTargets()
2708 iq->minimisation_state = MINIMISE_STATE; in processQueryTargets()
2712 iq->minimisation_state = DONOT_MINIMISE_STATE; in processQueryTargets()
2714 if(iq->minimisation_state == DONOT_MINIMISE_STATE) in processQueryTargets()
2715 iq->qinfo_out = iq->qchase; in processQueryTargets()
2721 if(!iq->auth_zone_avoid && qstate->blacklist) { in processQueryTargets()
2723 iq->dp->name, iq->dp->namelen, iq->qinfo_out.qclass)) { in processQueryTargets()
2727 iq->auth_zone_avoid = 1; in processQueryTargets()
2730 if(iq->auth_zone_avoid) { in processQueryTargets()
2731 iq->auth_zone_avoid = 0; in processQueryTargets()
2733 } else if(auth_zones_lookup(qstate->env->auth_zones, &iq->qinfo_out, in processQueryTargets()
2734 qstate->region, &iq->response, &auth_fallback, iq->dp->name, in processQueryTargets()
2735 iq->dp->namelen)) { in processQueryTargets()
2739 &iq->response->qinfo, iq->response->rep); in processQueryTargets()
2741 if((iq->chase_flags&BIT_RD) && !(iq->response->rep->flags&BIT_AA)) { in processQueryTargets()
2747 iq->num_current_queries++; in processQueryTargets()
2748 iq->chase_to_rd = 0; in processQueryTargets()
2749 iq->dnssec_lame_query = 0; in processQueryTargets()
2750 iq->auth_zone_response = 1; in processQueryTargets()
2751 return next_state(iq, QUERY_RESP_STATE); in processQueryTargets()
2754 iq->auth_zone_response = 0; in processQueryTargets()
2763 if(iq->dp->auth_dp) { in processQueryTargets()
2766 iq->auth_zone_avoid = 1; in processQueryTargets()
2767 return next_state(iq, INIT_REQUEST_STATE); in processQueryTargets()
2776 if(iq->depth < ie->max_dependency_depth in processQueryTargets()
2777 && iq->num_target_queries == 0 in processQueryTargets()
2778 && (!iq->target_count || iq->target_count[TARGET_COUNT_NX]==0) in processQueryTargets()
2779 && iq->sent_count < TARGET_FETCH_STOP) { in processQueryTargets()
2785 tf_policy = ie->target_fetch_policy[iq->depth]; in processQueryTargets()
2789 if(iq->caps_fallback) { in processQueryTargets()
2792 if((ret=query_for_targets(qstate, iq, ie, id, -1, &extra))!=0) { in processQueryTargets()
2798 iq->num_target_queries += extra; in processQueryTargets()
2799 target_count_increase(iq, extra); in processQueryTargets()
2800 if(iq->num_target_queries > 0) { in processQueryTargets()
2806 if(qout_orig && iq->minimise_count > 0) { in processQueryTargets()
2807 iq->minimise_count--; in processQueryTargets()
2808 iq->qinfo_out.qname = qout_orig; in processQueryTargets()
2809 iq->qinfo_out.qname_len = qout_orig_len; in processQueryTargets()
2814 delegpt_count_addr(iq->dp, &naddr, &nres, &navail); in processQueryTargets()
2818 if(iq->caps_server+1 >= naddr*3 || in processQueryTargets()
2819 iq->caps_server*2+2 >= (size_t)ie->max_sent_count) { in processQueryTargets()
2824 (int)iq->caps_server+1, (int)naddr*3); in processQueryTargets()
2825 iq->response = iq->caps_response; in processQueryTargets()
2826 iq->caps_fallback = 0; in processQueryTargets()
2827 iter_dec_attempts(iq->dp, 3, ie->outbound_msg_retry); /* space for fallback */ in processQueryTargets()
2828 iq->num_current_queries++; /* RespState decrements it*/ in processQueryTargets()
2829 iq->referral_count++; /* make sure we don't loop */ in processQueryTargets()
2830 iq->sent_count = 0; in processQueryTargets()
2831 iq->dp_target_count = 0; in processQueryTargets()
2832 iq->state = QUERY_RESP_STATE; in processQueryTargets()
2836 (int)iq->caps_server); in processQueryTargets()
2846 (void)query_for_targets(qstate, iq, ie, id, tf_policy, &extra); in processQueryTargets()
2849 iq->num_target_queries += extra; in processQueryTargets()
2850 target_count_increase(iq, extra); in processQueryTargets()
2854 delegpt_add_unused_targets(iq->dp); in processQueryTargets()
2861 struct dns_msg* forged_response = rpz_callback_from_iterator_module(qstate, iq); in processQueryTargets()
2864 forged_response->rep, iq->qchase.qname, in processQueryTargets()
2865 iq->qchase.qname_len, LDNS_RR_TYPE_CNAME, in processQueryTargets()
2866 iq->qchase.qclass) && in processQueryTargets()
2867 iq->qchase.qtype != LDNS_RR_TYPE_CNAME && in processQueryTargets()
2870 if(!handle_cname_response(qstate, iq, forged_response, in processQueryTargets()
2875 iq->qchase.qname = sname; in processQueryTargets()
2876 iq->qchase.qname_len = snamelen; in processQueryTargets()
2878 rpz_callback_from_iterator_cname(qstate, iq); in processQueryTargets()
2883 iq->deleg_msg = NULL; in processQueryTargets()
2884 iq->dp = NULL; in processQueryTargets()
2885 iq->dsns_point = NULL; in processQueryTargets()
2886 iq->auth_zone_response = 0; in processQueryTargets()
2887 iq->refetch_glue = 0; in processQueryTargets()
2888 iq->query_restart_count++; in processQueryTargets()
2889 iq->sent_count = 0; in processQueryTargets()
2890 iq->dp_target_count = 0; in processQueryTargets()
2892 iq->minimisation_state = INIT_MINIMISE_STATE; in processQueryTargets()
2893 outbound_list_clear(&iq->outlist); in processQueryTargets()
2894 iq->num_current_queries = 0; in processQueryTargets()
2898 iq->num_target_queries = 0; in processQueryTargets()
2899 return next_state(iq, INIT_REQUEST_STATE); in processQueryTargets()
2906 iq->response = forged_response; in processQueryTargets()
2907 next_state(iq, FINISHED_STATE); in processQueryTargets()
2908 if(!iter_prepend(iq, qstate->return_msg, qstate->region)) { in processQueryTargets()
2917 target = iter_server_selection(ie, qstate->env, iq->dp, in processQueryTargets()
2918 iq->dp->name, iq->dp->namelen, iq->qchase.qtype, in processQueryTargets()
2919 &iq->dnssec_lame_query, &iq->chase_to_rd, in processQueryTargets()
2920 iq->num_target_queries, qstate->blacklist, in processQueryTargets()
2934 if(iq->num_target_queries==0 && iq->num_current_queries==0) { in processQueryTargets()
2938 if(delegpt_count_missing_targets(iq->dp, NULL) > 0) { in processQueryTargets()
2942 if((ret=query_for_targets(qstate, iq, ie, id, in processQueryTargets()
2945 errinf_dname(qstate, "at zone", iq->dp->name); in processQueryTargets()
2953 delegpt_count_missing_targets(iq->dp, NULL) == 0){ in processQueryTargets()
2968 errinf_dname(qstate, "at zone", iq->dp->name); in processQueryTargets()
2972 iq->num_target_queries += qs; in processQueryTargets()
2973 target_count_increase(iq, qs); in processQueryTargets()
2977 if(iq->num_target_queries == 0) { in processQueryTargets()
2981 if(iq->caps_fallback && iq->caps_reply) { in processQueryTargets()
2986 (int)iq->caps_server+1); in processQueryTargets()
2987 iq->response = iq->caps_response; in processQueryTargets()
2988 iq->caps_fallback = 0; in processQueryTargets()
2989 iter_dec_attempts(iq->dp, 3, ie->outbound_msg_retry); /* space for fallback */ in processQueryTargets()
2990 iq->num_current_queries++; /* RespState decrements it*/ in processQueryTargets()
2991 iq->referral_count++; /* make sure we don't loop */ in processQueryTargets()
2992 iq->sent_count = 0; in processQueryTargets()
2993 iq->dp_target_count = 0; in processQueryTargets()
2994 iq->state = QUERY_RESP_STATE; in processQueryTargets()
2997 return processLastResort(qstate, iq, ie, id); in processQueryTargets()
3004 check_waiting_queries(iq, qstate, id); in processQueryTargets()
3007 if(qout_orig && iq->minimise_count > 0) { in processQueryTargets()
3008 iq->minimise_count--; in processQueryTargets()
3009 iq->qinfo_out.qname = qout_orig; in processQueryTargets()
3010 iq->qinfo_out.qname_len = qout_orig_len; in processQueryTargets()
3020 if(can_do_promisc && tf_policy == 0 && iq->depth == 0 in processQueryTargets()
3021 && iq->depth < ie->max_dependency_depth in processQueryTargets()
3022 && ie->target_fetch_policy[iq->depth] != 0 in processQueryTargets()
3023 && iq->dp_target_count == 0 in processQueryTargets()
3028 (void)query_for_targets(qstate, iq, ie, id, 1, &extra); in processQueryTargets()
3032 iq->num_target_queries += extra; in processQueryTargets()
3033 target_count_increase(iq, extra); in processQueryTargets()
3034 check_waiting_queries(iq, qstate, id); in processQueryTargets()
3037 if(qout_orig && iq->minimise_count > 0) { in processQueryTargets()
3038 iq->minimise_count--; in processQueryTargets()
3039 iq->qinfo_out.qname = qout_orig; in processQueryTargets()
3040 iq->qinfo_out.qname_len = qout_orig_len; in processQueryTargets()
3046 target_count_increase_global_quota(iq, 1); in processQueryTargets()
3047 if(iq->target_count && iq->target_count[TARGET_COUNT_GLOBAL_QUOTA] in processQueryTargets()
3053 iq->target_count[TARGET_COUNT_GLOBAL_QUOTA]); in processQueryTargets()
3059 sq_check_ratelimit = (!(iq->chase_flags & BIT_RD) && !iq->ratelimit_ok); in processQueryTargets()
3062 log_query_info(VERB_QUERY, "sending query:", &iq->qinfo_out); in processQueryTargets()
3063 log_name_addr(VERB_QUERY, "sending to target:", iq->dp->name, in processQueryTargets()
3066 iq->dnssec_expected?"expected": "not expected", in processQueryTargets()
3067 iq->dnssec_lame_query?" but lame_query anyway": ""); in processQueryTargets()
3078 iq->dp->name, &real_addr, real_addrlen); in processQueryTargets()
3082 outq = (*qstate->env->send_query)(&iq->qinfo_out, in processQueryTargets()
3083 iq->chase_flags | (iq->chase_to_rd?BIT_RD:0), in processQueryTargets()
3088 ((iq->chase_to_rd||(iq->chase_flags&BIT_RD)!=0)&& in processQueryTargets()
3090 &iq->qinfo_out)||target->attempts==1)?0:BIT_CD), in processQueryTargets()
3091 iq->dnssec_expected, iq->caps_fallback || is_caps_whitelisted( in processQueryTargets()
3092 ie, iq), sq_check_ratelimit, &real_addr, real_addrlen, in processQueryTargets()
3093 iq->dp->name, iq->dp->namelen, in processQueryTargets()
3094 (iq->dp->tcp_upstream || qstate->env->cfg->tcp_upstream), in processQueryTargets()
3095 (iq->dp->ssl_upstream || qstate->env->cfg->ssl_upstream), in processQueryTargets()
3105 iq->dp->name); in processQueryTargets()
3111 iq->minimisation_state = SKIP_MINIMISE_STATE; in processQueryTargets()
3112 return next_state(iq, QUERYTARGETS_STATE); in processQueryTargets()
3114 outbound_list_insert(&iq->outlist, outq); in processQueryTargets()
3115 iq->num_current_queries++; in processQueryTargets()
3116 iq->sent_count++; in processQueryTargets()
3142 * @param iq: iterator query state.
3150 processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, in processQueryResponse() argument
3156 iq->num_current_queries--; in processQueryResponse()
3158 if(!inplace_cb_query_response_call(qstate->env, qstate, iq->response)) in processQueryResponse()
3161 if(iq->response == NULL) { in processQueryResponse()
3164 iq->minimisation_state = SKIP_MINIMISE_STATE; in processQueryResponse()
3166 iq->timeout_count++; in processQueryResponse()
3167 iq->chase_to_rd = 0; in processQueryResponse()
3168 iq->dnssec_lame_query = 0; in processQueryResponse()
3170 return next_state(iq, QUERYTARGETS_STATE); in processQueryResponse()
3172 iq->timeout_count = 0; in processQueryResponse()
3173 orig_empty_nodata_found = iq->empty_nodata_found; in processQueryResponse()
3175 (int)((iq->chase_flags&BIT_RD) || iq->chase_to_rd), in processQueryResponse()
3176 iq->response, &iq->qinfo_out, iq->dp, &iq->empty_nodata_found); in processQueryResponse()
3177 iq->chase_to_rd = 0; in processQueryResponse()
3179 iq->response->rep->flags &= ~BIT_TC; in processQueryResponse()
3180 if(orig_empty_nodata_found != iq->empty_nodata_found && in processQueryResponse()
3181 iq->empty_nodata_found < EMPTY_NODATA_RETRY_COUNT) { in processQueryResponse()
3185 iq->dp, &qstate->reply->remote_addr, in processQueryResponse()
3190 return next_state(iq, QUERYTARGETS_STATE); in processQueryResponse()
3192 if(type == RESPONSE_TYPE_REFERRAL && (iq->chase_flags&BIT_RD) && in processQueryResponse()
3193 !iq->auth_zone_response) { in processQueryResponse()
3198 if(!qstate->env->cfg->disable_dnssec_lame_check && iq->dnssec_expected in processQueryResponse()
3199 && !iq->dnssec_lame_query && in processQueryResponse()
3200 !(iq->chase_flags&BIT_RD) in processQueryResponse()
3201 && iq->sent_count < DNSSEC_LAME_DETECT_COUNT in processQueryResponse()
3208 if(!iter_msg_has_dnssec(iq->response)) { in processQueryResponse()
3215 iq->dp, &qstate->reply->remote_addr, in processQueryResponse()
3222 if(!iter_msg_from_zone(iq->response, iq->dp, type, in processQueryResponse()
3223 iq->qchase.qclass)) in processQueryResponse()
3228 } else iq->dnssec_lame_query = 0; in processQueryResponse()
3232 iq->response->rep, iq->response->rep->an_numrrsets, in processQueryResponse()
3233 iq->response->rep->an_numrrsets in processQueryResponse()
3234 + iq->response->rep->ns_numrrsets); in processQueryResponse()
3235 if(!ns) ns = find_NS(iq->response->rep, 0, in processQueryResponse()
3236 iq->response->rep->an_numrrsets); in processQueryResponse()
3237 if(!ns || !dname_strict_subdomain_c(ns->rk.dname, iq->dp->name) in processQueryResponse()
3238 || !dname_subdomain_c(iq->qchase.qname, ns->rk.dname)){ in processQueryResponse()
3242 iter_scrub_ds(iq->response, ns, iq->dp->name); in processQueryResponse()
3243 } else iter_scrub_ds(iq->response, NULL, NULL); in processQueryResponse()
3245 FLAGS_GET_RCODE(iq->response->rep->flags) == LDNS_RCODE_YXDOMAIN) { in processQueryResponse()
3251 if(type == RESPONSE_TYPE_CNAME && iq->response->rep->an_numrrsets >= 1 in processQueryResponse()
3252 && ntohs(iq->response->rep->rrsets[0]->rk.type) == LDNS_RR_TYPE_DNAME) { in processQueryResponse()
3255 get_cname_target(iq->response->rep->rrsets[0], &sname, in processQueryResponse()
3257 if(snamelen && dname_subdomain_c(sname, iq->response->rep->rrsets[0]->rk.dname)) { in processQueryResponse()
3263 iq->qchase.qtype == LDNS_RR_TYPE_CNAME && in processQueryResponse()
3264 iq->minimisation_state == MINIMISE_STATE && in processQueryResponse()
3265 query_dname_compare(iq->qchase.qname, iq->qinfo_out.qname) == 0) { in processQueryResponse()
3279 FLAGS_GET_RCODE(iq->response->rep->flags) in processQueryResponse()
3281 (iq->response->rep->an_numrrsets?"ANSWER": in processQueryResponse()
3286 if(iq->qchase.qtype == LDNS_RR_TYPE_DS && !iq->dsns_point in processQueryResponse()
3287 && !(iq->chase_flags&BIT_RD) in processQueryResponse()
3288 && iter_ds_toolow(iq->response, iq->dp) in processQueryResponse()
3289 && iter_dp_cangodown(&iq->qchase, iq->dp)) { in processQueryResponse()
3291 outbound_list_clear(&iq->outlist); in processQueryResponse()
3292 iq->num_current_queries = 0; in processQueryResponse()
3296 iq->num_target_queries = 0; in processQueryResponse()
3297 return processDSNSFind(qstate, iq, id); in processQueryResponse()
3300 iter_dns_store(qstate->env, &iq->response->qinfo, in processQueryResponse()
3301 iq->response->rep, in processQueryResponse()
3302 iq->qchase.qtype != iq->response->qinfo.qtype, in processQueryResponse()
3304 iq->dp&&iq->dp->has_parent_side_NS, in processQueryResponse()
3308 outbound_list_clear(&iq->outlist); in processQueryResponse()
3309 iq->num_current_queries = 0; in processQueryResponse()
3313 iq->num_target_queries = 0; in processQueryResponse()
3318 if(iq->minimisation_state != DONOT_MINIMISE_STATE in processQueryResponse()
3319 && !(iq->chase_flags & BIT_RD)) { in processQueryResponse()
3320 if(FLAGS_GET_RCODE(iq->response->rep->flags) != in processQueryResponse()
3323 if(FLAGS_GET_RCODE(iq->response->rep->flags) == in processQueryResponse()
3325 iter_scrub_nxdomain(iq->response); in processQueryResponse()
3326 return final_state(iq); in processQueryResponse()
3334 iq->minimisation_state = DONOT_MINIMISE_STATE; in processQueryResponse()
3336 if(FLAGS_GET_RCODE(iq->response->rep->flags) == in processQueryResponse()
3345 if(iq->dnssec_expected) in processQueryResponse()
3346 return final_state(iq); in processQueryResponse()
3355 &iq->response->qinfo); in processQueryResponse()
3357 iq->response->qinfo.qname, in processQueryResponse()
3358 iq->response->qinfo.qname_len, in processQueryResponse()
3359 iq->response->qinfo.qtype, in processQueryResponse()
3360 iq->response->qinfo.qclass, in processQueryResponse()
3361 qstate, id, iq, in processQueryResponse()
3369 return next_state(iq, QUERYTARGETS_STATE); in processQueryResponse()
3371 return final_state(iq); in processQueryResponse()
3388 reply_find_rrset_section_ns(iq->response->rep, in processQueryResponse()
3389 iq->qchase.qname, iq->qchase.qname_len, in processQueryResponse()
3390 LDNS_RR_TYPE_NS, iq->qchase.qclass) in processQueryResponse()
3391 || reply_find_rrset_section_an(iq->response->rep, in processQueryResponse()
3392 iq->qchase.qname, iq->qchase.qname_len, in processQueryResponse()
3393 LDNS_RR_TYPE_NS, iq->qchase.qclass) in processQueryResponse()
3398 iter_dns_store(qstate->env, &iq->response->qinfo, in processQueryResponse()
3399 iq->response->rep, 1, 0, 0, NULL, 0, in processQueryResponse()
3401 if(iq->store_parent_NS) in processQueryResponse()
3403 iq->response->rep); in processQueryResponse()
3406 iq->response->rep, iq->dp->name); in processQueryResponse()
3409 if(!qstate->no_cache_store && iq->query_for_pside_glue in processQueryResponse()
3410 && !iq->pside_glue) { in processQueryResponse()
3411 iq->pside_glue = reply_find_rrset(iq->response->rep, in processQueryResponse()
3412 iq->qchase.qname, iq->qchase.qname_len, in processQueryResponse()
3413 iq->qchase.qtype, iq->qchase.qclass); in processQueryResponse()
3414 if(iq->pside_glue) { in processQueryResponse()
3416 "glue", iq->pside_glue); in processQueryResponse()
3418 iq->pside_glue); in processQueryResponse()
3424 iq->deleg_msg = iq->response; in processQueryResponse()
3426 old_dp = iq->dp; in processQueryResponse()
3427 iq->dp = delegpt_from_message(iq->response, qstate->region); in processQueryResponse()
3429 iq->minimisation_state = INIT_MINIMISE_STATE; in processQueryResponse()
3430 if(!iq->dp) { in processQueryResponse()
3434 if(old_dp->namelabs + 1 < iq->dp->namelabs) { in processQueryResponse()
3441 uint8_t* qname = iq->dp->name; in processQueryResponse()
3442 size_t qnamelen = iq->dp->namelen; in processQueryResponse()
3445 iq->qchase.qclass, *qstate->env->now, in processQueryResponse()
3448 if(!cache_fill_missing(qstate->env, iq->qchase.qclass, in processQueryResponse()
3449 qstate->region, iq->dp, 0)) { in processQueryResponse()
3453 if(iq->store_parent_NS && query_dname_compare(iq->dp->name, in processQueryResponse()
3454 iq->store_parent_NS->name) == 0) in processQueryResponse()
3455 iter_merge_retry_counts(iq->dp, iq->store_parent_NS, in processQueryResponse()
3457 delegpt_log(VERB_ALGO, iq->dp); in processQueryResponse()
3459 iq->referral_count++; in processQueryResponse()
3460 iq->sent_count = 0; in processQueryResponse()
3461 iq->dp_target_count = 0; in processQueryResponse()
3464 iq->dnssec_expected = iter_indicates_dnssec(qstate->env, in processQueryResponse()
3465 iq->dp, iq->response, iq->qchase.qclass); in processQueryResponse()
3467 if(iq->dnssec_expected && qstate->env->cfg->prefetch_key && in processQueryResponse()
3469 generate_dnskey_prefetch(qstate, iq, id); in processQueryResponse()
3476 generate_ns_check(qstate, iq, id); in processQueryResponse()
3482 outbound_list_clear(&iq->outlist); in processQueryResponse()
3483 iq->num_current_queries = 0; in processQueryResponse()
3487 iq->num_target_queries = 0; in processQueryResponse()
3488 iq->response = NULL; in processQueryResponse()
3489 iq->fail_addr_type = 0; in processQueryResponse()
3491 return next_state(iq, QUERYTARGETS_STATE); in processQueryResponse()
3500 log_dns_msg("cname msg", &iq->response->qinfo, in processQueryResponse()
3501 iq->response->rep); in processQueryResponse()
3504 if(iq->qchase.qtype == LDNS_RR_TYPE_DS && !iq->dsns_point in processQueryResponse()
3505 && !(iq->chase_flags&BIT_RD) in processQueryResponse()
3506 && iter_ds_toolow(iq->response, iq->dp) in processQueryResponse()
3507 && iter_dp_cangodown(&iq->qchase, iq->dp)) { in processQueryResponse()
3508 outbound_list_clear(&iq->outlist); in processQueryResponse()
3509 iq->num_current_queries = 0; in processQueryResponse()
3513 iq->num_target_queries = 0; in processQueryResponse()
3514 return processDSNSFind(qstate, iq, id); in processQueryResponse()
3517 if(!handle_cname_response(qstate, iq, iq->response, in processQueryResponse()
3527 iter_dns_store(qstate->env, &iq->response->qinfo, in processQueryResponse()
3528 iq->response->rep, 1, qstate->prefetch_leeway, in processQueryResponse()
3529 iq->dp&&iq->dp->has_parent_side_NS, NULL, in processQueryResponse()
3532 iq->qchase.qname = sname; in processQueryResponse()
3533 iq->qchase.qname_len = snamelen; in processQueryResponse()
3537 rpz_callback_from_iterator_cname(qstate, iq); in processQueryResponse()
3540 forged_response->rep, iq->qchase.qname, in processQueryResponse()
3541 iq->qchase.qname_len, LDNS_RR_TYPE_CNAME, in processQueryResponse()
3542 iq->qchase.qclass) && in processQueryResponse()
3543 iq->qchase.qtype != LDNS_RR_TYPE_CNAME && in processQueryResponse()
3546 if(!handle_cname_response(qstate, iq, forged_response, in processQueryResponse()
3551 iq->qchase.qname = sname; in processQueryResponse()
3552 iq->qchase.qname_len = snamelen; in processQueryResponse()
3554 rpz_callback_from_iterator_cname(qstate, iq); in processQueryResponse()
3560 iq->response = forged_response; in processQueryResponse()
3561 next_state(iq, FINISHED_STATE); in processQueryResponse()
3562 if(!iter_prepend(iq, qstate->return_msg, qstate->region)) { in processQueryResponse()
3571 iq->deleg_msg = NULL; in processQueryResponse()
3572 iq->dp = NULL; in processQueryResponse()
3573 iq->dsns_point = NULL; in processQueryResponse()
3574 iq->auth_zone_response = 0; in processQueryResponse()
3575 iq->sent_count = 0; in processQueryResponse()
3576 iq->dp_target_count = 0; in processQueryResponse()
3577 if(iq->minimisation_state != MINIMISE_STATE) in processQueryResponse()
3580 iq->query_restart_count++; in processQueryResponse()
3582 iq->minimisation_state = INIT_MINIMISE_STATE; in processQueryResponse()
3588 outbound_list_clear(&iq->outlist); in processQueryResponse()
3589 iq->num_current_queries = 0; in processQueryResponse()
3593 iq->num_target_queries = 0; in processQueryResponse()
3600 return next_state(iq, INIT_REQUEST_STATE); in processQueryResponse()
3605 if(!dname_subdomain_c(iq->qchase.qname, iq->dp->name)) { in processQueryResponse()
3614 iq->dp->name, iq->dp->namelen, in processQueryResponse()
3616 iq->qchase.qtype)) in processQueryResponse()
3623 if(!dname_subdomain_c(iq->qchase.qname, iq->dp->name)) { in processQueryResponse()
3633 iq->dp->name, iq->dp->namelen, in processQueryResponse()
3634 *qstate->env->now, 0, 1, iq->qchase.qtype)) in processQueryResponse()
3653 iq->minimisation_state = DONOT_MINIMISE_STATE; in processQueryResponse()
3654 if(iq->auth_zone_response) { in processQueryResponse()
3656 iq->auth_zone_response = 0; in processQueryResponse()
3658 iq->dp->name, iq->dp->namelen, qstate->qinfo.qclass)) { in processQueryResponse()
3662 "for auth zone", iq->dp->name); in processQueryResponse()
3667 iq->auth_zone_avoid = 1; in processQueryResponse()
3668 if(iq->dp->auth_dp) { in processQueryResponse()
3671 iq->dp = NULL; in processQueryResponse()
3672 return next_state(iq, INIT_REQUEST_STATE); in processQueryResponse()
3675 return next_state(iq, QUERYTARGETS_STATE); in processQueryResponse()
3743 struct iter_qstate* iq = (struct iter_qstate*)qstate->minfo[id]; in processPrimeResponse() local
3745 iq->response->rep->flags &= ~(BIT_RD|BIT_RA); /* ignore rec-lame */ in processPrimeResponse()
3747 (int)((iq->chase_flags&BIT_RD) || iq->chase_to_rd), in processPrimeResponse()
3748 iq->response, &iq->qchase, iq->dp, NULL); in processPrimeResponse()
3751 qstate->return_msg = iq->response; in processPrimeResponse()
3770 qstate->qinfo.qclass, qstate, id, iq, in processPrimeResponse()
3774 generate_a_aaaa_check(qstate, iq, id); in processPrimeResponse()
3800 struct iter_qstate* iq = (struct iter_qstate*)qstate->minfo[id]; in processTargetResponse() local
3829 /* if iq->query_for_pside_glue then add the pside_glue (marked lame) */ in processTargetResponse()
3830 if(iq->pside_glue) { in processTargetResponse()
3835 iq->pside_glue); in processTargetResponse()
3837 iq->pside_glue, 1, NULL)) in processTargetResponse()
3846 rrset = reply_find_answer_rrset(&iq->qchase, qstate->return_msg->rep); in processTargetResponse()
3899 /* if the finished (iq->response) query has no NS set: continue in processDSNSResponse()
4039 struct iter_qstate* iq = (struct iter_qstate*)qstate->minfo[id]; in processCollectClass() local
4045 if(iq->qchase.qclass == 0) { in processCollectClass()
4047 iq->qchase.qclass = LDNS_RR_CLASS_ANY; in processCollectClass()
4055 c, qstate, id, iq, INIT_REQUEST_STATE, in processCollectClass()
4064 iq->num_current_queries ++; in processCollectClass()
4070 if(iq->num_current_queries == 0) { in processCollectClass()
4086 * @param iq: iterator query state.
4092 processFinished(struct module_qstate* qstate, struct iter_qstate* iq, in processFinished() argument
4099 if(!qstate->no_cache_store && iq->query_for_pside_glue in processFinished()
4100 && !iq->pside_glue) in processFinished()
4102 iq->deleg_msg?iq->deleg_msg->rep: in processFinished()
4103 (iq->response?iq->response->rep:NULL)); in processFinished()
4104 if(!iq->response) { in processFinished()
4112 iq->response->rep->flags |= BIT_RA; in processFinished()
4116 iq->response->rep->flags &= ~BIT_AA; in processFinished()
4119 iq->response->rep->flags |= BIT_QR; in processFinished()
4122 iq->response->rep->reason_bogus_str = NULL; in processFinished()
4129 iq->response->rep->reason_bogus_str = err_str; in processFinished()
4140 if(iq->an_prepend_list || iq->ns_prepend_list) { in processFinished()
4141 if(!iter_prepend(iq, iq->response, qstate->region)) { in processFinished()
4146 iq->response->qinfo = qstate->qinfo; in processFinished()
4148 iq->response->rep->security = sec_status_unchecked; in processFinished()
4154 iq->response->rep, 0, qstate->prefetch_leeway, in processFinished()
4155 iq->dp&&iq->dp->has_parent_side_NS, in processFinished()
4161 qstate->return_msg = iq->response; in processFinished()
4200 * @param iq: iterator query state.
4204 iter_handle(struct module_qstate* qstate, struct iter_qstate* iq, in iter_handle() argument
4210 iter_state_to_string(iq->state)); in iter_handle()
4211 switch(iq->state) { in iter_handle()
4213 cont = processInitRequest(qstate, iq, ie, id); in iter_handle()
4216 cont = processInitRequest2(qstate, iq, id); in iter_handle()
4219 cont = processInitRequest3(qstate, iq, id); in iter_handle()
4222 cont = processQueryTargets(qstate, iq, ie, id); in iter_handle()
4225 cont = processQueryResponse(qstate, iq, ie, id); in iter_handle()
4234 cont = processDSNSFind(qstate, iq, id); in iter_handle()
4237 cont = processFinished(qstate, iq, id); in iter_handle()
4241 iq->state); in iter_handle()
4253 * @param iq: iterator query state.
4257 process_request(struct module_qstate* qstate, struct iter_qstate* iq, in process_request() argument
4262 iq->state = INIT_REQUEST_STATE; in process_request()
4263 iq->final_state = FINISHED_STATE; in process_request()
4265 iter_handle(qstate, iq, ie, id); in process_request()
4270 process_response(struct module_qstate* qstate, struct iter_qstate* iq, in process_response() argument
4279 iq->response = NULL; in process_response()
4280 iq->state = QUERY_RESP_STATE; in process_response()
4282 if(event == module_event_noreply && iq->timeout_count >= 3 && in process_response()
4284 !iq->caps_fallback && !is_caps_whitelisted(ie, iq)) { in process_response()
4286 iq->caps_fallback = 1; in process_response()
4287 iq->caps_server = 0; in process_response()
4288 iq->caps_reply = NULL; in process_response()
4289 iq->caps_response = NULL; in process_response()
4290 iq->caps_minimisation_state = DONOT_MINIMISE_STATE; in process_response()
4291 iq->state = QUERYTARGETS_STATE; in process_response()
4292 iq->num_current_queries--; in process_response()
4295 iter_dec_attempts(iq->dp, 3, ie->outbound_msg_retry); in process_response()
4304 outbound_list_remove(&iq->outlist, outbound); in process_response()
4311 fill_fail_addr(iq, &qstate->reply->remote_addr, in process_response()
4326 iq->parse_failures++; in process_response()
4332 iq->parse_failures++; in process_response()
4355 if(!scrub_message(pkt, prs, &iq->qinfo_out, iq->dp->name, in process_response()
4358 if(event == module_event_capsfail && !iq->caps_fallback) { in process_response()
4359 iq->caps_fallback = 1; in process_response()
4360 iq->caps_server = 0; in process_response()
4361 iq->caps_reply = NULL; in process_response()
4362 iq->caps_response = NULL; in process_response()
4363 iq->caps_minimisation_state = DONOT_MINIMISE_STATE; in process_response()
4364 iq->state = QUERYTARGETS_STATE; in process_response()
4365 iq->num_current_queries--; in process_response()
4368 iq->scrub_failures++; in process_response()
4373 iq->response = dns_alloc_msg(pkt, prs, qstate->region); in process_response()
4374 if(!iq->response) in process_response()
4377 log_name_addr(VERB_DETAIL, "reply from", iq->dp->name, in process_response()
4380 log_dns_msg("incoming scrubbed packet:", &iq->response->qinfo, in process_response()
4381 iq->response->rep); in process_response()
4384 limit_nsec_ttl(iq->response); in process_response()
4386 if(event == module_event_capsfail || iq->caps_fallback) { in process_response()
4388 iq->minimisation_state != DONOT_MINIMISE_STATE) { in process_response()
4391 iq->minimisation_state = SKIP_MINIMISE_STATE; in process_response()
4395 caps_strip_reply(iq->response->rep); in process_response()
4397 if(iq->caps_fallback && in process_response()
4398 iq->caps_minimisation_state != iq->minimisation_state) { in process_response()
4401 iq->caps_fallback = 0; in process_response()
4404 if(!iq->caps_fallback) { in process_response()
4406 iq->caps_fallback = 1; in process_response()
4407 iq->caps_server = 0; in process_response()
4408 iq->caps_reply = iq->response->rep; in process_response()
4409 iq->caps_response = iq->response; in process_response()
4410 iq->caps_minimisation_state = iq->minimisation_state; in process_response()
4411 iq->state = QUERYTARGETS_STATE; in process_response()
4412 iq->num_current_queries--; in process_response()
4417 if(!iq->caps_reply) { in process_response()
4418 iq->caps_reply = iq->response->rep; in process_response()
4419 iq->caps_response = iq->response; in process_response()
4420 iq->caps_server = -1; /*become zero at ++, in process_response()
4422 } else if(caps_failed_rcode(iq->caps_reply) && in process_response()
4423 !caps_failed_rcode(iq->response->rep)) { in process_response()
4425 iq->caps_reply = iq->response->rep; in process_response()
4426 iq->caps_response = iq->response; in process_response()
4427 } else if(!caps_failed_rcode(iq->caps_reply) && in process_response()
4428 caps_failed_rcode(iq->response->rep)) { in process_response()
4433 } else if(caps_failed_rcode(iq->caps_reply) && in process_response()
4434 caps_failed_rcode(iq->response->rep)) { in process_response()
4437 } else if(!reply_equal(iq->response->rep, iq->caps_reply, in process_response()
4441 outbound_list_remove(&iq->outlist, outbound); in process_response()
4448 iq->caps_server++; in process_response()
4449 iq->state = QUERYTARGETS_STATE; in process_response()
4450 iq->num_current_queries--; in process_response()
4456 iq->caps_fallback = 0; /* if we were in fallback, 0x20 is OK now */ in process_response()
4459 outbound_list_remove(&iq->outlist, outbound); in process_response()
4460 iter_handle(qstate, iq, ie, id); in process_response()
4468 struct iter_qstate* iq = (struct iter_qstate*)qstate->minfo[id]; in iter_operate() local
4471 if(iq) log_query_info(VERB_QUERY, "iterator operate: query", in iter_operate()
4473 if(iq && qstate->qinfo.qname != iq->qchase.qname) in iter_operate()
4475 &iq->qchase); in iter_operate()
4479 iq == NULL) { in iter_operate()
4485 iq = (struct iter_qstate*)qstate->minfo[id]; in iter_operate()
4486 process_request(qstate, iq, ie, id); in iter_operate()
4489 if(iq && event == module_event_pass) { in iter_operate()
4490 iter_handle(qstate, iq, ie, id); in iter_operate()
4493 if(iq && outbound) { in iter_operate()
4494 process_response(qstate, iq, ie, id, outbound, event); in iter_operate()
4512 struct iter_qstate* iq; in iter_clear() local
4515 iq = (struct iter_qstate*)qstate->minfo[id]; in iter_clear()
4516 if(iq) { in iter_clear()
4517 outbound_list_clear(&iq->outlist); in iter_clear()
4518 if(iq->target_count && --iq->target_count[TARGET_COUNT_REF] == 0) { in iter_clear()
4519 free(iq->target_count); in iter_clear()
4520 if(*iq->nxns_dp) free(*iq->nxns_dp); in iter_clear()
4521 free(iq->nxns_dp); in iter_clear()
4523 iq->num_current_queries = 0; in iter_clear()