From: Jelte Jansen Date: Tue, 24 Jan 2006 11:07:10 +0000 (+0000) Subject: Moved nameserver retries to where they are marked as unreachable X-Git-Tag: release-1.1.0~393 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ec4334fe843489af4e3c4f8eded93c3b93c565d8;p=thirdparty%2Fldns.git Moved nameserver retries to where they are marked as unreachable Added error to send if no nameservers are reachable Made ldns-walk reset unreachable status Removed redundant error message walker --- diff --git a/error.c b/error.c index d488de8e..5841470c 100644 --- a/error.c +++ b/error.c @@ -24,6 +24,7 @@ ldns_lookup_table ldns_error_str[] = { { LDNS_STATUS_MEM_ERR, "General memory error" }, { LDNS_STATUS_INTERNAL_ERR, "Internal error, this should not happen" }, { LDNS_STATUS_ERR, "General error, this should be more specific" }, + { LDNS_STATUS_NO_NAMESERVERS_ERR, "No nameservers in resolver structure" }, { LDNS_STATUS_INVALID_INT, "Conversion error, integer expected" }, { LDNS_STATUS_INVALID_IP4, "Conversion error, ip4 addr expected" }, { LDNS_STATUS_INVALID_IP6, "Conversion error, ip6 addr expected" }, diff --git a/examples/ldns-walk.c b/examples/ldns-walk.c index a4ec1564..80cf0ed1 100644 --- a/examples/ldns-walk.c +++ b/examples/ldns-walk.c @@ -106,6 +106,7 @@ main(int argc, char *argv[]) int result = 0; int i; char *arg_end_ptr = NULL; + size_t j; p = NULL; rrlist = NULL; @@ -370,6 +371,12 @@ main(int argc, char *argv[]) printf("\n"); } p = ldns_resolver_query(res, last_dname_p, LDNS_RR_TYPE_ANY, LDNS_RR_CLASS_IN, LDNS_RD); + /* TODO: make a general option for this (something like ignore_rtt)? */ + for (j = 0; j < ldns_resolver_nameserver_count(res); j++) { + if (ldns_resolver_nameserver_rtt(res, j) != 0) { + ldns_resolver_set_nameserver_rtt(res, j, LDNS_RESOLV_RTT_MIN); + } + } if (verbosity >= 5) { if (p) { ldns_pkt_print(stdout, p); @@ -378,11 +385,6 @@ main(int argc, char *argv[]) } } - if (!p) { - fprintf(stderr, "Error trying to resolve: "); - ldns_rdf_print(stderr, last_dname_p); - fprintf(stderr, "\n"); - } } } diff --git a/ldns/error.h b/ldns/error.h index 38c25f7a..b482b523 100644 --- a/ldns/error.h +++ b/ldns/error.h @@ -28,6 +28,7 @@ enum ldns_enum_status LDNS_STATUS_MEM_ERR, LDNS_STATUS_INTERNAL_ERR, LDNS_STATUS_ERR, + LDNS_STATUS_NO_NAMESERVERS_ERR, LDNS_STATUS_INVALID_INT, LDNS_STATUS_INVALID_IP4, LDNS_STATUS_INVALID_IP6, diff --git a/net.c b/net.c index c833014e..53f9c886 100644 --- a/net.c +++ b/net.c @@ -36,6 +36,8 @@ ldns_send(ldns_pkt **result, ldns_resolver *r, ldns_pkt *query_pkt) size_t *rtt; ldns_pkt *reply; ldns_buffer *qb; + bool all_servers_rtt_inf; + uint8_t retries; uint8_t *reply_bytes = NULL; size_t reply_size = 0; @@ -49,6 +51,8 @@ ldns_send(ldns_pkt **result, ldns_resolver *r, ldns_pkt *query_pkt) ns_array = ldns_resolver_nameservers(r); reply = NULL; ns_len = 0; + all_servers_rtt_inf = true; + if (!query_pkt) { /* nothing to do? */ return LDNS_STATUS_ERR; @@ -76,6 +80,8 @@ ldns_send(ldns_pkt **result, ldns_resolver *r, ldns_pkt *query_pkt) /* not reacheable nameserver! */ continue; } + all_servers_rtt_inf = false; + ns = ldns_rdf2native_sockaddr_storage(ns_array[i], ldns_resolver_port(r), &ns_len); @@ -85,6 +91,7 @@ ldns_send(ldns_pkt **result, ldns_resolver *r, ldns_pkt *query_pkt) /* FREE OF NS */ /* continue; */ } + if ((ns->ss_family == AF_INET6) && (ldns_resolver_ip6(r) == LDNS_RESOLV_INET)) { /*printf("mismatch!!! 6 - 4\n");*/ @@ -93,15 +100,27 @@ ldns_send(ldns_pkt **result, ldns_resolver *r, ldns_pkt *query_pkt) gettimeofday(&tv_s, NULL); + send_status = LDNS_STATUS_ERR; /* reply_bytes implicitly handles our error */ if (1 == ldns_resolver_usevc(r)) { - send_status = ldns_tcp_send(&reply_bytes, qb, ns, (socklen_t)ns_len, ldns_resolver_timeout(r), &reply_size); + for (retries = ldns_resolver_retry(r); retries > 0; retries--) { + send_status = ldns_tcp_send(&reply_bytes, qb, ns, (socklen_t)ns_len, ldns_resolver_timeout(r), &reply_size); + if (send_status == LDNS_STATUS_OK) { + continue; + } + } } else { - send_status = ldns_udp_send(&reply_bytes, qb, ns, (socklen_t)ns_len, ldns_resolver_timeout(r), &reply_size); + for (retries = ldns_resolver_retry(r); retries > 0; retries--) { + send_status = ldns_udp_send(&reply_bytes, qb, ns, (socklen_t)ns_len, ldns_resolver_timeout(r), &reply_size); + if (send_status == LDNS_STATUS_OK) { + continue; + } + } } if (send_status != LDNS_STATUS_OK) { ldns_resolver_set_nameserver_rtt(r, i, LDNS_RESOLV_RTT_INF); + status = LDNS_STATUS_ERR; } /* obey the fail directive */ @@ -149,6 +168,9 @@ ldns_send(ldns_pkt **result, ldns_resolver *r, ldns_pkt *query_pkt) sleep((unsigned int) ldns_resolver_retrans(r)); } + if (all_servers_rtt_inf) { + return LDNS_STATUS_NO_NAMESERVERS_ERR; + } #ifdef HAVE_SSL if (tsig_mac && reply_bytes) { if (!ldns_pkt_tsig_verify(reply, @@ -167,6 +189,7 @@ ldns_send(ldns_pkt **result, ldns_resolver *r, ldns_pkt *query_pkt) if (result) { *result = reply; } + return status; } diff --git a/resolver.c b/resolver.c index 5038d048..0eccd52a 100644 --- a/resolver.c +++ b/resolver.c @@ -784,26 +784,21 @@ ldns_resolver_query(ldns_resolver *r, ldns_rdf *name, ldns_rr_type type, ldns_rr ldns_status ldns_resolver_send_pkt(ldns_pkt **answer, ldns_resolver *r, ldns_pkt *query_pkt) { - uint8_t retries; ldns_pkt *answer_pkt = NULL; ldns_status stat = LDNS_STATUS_OK; - for (retries = ldns_resolver_retry(r); retries > 0; retries--) { - stat = ldns_send(&answer_pkt, r, query_pkt); - if (stat == LDNS_STATUS_OK) { - break; - } - else { - if(answer_pkt) { - ldns_pkt_free(answer_pkt); - answer_pkt = NULL; - } + stat = ldns_send(&answer_pkt, r, query_pkt); + if (stat != LDNS_STATUS_OK) { + if(answer_pkt) { + ldns_pkt_free(answer_pkt); + answer_pkt = NULL; } } if (answer) { *answer = answer_pkt; } + return stat; }