Home | History | Annotate | Download | only in dns

Lines Matching refs:rctx

807 	      fetchctx_t *fctx, respctx_t *rctx);
810 rctx_answer_init(respctx_t *rctx);
813 rctx_answer_scan(respctx_t *rctx);
816 rctx_authority_positive(respctx_t *rctx);
819 rctx_answer_any(respctx_t *rctx);
822 rctx_answer_match(respctx_t *rctx);
825 rctx_answer_cname(respctx_t *rctx);
828 rctx_answer_dname(respctx_t *rctx);
831 rctx_answer_positive(respctx_t *rctx);
834 rctx_authority_negative(respctx_t *rctx);
837 rctx_authority_dnssec(respctx_t *rctx);
840 rctx_additional(respctx_t *rctx);
843 rctx_referral(respctx_t *rctx);
846 rctx_answer_none(respctx_t *rctx);
849 rctx_nextserver(respctx_t *rctx, dns_message_t *message,
853 rctx_resend(respctx_t *rctx, dns_adbaddrinfo_t *addrinfo);
856 rctx_next(respctx_t *rctx);
859 rctx_chaseds(respctx_t *rctx, dns_message_t *message,
863 rctx_done(respctx_t *rctx, isc_result_t result);
866 rctx_logpacket(respctx_t *rctx);
869 rctx_opt(respctx_t *rctx);
872 rctx_edns(respctx_t *rctx);
875 rctx_parse(respctx_t *rctx);
878 rctx_badserver(respctx_t *rctx, isc_result_t result);
881 rctx_answer(respctx_t *rctx);
884 rctx_lameserver(respctx_t *rctx);
887 rctx_dispfail(respctx_t *rctx);
890 rctx_delonly_zone(respctx_t *rctx);
893 rctx_ncache(respctx_t *rctx);
7258 respctx_t *rctx = arg;
7259 fetchctx_t *fctx = rctx->fctx;
7278 result = dns_message_findname(rctx->query->rmessage, section, addname,
7865 betterreferral(respctx_t *rctx) {
7870 for (result = dns_message_firstname(rctx->query->rmessage,
7873 result = dns_message_nextname(rctx->query->rmessage,
7877 dns_message_currentname(rctx->query->rmessage,
7879 if (!isstrictsubdomain(name, &rctx->fctx->domain)) {
7904 respctx_t rctx;
7921 rctx_respinit(task, devent, query, fctx, &rctx);
7926 rctx_done(&rctx, result);
7937 result = rctx_dispfail(&rctx);
7946 rctx_done(&rctx, result);
7956 rctx_done(&rctx, result);
7963 if ((rctx.retryopts & DNS_FETCHOPT_TCP) == 0) {
7964 if ((rctx.retryopts & DNS_FETCHOPT_NOEDNS0) == 0) {
7976 result = rctx_parse(&rctx);
7984 rctx_logpacket(&rctx);
7987 rctx.resend = true;
7989 rctx_done(&rctx, result);
7996 rctx.opt = dns_message_getopt(query->rmessage);
7997 if (rctx.opt != NULL) {
7998 rctx_opt(&rctx);
8001 if (query->rmessage->cc_bad && (rctx.retryopts & DNS_FETCHOPT_TCP) == 0)
8007 rctx.nextitem = true;
8016 rctx_done(&rctx, result);
8044 rctx.nextitem = true;
8045 rctx_done(&rctx, result);
8061 rctx.nextitem = true;
8063 rctx_done(&rctx, result);
8086 (rctx.retryopts & DNS_FETCHOPT_TCP) == 0)
8102 rctx.retryopts |= DNS_FETCHOPT_TCP;
8103 rctx.resend = true;
8104 rctx_done(&rctx, result);
8113 rctx_edns(&rctx);
8119 rctx.truncated = true;
8122 if (rctx.truncated) {
8124 if ((rctx.retryopts & DNS_FETCHOPT_TCP) != 0) {
8125 rctx.broken_server = DNS_R_TRUNCATEDTCP;
8126 rctx.next_server = true;
8128 rctx.retryopts |= DNS_FETCHOPT_TCP;
8129 rctx.resend = true;
8132 rctx_done(&rctx, result);
8140 rctx.broken_server = DNS_R_UNEXPECTEDOPCODE;
8141 rctx.next_server = true;
8143 rctx_done(&rctx, result);
8180 result = rctx_badserver(&rctx, result);
8188 result = rctx_lameserver(&rctx);
8196 rctx_delonly_zone(&rctx);
8219 result = rctx_answer(&rctx);
8231 result = rctx_answer_none(&rctx);
8247 rctx.next_server = true;
8250 rctx_done(&rctx, result);
8258 rctx.broken_server = DNS_R_UNEXPECTEDRCODE;
8259 rctx.next_server = true;
8261 rctx_done(&rctx, result);
8268 rctx_additional(&rctx);
8277 rctx.now);
8280 rctx_done(&rctx, tresult);
8288 rctx_ncache(&rctx);
8290 rctx_done(&rctx, result);
8295 * Initialize the response context structure 'rctx' to all zeroes, then set
8300 fetchctx_t *fctx, respctx_t *rctx) {
8301 memset(rctx, 0, sizeof(*rctx));
8303 rctx->task = task;
8304 rctx->devent = devent;
8305 rctx->query = query;
8306 rctx->fctx = fctx;
8307 rctx->broken_type = badns_response;
8308 rctx->retryopts = query->options;
8315 TIME_NOW(&rctx->tnow);
8316 rctx->finish = &rctx->tnow;
8317 isc_stdtime_get(&rctx->now);
8322 * Clear and reinitialize those portions of 'rctx' that will be needed
8328 rctx_answer_init(respctx_t *rctx) {
8329 fetchctx_t *fctx = rctx->fctx;
8331 rctx->aa = ((rctx->query->rmessage->flags & DNS_MESSAGEFLAG_AA) != 0);
8332 if (rctx->aa) {
8333 rctx->trust = dns_trust_authanswer;
8335 rctx->trust = dns_trust_answer;
8342 rctx->type = fctx->type;
8343 if (rctx->type == dns_rdatatype_rrsig ||
8344 rctx->type == dns_rdatatype_sig)
8346 rctx->type = dns_rdatatype_any;
8352 rctx->dname_labels = dns_name_countlabels(&fctx->name);
8353 rctx->domain_labels = dns_name_countlabels(&fctx->domain);
8355 rctx->found_type = dns_rdatatype_none;
8357 rctx->aname = NULL;
8358 rctx->ardataset = NULL;
8360 rctx->cname = NULL;
8361 rctx->crdataset = NULL;
8363 rctx->dname = NULL;
8364 rctx->drdataset = NULL;
8366 rctx->ns_name = NULL;
8367 rctx->ns_rdataset = NULL;
8369 rctx->soa_name = NULL;
8370 rctx->ds_name = NULL;
8371 rctx->found_name = NULL;
8379 rctx_dispfail(respctx_t *rctx) {
8380 dns_dispatchevent_t *devent = rctx->devent;
8381 fetchctx_t *fctx = rctx->fctx;
8382 resquery_t *query = rctx->query;
8389 (rctx->retryopts & DNS_FETCHOPT_NOEDNS0) == 0)
8395 rctx->retryopts |= DNS_FETCHOPT_NOEDNS0;
8396 rctx->resend = true;
8402 rctx->next_server = true;
8417 rctx->broken_server = devent->result;
8418 rctx->broken_type = badns_unreachable;
8419 rctx->finish = NULL;
8420 rctx->no_response = true;
8424 rctx_done(rctx, ISC_R_SUCCESS);
8433 rctx_parse(respctx_t *rctx) {
8435 fetchctx_t *fctx = rctx->fctx;
8436 resquery_t *query = rctx->query;
8438 result = dns_message_parse(query->rmessage, &rctx->devent->buffer, 0);
8449 (rctx->retryopts & DNS_FETCHOPT_TCP) == 0)
8455 rctx->truncated = true;
8468 if ((rctx->retryopts & DNS_FETCHOPT_NOEDNS0) == 0) {
8474 rctx->retryopts |= DNS_FETCHOPT_NOEDNS0;
8475 rctx->resend = true;
8479 rctx->broken_server = result;
8480 rctx->next_server = true;
8483 rctx_done(rctx, result);
8486 if ((rctx->retryopts & DNS_FETCHOPT_NOEDNS0) == 0) {
8492 rctx->retryopts |= DNS_FETCHOPT_NOEDNS0;
8493 rctx->resend = true;
8497 rctx->broken_server = DNS_R_UNEXPECTEDRCODE;
8498 rctx->next_server = true;
8501 rctx_done(rctx, result);
8507 rctx_done(rctx, result);
8519 rctx_opt(respctx_t *rctx) {
8520 resquery_t *query = rctx->query;
8521 fetchctx_t *fctx = rctx->fctx;
8533 result = dns_rdataset_first(rctx->opt);
8536 dns_rdataset_current(rctx->opt, &rdata);
8599 rctx_edns(respctx_t *rctx) {
8600 resquery_t *query = rctx->query;
8601 fetchctx_t *fctx = rctx->fctx;
8609 if (rctx->opt == NULL && !EDNSOK(query->addrinfo) &&
8623 } else if (rctx->opt == NULL &&
8628 (rctx->retryopts & DNS_FETCHOPT_NOEDNS0) == 0)
8654 if (rctx->opt != NULL && !EDNSOK(query->addrinfo) &&
8655 (rctx->retryopts & DNS_FETCHOPT_NOEDNS0) == 0 &&
8673 rctx_answer(respctx_t *rctx) {
8675 fetchctx_t *fctx = rctx->fctx;
8676 resquery_t *query = rctx->query;
8681 result = rctx_answer_positive(rctx);
8694 result = rctx_answer_positive(rctx);
8699 } else if (fctx->type != dns_rdatatype_ns && !betterreferral(rctx)) {
8700 result = rctx_answer_positive(rctx);
8718 rctx->ns_in_answer = true;
8719 result = rctx_answer_none(rctx);
8736 rctx->glue_in_answer = true;
8737 result = rctx_answer_none(rctx);
8753 rctx->broken_server = DNS_R_LAME;
8754 rctx->next_server = true;
8755 rctx_done(rctx, result);
8762 rctx->next_server = true;
8764 rctx_done(rctx, result);
8779 rctx_answer_positive(respctx_t *rctx) {
8781 fetchctx_t *fctx = rctx->fctx;
8785 rctx_answer_init(rctx);
8786 rctx_answer_scan(rctx);
8793 if (rctx->aname != NULL && rctx->type == dns_rdatatype_any) {
8794 result = rctx_answer_any(rctx);
8796 return (rctx->result);
8798 } else if (rctx->aname != NULL) {
8799 result = rctx_answer_match(rctx);
8801 return (rctx->result);
8803 } else if (rctx->cname != NULL) {
8804 result = rctx_answer_cname(rctx);
8806 return (rctx->result);
8808 } else if (rctx->dname != NULL) {
8809 result = rctx_answer_dname(rctx);
8811 return (rctx->result);
8826 if (rctx->chaining) {
8834 if (rctx->query->rmessage->rcode != dns_rcode_noerror) {
8844 rctx_authority_positive(rctx);
8848 if (rctx->ns_rdataset != NULL &&
8849 dns_name_equal(&fctx->domain, rctx->ns_name) &&
8850 !dns_name_equal(rctx->ns_name, dns_rootname))
8852 trim_ns_ttl(fctx, rctx->ns_name, rctx->ns_rdataset);
8867 rctx_answer_scan(respctx_t *rctx) {
8869 fetchctx_t *fctx = rctx->fctx;
8872 for (result = dns_message_firstname(rctx->query->rmessage,
8875 result = dns_message_nextname(rctx->query->rmessage,
8883 dns_message_currentname(rctx->query->rmessage,
8893 if (rdataset->type == rctx->type ||
8894 rctx->type == dns_rdatatype_any)
8896 rctx->aname = name;
8897 if (rctx->type != dns_rdatatype_any) {
8898 rctx->ardataset = rdataset;
8903 rctx->cname = name;
8904 rctx->crdataset = rdataset;
8924 if (nlabels >= rctx->dname_labels ||
8925 nlabels < rctx->domain_labels)
8941 rctx->dname = name;
8942 rctx->drdataset = rdataset;
8943 rctx->dname_labels = nlabels;
8958 if (rctx->dname != NULL) {
8959 rctx->aname = NULL;
8960 rctx->ardataset = NULL;
8961 rctx->cname = NULL;
8962 rctx->crdataset = NULL;
8963 } else if (rctx->aname != NULL) {
8964 rctx->cname = NULL;
8965 rctx->crdataset = NULL;
8976 rctx_answer_any(respctx_t *rctx) {
8978 fetchctx_t *fctx = rctx->fctx;
8980 for (rdataset = ISC_LIST_HEAD(rctx->aname->list); rdataset != NULL;
8984 rctx->result = DNS_R_FORMERR;
8997 !is_answeraddress_allowed(fctx->res->view, rctx->aname,
9000 rctx->result = DNS_R_SERVFAIL;
9006 !is_answertarget_allowed(fctx, &fctx->name, rctx->aname,
9009 rctx->result = DNS_R_SERVFAIL;
9013 rctx->aname->attributes |= DNS_NAMEATTR_CACHE;
9014 rctx->aname->attributes |= DNS_NAMEATTR_ANSWER;
9017 rdataset->trust = rctx->trust;
9020 rctx);
9034 rctx_answer_match(respctx_t *rctx) {
9036 fetchctx_t *fctx = rctx->fctx;
9038 if (!validinanswer(rctx->ardataset, fctx)) {
9039 rctx->result = DNS_R_FORMERR;
9043 if ((rctx->ardataset->type == dns_rdatatype_a ||
9044 rctx->ardataset->type == dns_rdatatype_aaaa) &&
9045 !is_answeraddress_allowed(fctx->res->view, rctx->aname,
9046 rctx->ardataset))
9048 rctx->result = DNS_R_SERVFAIL;
9051 if ((rctx->ardataset->type == dns_rdatatype_cname ||
9052 rctx->ardataset->type == dns_rdatatype_dname) &&
9053 rctx->type != rctx->ardataset->type &&
9054 rctx->type != dns_rdatatype_any &&
9055 !is_answertarget_allowed(fctx, &fctx->name, rctx->aname,
9056 rctx->ardataset, NULL))
9058 rctx->result = DNS_R_SERVFAIL;
9062 rctx->aname->attributes |= DNS_NAMEATTR_CACHE;
9063 rctx->aname->attributes |= DNS_NAMEATTR_ANSWER;
9064 rctx->ardataset->attributes |= DNS_RDATASETATTR_ANSWER;
9065 rctx->ardataset->attributes |= DNS_RDATASETATTR_CACHE;
9066 rctx->ardataset->trust = rctx->trust;
9067 (void)dns_rdataset_additionaldata(rctx->ardataset, check_related, rctx);
9069 for (sigrdataset = ISC_LIST_HEAD(rctx->aname->list);
9074 rctx->result = DNS_R_FORMERR;
9079 sigrdataset->covers != rctx->type)
9086 sigrdataset->trust = rctx->trust;
9099 rctx_answer_cname(respctx_t *rctx) {
9101 fetchctx_t *fctx = rctx->fctx;
9103 if (!validinanswer(rctx->crdataset, fctx)) {
9104 rctx->result = DNS_R_FORMERR;
9108 if (rctx->type == dns_rdatatype_rrsig ||
9109 rctx->type == dns_rdatatype_key || rctx->type == dns_rdatatype_nsec)
9112 dns_rdatatype_format(rctx->type, buf, sizeof(buf));
9114 rctx->result = DNS_R_FORMERR;
9118 if (!is_answertarget_allowed(fctx, &fctx->name, rctx->cname,
9119 rctx->crdataset, NULL))
9121 rctx->result = DNS_R_SERVFAIL;
9125 rctx->cname->attributes |= DNS_NAMEATTR_CACHE;
9126 rctx->cname->attributes |= DNS_NAMEATTR_ANSWER;
9127 rctx->cname->attributes |= DNS_NAMEATTR_CHAINING;
9128 rctx->crdataset->attributes |= DNS_RDATASETATTR_ANSWER;
9129 rctx->crdataset->attributes |= DNS_RDATASETATTR_CACHE;
9130 rctx->crdataset->attributes |= DNS_RDATASETATTR_CHAINING;
9131 rctx->crdataset->trust = rctx->trust;
9133 for (sigrdataset = ISC_LIST_HEAD(rctx->cname->list);
9138 rctx->result = DNS_R_FORMERR;
9150 sigrdataset->trust = rctx->trust;
9154 rctx->chaining = true;
9163 rctx_answer_dname(respctx_t *rctx) {
9165 fetchctx_t *fctx = rctx->fctx;
9167 if (!validinanswer(rctx->drdataset, fctx)) {
9168 rctx->result = DNS_R_FORMERR;
9172 if (!is_answertarget_allowed(fctx, &fctx->name, rctx->dname,
9173 rctx->drdataset, &rctx->chaining))
9175 rctx->result = DNS_R_SERVFAIL;
9179 rctx->dname->attributes |= DNS_NAMEATTR_CACHE;
9180 rctx->dname->attributes |= DNS_NAMEATTR_ANSWER;
9181 rctx->dname->attributes |= DNS_NAMEATTR_CHAINING;
9182 rctx->drdataset->attributes |= DNS_RDATASETATTR_ANSWER;
9183 rctx->drdataset->attributes |= DNS_RDATASETATTR_CACHE;
9184 rctx->drdataset->attributes |= DNS_RDATASETATTR_CHAINING;
9185 rctx->drdataset->trust = rctx->trust;
9187 for (sigrdataset = ISC_LIST_HEAD(rctx->dname->list);
9192 rctx->result = DNS_R_FORMERR;
9204 sigrdataset->trust = rctx->trust;
9223 rctx_authority_positive(respctx_t *rctx) {
9224 fetchctx_t *fctx = rctx->fctx;
9228 result = dns_message_firstname(rctx->query->rmessage,
9233 dns_message_currentname(rctx->query->rmessage,
9255 if (rctx->aa) {
9265 rctx->ns_name = name;
9266 rctx->ns_rdataset = rdataset;
9273 rdataset, check_related, rctx);
9279 result = dns_message_nextname(rctx->query->rmessage,
9292 rctx_answer_none(respctx_t *rctx) {
9294 fetchctx_t *fctx = rctx->fctx;
9298 rctx_answer_init(rctx);
9304 if (rctx->query->rmessage->rcode == dns_rcode_nxdomain ||
9305 (rctx->query->rmessage->counts[DNS_SECTION_ANSWER] == 0 &&
9306 rctx->query->rmessage->counts[DNS_SECTION_AUTHORITY] == 0))
9308 rctx->negative = true;
9314 result = rctx_authority_negative(rctx);
9316 return (rctx->result);
9321 if (rctx->ns_rdataset != NULL &&
9322 dns_name_equal(&fctx->domain, rctx->ns_name) &&
9323 !dns_name_equal(rctx->ns_name, dns_rootname))
9325 trim_ns_ttl(fctx, rctx->ns_name, rctx->ns_rdataset);
9335 if (rctx->soa_name != NULL) {
9336 rctx->negative = true;
9339 if (!rctx->ns_in_answer && !rctx->glue_in_answer) {
9343 result = rctx_authority_dnssec(rctx);
9345 return (rctx->result);
9352 if (rctx->negative &&
9353 rctx->query->rmessage->rcode == dns_rcode_noerror &&
9354 fctx->type == dns_rdatatype_ds && rctx->soa_name != NULL &&
9355 dns_name_equal(rctx->soa_name, &fctx->name) &&
9364 if (!rctx->negative && rctx->ns_name == NULL) {
9368 if (rctx->found_name == NULL) {
9372 if (!dns_name_issubdomain(rctx->found_name, &fctx->domain)) {
9377 dns_rdatatype_format(rctx->found_type, tbuf,
9379 dns_name_format(rctx->found_name, nbuf, sizeof(nbuf));
9395 if (rctx->ns_name != NULL && rctx->soa_name != NULL &&
9396 rctx->ns_name != rctx->soa_name)
9405 result = rctx_referral(rctx);
9407 return (rctx->result);
9414 if (rctx->ns_name != NULL) {
9415 rctx->ns_name->attributes &= ~DNS_NAMEATTR_CACHE;
9418 if (rctx->negative) {
9433 rctx_authority_negative(respctx_t *rctx) {
9435 fetchctx_t *fctx = rctx->fctx;
9440 if (rctx->ns_in_answer) {
9447 result = dns_message_firstname(rctx->query->rmessage, section);
9455 dns_message_currentname(rctx->query->rmessage, section, &name);
9456 result = dns_message_nextname(rctx->query->rmessage, section);
9498 if (rctx->ns_name != NULL &&
9499 name != rctx->ns_name)
9506 rctx->result = DNS_R_FORMERR;
9509 rctx->ns_name = name;
9510 rctx->ns_rdataset = rdataset;
9523 if (rctx->soa_name != NULL &&
9524 name != rctx->soa_name)
9531 rctx->result = DNS_R_FORMERR;
9534 rctx->soa_name = name;
9538 if (rctx->aa) {
9562 rctx_ncache(respctx_t *rctx) {
9565 fetchctx_t *fctx = rctx->fctx;
9574 if (rctx->query->rmessage->rcode == dns_rcode_nxdomain &&
9585 result = ncache_message(fctx, rctx->query->rmessage,
9586 rctx->query->addrinfo, covers, rctx->now);
9599 rctx_authority_dnssec(respctx_t *rctx) {
9601 fetchctx_t *fctx = rctx->fctx;
9605 REQUIRE(!rctx->ns_in_answer && !rctx->glue_in_answer);
9607 result = dns_message_firstname(rctx->query->rmessage,
9616 dns_message_currentname(rctx->query->rmessage,
9618 result = dns_message_nextname(rctx->query->rmessage,
9629 rctx->found_name = name;
9630 rctx->found_type = ISC_LIST_HEAD(name->list)->type;
9648 if (rctx->negative) {
9658 if (rctx->aa) {
9678 if (rctx->ns_name == NULL) {
9681 rctx->result = DNS_R_FORMERR;
9686 if (rctx->ds_name != NULL &&
9687 name != rctx->ds_name)
9693 rctx->result = DNS_R_FORMERR;
9696 rctx->ds_name = name;
9717 } else if (rctx->aa) {
9741 rctx_referral(respctx_t *rctx) {
9743 fetchctx_t *fctx = rctx->fctx;
9745 if (rctx->negative || rctx->ns_name == NULL) {
9755 if (dns_name_equal(rctx->ns_name, &fctx->domain)) {
9757 rctx->result = DNS_R_FORMERR;
9765 if (!dns_name_issubdomain(&fctx->name, rctx->ns_name)) {
9769 rctx->result = DNS_R_FORMERR;
9778 INSIST(rctx->ns_rdataset != NULL);
9780 (void)dns_rdataset_additionaldata(rctx->ns_rdataset, check_related,
9781 rctx);
9790 if (rctx->glue_in_answer &&
9793 (void)dns_rdataset_additionaldata(rctx->ns_rdataset,
9806 if (rctx->ns_rdataset->ttl == 0) {
9807 rctx->ns_rdataset->ttl = 1;
9825 dns_name_dup(rctx->ns_name, fctx->mctx, &fctx->domain);
9830 dns_name_dup(rctx->ns_name, fctx->mctx, &fctx->qmindcname);
9834 rctx->result = result;
9841 rctx->result = result;
9848 rctx->result = DNS_R_DELEGATION;
9851 * Reinitialize 'rctx' to prepare for following the delegation:
9856 if ((rctx->fctx->options & DNS_FETCHOPT_NOFOLLOW) == 0) {
9857 rctx->get_nameservers = true;
9858 rctx->next_server = true;
9859 rctx->fctx->restarts = 0;
9860 rctx->fctx->referrals++;
9861 rctx->fctx->querysent = 0;
9862 rctx->fctx->lamecount = 0;
9863 rctx->fctx->quotacount = 0;
9864 rctx->fctx->neterr = 0;
9865 rctx->fctx->badresp = 0;
9866 rctx->fctx->adberr = 0;
9878 rctx_additional(respctx_t *rctx) {
9886 for (result = dns_message_firstname(rctx->query->rmessage, section);
9888 result = dns_message_nextname(rctx->query->rmessage, section))
9892 dns_message_currentname(rctx->query->rmessage,
9904 rdataset, check_related, rctx);
9920 rctx_nextserver(respctx_t *rctx, dns_message_t *message,
9922 fetchctx_t *fctx = rctx->fctx;
9925 rctx->broken_server = DNS_R_FORMERR;
9927 if (rctx->broken_server != ISC_R_SUCCESS) {
9932 add_bad(fctx, message, addrinfo, rctx->broken_server,
9933 rctx->broken_type);
9936 if (rctx->get_nameservers) {
9951 if ((rctx
9996 fctx_try(fctx, !rctx->get_nameservers, false);
10003 * passing rctx->retryopts (which is based on query->options, but may have been
10007 rctx_resend(respctx_t *rctx, dns_adbaddrinfo_t *addrinfo) {
10009 fetchctx_t *fctx = rctx->fctx;
10017 result = fctx_query(fctx, addrinfo, rctx->retryopts);
10040 rctx_next(respctx_t *rctx) {
10042 fetchctx_t *fctx = rctx->fctx;
10047 inc_stats(rctx->fctx->res, dns_resstatscounter_nextitem);
10048 INSIST(rctx->query->dispentry != NULL);
10049 dns_message_reset(rctx->query->rmessage, DNS_MESSAGE_INTENTPARSE);
10050 result = dns_dispatch_getnext(rctx->query->dispentry, &rctx->devent);
10052 fctx_done(rctx->fctx, result, __LINE__);
10061 rctx_chaseds(respctx_t *rctx, dns_message_t *message,
10063 fetchctx_t *fctx = rctx->fctx;
10066 add_bad(fctx, message, addrinfo, result, rctx->broken_type);
10078 NULL, 0, fctx->options, 0, NULL, rctx->task, resume_dslookup,
10102 rctx_done(respctx_t *rctx, isc_result_t result) {
10103 resquery_t *query = rctx->query;
10104 fetchctx_t *fctx = rctx->fctx;
10116 rctx->no_response ? "no response" : "responding", result);
10123 if (!rctx->nextitem) {
10124 fctx_cancelquery(&query, &rctx->devent, rctx->finish,
10125 rctx->no_response, false);
10130 (rctx->next_server || rctx->resend || rctx->nextitem))
10132 if (rctx->nextitem) {
10133 fctx_cancelquery(&query, &rctx->devent, rctx->finish,
10134 rctx->no_response, false);
10140 if (rctx->next_server) {
10141 rctx_nextserver(rctx, message, addrinfo, result);
10142 } else if (rctx->resend) {
10143 rctx_resend(rctx, addrinfo);
10144 } else if (rctx->nextitem) {
10145 rctx_next(rctx);
10147 rctx_chaseds(rctx, message, addrinfo, result);
10178 rctx_logpacket(respctx_t *rctx) {
10181 fetchctx_t *fctx = rctx->fctx;
10192 rctx->query->rmessage, "received packet from",
10193 &rctx->query->addrinfo->sockaddr, DNS_LOGCATEGORY_RESOLVER,
10195 ISC_LOG_DEBUG(10), rctx->fctx->res->mctx);
10219 sock = query2sock(rctx->query);
10229 &rctx->query->addrinfo->sockaddr,
10230 ((rctx->query->options & DNS_FETCHOPT_TCP) != 0), &zr,
10231 &rctx->query->start, NULL, &rctx->devent->buffer);
10240 rctx_badserver(respctx_t *rctx, isc_result_t result) {
10241 fetchctx_t *fctx = rctx->fctx;
10242 resquery_t *query = rctx->query;
10245 dns_rcode_t rcode = rctx->query->rmessage->rcode;
10254 (rctx->retryopts & DNS_FETCHOPT_NOEDNS0) == 0)
10267 rctx->retryopts |= DNS_FETCHOPT_NOEDNS0;
10268 rctx->resend = true;
10280 rctx->broken_server = DNS_R_REMOTEFORMERR;
10281 rctx->next_server = true;
10300 INSIST(rctx->opt != NULL);
10301 version = (rctx->opt->ttl >> 16) & 0xff;
10332 rctx->resend = true;
10334 rctx->broken_server = DNS_R_BADVERS;
10335 rctx->next_server = true;
10338 rctx->broken_server = DNS_R_BADVERS;
10339 rctx->next_server = true;
10341 } else if (rcode == dns_rcode_badcookie && rctx->query->rmessage->cc_ok)
10347 rctx->retryopts |= DNS_FETCHOPT_TCP;
10350 rctx->resend = true;
10352 rctx->broken_server = DNS_R_UNEXPECTEDRCODE;
10353 rctx->next_server = true;
10360 rctx_done(rctx, result);
10370 rctx_lameserver(respctx_t *rctx) {
10372 fetchctx_t *fctx = rctx->fctx;
10373 resquery_t *query = rctx->query;
10384 rctx->now + fctx->res->lame_ttl);
10392 rctx->broken_server = DNS_R_LAME;
10393 rctx->next_server = true;
10395 rctx_done(rctx, result);
10405 rctx_delonly_zone(respctx_t *rctx) {
10406 fetchctx_t *fctx = rctx->fctx;
10413 if (ISFORWARDER(rctx->query->addrinfo) ||
10416 !fix_mustbedelegationornxdomain(rctx->query->rmessage, fctx))
10425 isc_sockaddr_format(&rctx->query->addrinfo->sockaddr, addrbuf,