]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix operation in ipv6 only (do-ip4: no) mode.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 7 Sep 2011 14:34:10 +0000 (14:34 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 7 Sep 2011 14:34:10 +0000 (14:34 +0000)
git-svn-id: file:///svn/unbound/trunk@2487 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
iterator/iter_delegpt.c
iterator/iter_delegpt.h
iterator/iter_utils.c
iterator/iterator.c
iterator/iterator.h

index ea54e9d863c697eba9a2324ac1f60bb2519856c6..6cb5f73fd946f4b2621b35b57a2cbb219c1677da 100644 (file)
@@ -1,3 +1,6 @@
+7 September 2011: Wouter
+       - Fix operation in ipv6 only (do-ip4: no) mode.
+
 6 September 2011: Wouter
        - fedora specfile updated.
 
index 7d22646f3d526655882df4427d20a0c3bfe728b6..f49048d5c2694084ff145596e249672157ab8497 100644 (file)
@@ -482,3 +482,13 @@ void delegpt_no_ipv6(struct delegpt* dp)
                        ns->resolved = 1;
        }
 }
+
+void delegpt_no_ipv4(struct delegpt* dp)
+{
+       struct delegpt_ns* ns;
+       for(ns = dp->nslist; ns; ns = ns->next) {
+               /* no ipv4, so only ipv6 is enough to resolve a nameserver */
+               if(ns->got6)
+                       ns->resolved = 1;
+       }
+}
index d7fef0afb1af85f53dc4411dd4628e972fabcadd..c4ca62dc44d414e2b357d1c98fbbdbfad2e36528 100644 (file)
@@ -339,4 +339,11 @@ void delegpt_add_neg_msg(struct delegpt* dp, struct msgreply_entry* msg);
  */
 void delegpt_no_ipv6(struct delegpt* dp);
 
+/**
+ * Register the fact that there is no ipv4 and thus As are not going 
+ * to be queried for or be useful.
+ * @param dp: the delegation point. Updated to reflect no ipv4.
+ */
+void delegpt_no_ipv4(struct delegpt* dp);
+
 #endif /* ITERATOR_ITER_DELEGPT_H */
index 2bb216f1becae4b322531b9757d765d09a84f74f..7a7ab57221aa9d0c9d9f83b784f28d80a0bf1be2 100644 (file)
@@ -132,6 +132,7 @@ iter_apply_cfg(struct iter_env* iter_env, struct config_file* cfg)
                return 0;
        }
        iter_env->supports_ipv6 = cfg->do_ip6;
+       iter_env->supports_ipv4 = cfg->do_ip4;
        return 1;
 }
 
@@ -150,6 +151,7 @@ iter_apply_cfg(struct iter_env* iter_env, struct config_file* cfg)
  *             o The address is bogus (DNSSEC validation failure).
  *             o Listed as donotquery
  *             o is ipv6 but no ipv6 support (in operating system).
+ *             o is ipv4 but no ipv4 support (in operating system).
  *             o is lame
  *     Otherwise, an rtt in milliseconds.
  *     0 .. USEFUL_SERVER_TOP_TIMEOUT-1
@@ -194,6 +196,9 @@ iter_filter_unsuitable(struct iter_env* iter_env, struct module_env* env,
        if(!iter_env->supports_ipv6 && addr_is_ip6(&a->addr, a->addrlen)) {
                return -1; /* there is no ip6 available */
        }
+       if(!iter_env->supports_ipv4 && !addr_is_ip6(&a->addr, a->addrlen)) {
+               return -1; /* there is no ip4 available */
+       }
        /* check lameness - need zone , class info */
        if(infra_get_lame_rtt(env->infra_cache, &a->addr, a->addrlen, 
                name, namelen, qtype, &lame, &dnsseclame, &reclame, 
index e4bfa8d5ddca646f985c6c5a4c1e1118765b4a17..915e3fd1c87b7f37c06916bfbc2a342d358417a7 100644 (file)
@@ -1367,7 +1367,7 @@ query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq,
                        query_count++;
                }
                /* Send the A request. */
-               if(!ns->got4) {
+               if(ie->supports_ipv4 && !ns->got4) {
                        if(!generate_target_query(qstate, iq, id, 
                                ns->name, ns->namelen, 
                                LDNS_RR_TYPE_A, iq->qchase.qclass)) {
@@ -1476,7 +1476,7 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
                        ns->done_pside6 = 1;
                        query_count++;
                }
-               if(!ns->done_pside4) {
+               if(ie->supports_ipv4 && !ns->done_pside4) {
                        /* Send the A request. */
                        if(!generate_parentside_target_query(qstate, iq, id, 
                                ns->name, ns->namelen, 
@@ -1556,6 +1556,8 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
        }
        if(!ie->supports_ipv6)
                delegpt_no_ipv6(iq->dp);
+       if(!ie->supports_ipv4)
+               delegpt_no_ipv4(iq->dp);
        delegpt_log(VERB_ALGO, iq->dp);
 
        if(iq->num_current_queries>0) {
index 24fa6a3b5da0b250cb284f40692bb2739a114910..9137b404b3c9bd42173e8d050d44bec3988c1d7b 100644 (file)
@@ -93,6 +93,9 @@ struct iter_env {
        /** A flag to indicate whether or not we have an IPv6 route */
        int supports_ipv6;
 
+       /** A flag to indicate whether or not we have an IPv4 route */
+       int supports_ipv4;
+
        /** A set of inetaddrs that should never be queried. */
        struct iter_donotq* donotq;