]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
Moved nameserver retries to where they are marked as unreachable
authorJelte Jansen <jeltejan@NLnetLabs.nl>
Tue, 24 Jan 2006 11:07:10 +0000 (11:07 +0000)
committerJelte Jansen <jeltejan@NLnetLabs.nl>
Tue, 24 Jan 2006 11:07:10 +0000 (11:07 +0000)
Added error to send if no nameservers are reachable
Made ldns-walk reset unreachable status
Removed redundant error message walker

error.c
examples/ldns-walk.c
ldns/error.h
net.c
resolver.c

diff --git a/error.c b/error.c
index d488de8eb9afc951f41f2eda480ca55b2e90181a..5841470c43e6b40f34dfa9c22dba14208d1b0372 100644 (file)
--- 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" },
index a4ec156437810c4ca708125b0f8bab75569c9397..80cf0ed1ef2002f94b907b1fda8093e4e3f34cd3 100644 (file)
@@ -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");
-                   }
                  }
                }
 
index 38c25f7acab98de8c8b94bbbde4a4a3cf678630c..b482b523ad98ed75d83e2ce1f74394e6f26656da 100644 (file)
@@ -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 c833014e1f9c19cb5709a15d57fc62cf62e1c6cb..53f9c88696c482f9eeaf92c295913172d28a2c17 100644 (file)
--- 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;
 }
 
index 5038d04853eb047ac99331d56719411967f2acb7..0eccd52ab108d68b49e890cbf31e1f07e7df9ec6 100644 (file)
@@ -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;
 }