]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Use QTYPE=A for QNAME minimisation.
authorRalph Dolmans <ralph@nlnetlabs.nl>
Mon, 13 Jun 2016 13:06:35 +0000 (13:06 +0000)
committerRalph Dolmans <ralph@nlnetlabs.nl>
Mon, 13 Jun 2016 13:06:35 +0000 (13:06 +0000)
- Keep track of number of time-outs when performing QNAME minimisation.
  Stop minimising when number of time-outs for a QNAME/QTYPE pair is
  more than three.

git-svn-id: file:///svn/unbound/trunk@3782 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
iterator/iterator.c
iterator/iterator.h
testdata/iter_resolve_minimised.rpl
testdata/iter_resolve_minimised_nx.rpl
testdata/iter_resolve_minimised_refused.rpl

index c02e694b0e9d7147e05e8ad2db3a319f364f6d50..03ccb4f9f0bc94a806a6233b0312a097d255188f 100644 (file)
@@ -1,3 +1,9 @@
+13 June 2016: Ralph
+       - Use QTYPE=A for QNAME minimisation.
+       - Keep track of number of time-outs when performing QNAME minimisation.
+         Stop minimising when number of time-outs for a QNAME/QTYPE pair is
+         more than three.
+
 13 June 2016: Wouter
        - Fix #778: unbound 1.5.9: -h segfault (null deref).
 
index 139cae4bae0acb2966b67e33967754f14cf0abb7..749fba6af63821632b69d40f77e3d4ffbbf5c8e8 100644 (file)
@@ -148,6 +148,7 @@ iter_new(struct module_qstate* qstate, int id)
        iq->qchase = qstate->qinfo;
        outbound_list_init(&iq->outlist);
        iq->minimise_count = 0;
+       iq->minimise_timeout_count = 0;
        if (qstate->env->cfg->qname_minimisation)
                iq->minimisation_state = INIT_MINIMISE_STATE;
        else
@@ -2008,7 +2009,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                                iq->dp->name))) {
                        iq->qinfo_out.qname = iq->dp->name;
                        iq->qinfo_out.qname_len = iq->dp->namelen;
-                       iq->qinfo_out.qtype = LDNS_RR_TYPE_NS;
+                       iq->qinfo_out.qtype = LDNS_RR_TYPE_A;
                        iq->qinfo_out.qclass = iq->qchase.qclass;
                        iq->minimise_count = 0;
                }
@@ -2023,6 +2024,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                iq->qinfo_out.qname = iq->qchase.qname;
                iq->qinfo_out.qname_len = iq->qchase.qname_len;
                iq->minimise_count++;
+               iq->minimise_timeout_count = 0;
 
                /* Limit number of iterations for QNAMEs with more
                 * than MAX_MINIMISE_COUNT labels. Send first MINIMISE_ONE_LAB
@@ -2059,8 +2061,9 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                                &iq->qinfo_out.qname_len, 
                                labdiff-1);
                }
-               if(labdiff < 1 || 
-                       (labdiff < 2 && iq->qchase.qtype == LDNS_RR_TYPE_DS))
+               if(labdiff < 1 || (labdiff < 2 
+                       && (iq->qchase.qtype == LDNS_RR_TYPE_DS
+                       || iq->qchase.qtype == LDNS_RR_TYPE_A)))
                        /* Stop minimising this query, resolve "as usual" */
                        iq->minimisation_state = DONOT_MINIMISE_STATE;
                else {
@@ -2077,10 +2080,17 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                                return 1;
                }
        }
-       if(iq->minimisation_state == SKIP_MINIMISE_STATE)
-               /* Do not increment qname, continue incrementing next 
-                * iteration */
-               iq->minimisation_state = MINIMISE_STATE;
+       if(iq->minimisation_state == SKIP_MINIMISE_STATE) {
+               iq->minimise_timeout_count++;
+               if(iq->minimise_timeout_count < MAX_MINIMISE_TIMEOUT_COUNT)
+                       /* Do not increment qname, continue incrementing next 
+                        * iteration */
+                       iq->minimisation_state = MINIMISE_STATE;
+               else
+                       /* Too many time-outs detected for this QNAME and QTYPE.
+                        * We give up, disable QNAME minimisation. */
+                       iq->minimisation_state = DONOT_MINIMISE_STATE;
+       }
        if(iq->minimisation_state == DONOT_MINIMISE_STATE)
                iq->qinfo_out = iq->qchase;
 
@@ -2158,7 +2168,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
        iq->num_current_queries--;
        if(iq->response == NULL) {
                /* Don't increment qname when QNAME minimisation is enabled */
-               if (qstate->env->cfg->qname_minimisation)
+               if(qstate->env->cfg->qname_minimisation)
                        iq->minimisation_state = SKIP_MINIMISE_STATE;
                iq->chase_to_rd = 0;
                iq->dnssec_lame_query = 0;
index 7c32a74f800baf377bf7d9dbf0111940c3582dd4..5585f578958dca6e4f1ffe00b851593690122381 100644 (file)
@@ -69,6 +69,9 @@ struct rbtree_t;
  * QNAMEs with a lot of labels.
 */
 #define MAX_MINIMISE_COUNT     10
+/* max number of time-outs for minimised query. Prevents resolving failures
+ * when the QNAME minimisation QTYPE is blocked. */
+#define MAX_MINIMISE_TIMEOUT_COUNT 3
 /**
  * number of labels from QNAME that are always send individually when using
  * QNAME minimisation, even when the number of labels of the QNAME is bigger
@@ -377,6 +380,11 @@ struct iter_qstate {
         * outgoing queries when QNAME minimisation is enabled.
         */
        int minimise_count;
+
+       /**
+        * Count number of time-outs. Used to prevent resolving failures when
+        * the QNAME minimisation QTYPE is blocked. */
+       int minimise_timeout_count;
 };
 
 /**
index 305064646e8b5d9edacbdb85aab71048b865b455..fc42bae81d945c977961da3e24bddcfc34946424 100644 (file)
@@ -30,7 +30,7 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-com. IN NS
+com. IN A
 SECTION AUTHORITY
 com.   IN NS   a.gtld-servers.net.
 SECTION ADDITIONAL
@@ -46,8 +46,8 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-com. IN NS
-SECTION ANSWER
+com. IN A
+SECTION AUTHORITY
 com.   IN NS   a.gtld-servers.net.
 SECTION ADDITIONAL
 a.gtld-servers.net.    IN      A       192.5.6.30
@@ -58,7 +58,7 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-example.com. IN NS
+example.com. IN A
 SECTION AUTHORITY
 example.com.   IN NS   ns.example.com.
 SECTION ADDITIONAL
@@ -74,8 +74,8 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-example.com. IN NS
-SECTION ANSWER
+example.com. IN A
+SECTION AUTHORITY
 example.com.   IN NS   ns.example.com.
 SECTION ADDITIONAL
 ns.example.com.                IN      A       1.2.3.4
@@ -86,8 +86,8 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-www.example.com. IN NS
-SECTION ANSWER
+www.example.com. IN A
+SECTION AUTHORITY
 example.com.   IN NS   ns.example.com.
 SECTION ADDITIONAL
 ns.example.com.                IN      A       1.2.3.4
@@ -98,9 +98,9 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-www.example.com. IN A
+www.example.com. IN AAAA
 SECTION ANSWER
-www.example.com. IN A  10.20.30.40
+www.example.com. IN AAAA ::123
 SECTION AUTHORITY
 example.com.   IN NS   ns.example.com.
 SECTION ADDITIONAL
@@ -112,35 +112,35 @@ STEP 10 QUERY
 ENTRY_BEGIN
 REPLY RD
 SECTION QUESTION
-www.example.com. IN A
+www.example.com. IN AAAA
 ENTRY_END
 
 STEP 20 CHECK_OUT_QUERY
 ENTRY_BEGIN
 MATCH qname qtype opcode
 SECTION QUESTION
-com. IN NS
+com. IN A
 ENTRY_END
 
 STEP 30 CHECK_OUT_QUERY
 ENTRY_BEGIN
 MATCH qname qtype opcode
 SECTION QUESTION
-example.com. IN NS
+example.com. IN A
 ENTRY_END
 
 STEP 40 CHECK_OUT_QUERY
 ENTRY_BEGIN
 MATCH qname qtype opcode
 SECTION QUESTION
-www.example.com. IN NS
+www.example.com. IN A
 ENTRY_END
 
 STEP 50 CHECK_OUT_QUERY
 ENTRY_BEGIN
 MATCH qname qtype opcode
 SECTION QUESTION
-www.example.com. IN A
+www.example.com. IN AAAA
 ENTRY_END
 
 STEP 60 CHECK_ANSWER
@@ -148,9 +148,9 @@ ENTRY_BEGIN
 MATCH all
 REPLY QR RD RA NOERROR
 SECTION QUESTION
-www.example.com. IN A
+www.example.com. IN AAAA
 SECTION ANSWER
-www.example.com. IN A  10.20.30.40
+www.example.com. IN AAAA ::123
 SECTION AUTHORITY
 example.com.   IN NS   ns.example.com.
 SECTION ADDITIONAL
index 4d91bb235bdc40e0e1b7139d080ff4f8e3bc8d9f..cb877bc250b48387312b7b55f788e56c1163a5d1 100644 (file)
@@ -30,7 +30,7 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-com. IN NS
+com. IN A
 SECTION AUTHORITY
 com.   IN NS   a.gtld-servers.net.
 SECTION ADDITIONAL
@@ -46,8 +46,8 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-com. IN NS
-SECTION ANSWER
+com. IN A
+SECTION AUTHORITY
 com.   IN NS   a.gtld-servers.net.
 SECTION ADDITIONAL
 a.gtld-servers.net.    IN      A       192.5.6.30
@@ -58,7 +58,7 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-example.com. IN NS
+example.com. IN A
 SECTION AUTHORITY
 example.com.   IN NS   ns.example.com.
 SECTION ADDITIONAL
@@ -74,8 +74,8 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-example.com. IN NS
-SECTION ANSWER
+example.com. IN A
+SECTION AUTHORITY
 example.com.   IN NS   ns.example.com.
 SECTION ADDITIONAL
 ns.example.com.                IN      A       1.2.3.4
@@ -86,7 +86,7 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NXDOMAIN
 SECTION QUESTION
-ent.example.com. IN NS
+ent.example.com. IN A
 SECTION AUTHORITY
 example.com. SOA ns.example.com. h.example.com. 2007090504 1800 1800 2419200 7200
 ENTRY_END
index dde546f117344a4d021b82c4c218c3ebd6968cd2..82852a4380cde0199d5f0228db1de76b79b68553 100644 (file)
@@ -30,7 +30,7 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-com. IN NS
+com. IN A
 SECTION AUTHORITY
 com.   IN NS   a.gtld-servers.net.
 SECTION ADDITIONAL
@@ -46,8 +46,8 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-com. IN NS
-SECTION ANSWER
+com. IN A
+SECTION AUTHORITY
 com.   IN NS   a.gtld-servers.net.
 SECTION ADDITIONAL
 a.gtld-servers.net.    IN      A       192.5.6.30
@@ -58,7 +58,7 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-example.com. IN NS
+example.com. IN A
 SECTION AUTHORITY
 example.com.   IN NS   ns.example.com.
 SECTION ADDITIONAL
@@ -74,7 +74,7 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR REFUSED
 SECTION QUESTION
-refused.example.com. IN NS
+refused.example.com. IN A
 ENTRY_END
 
 ENTRY_BEGIN
@@ -82,7 +82,7 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR REFUSED
 SECTION QUESTION
-www.refused.example.com. IN NS
+www.refused.example.com. IN A
 ENTRY_END
 
 ENTRY_BEGIN
@@ -90,9 +90,9 @@ MATCH opcode qtype qname
 ADJUST copy_id
 REPLY QR NOERROR
 SECTION QUESTION
-www.refused.example.com. IN A
+www.refused.example.com. IN AAAA
 SECTION ANSWER
-www.refused.example.com. IN A  10.20.30.40
+www.refused.example.com. IN AAAA       ::1
 SECTION AUTHORITY
 example.com.   IN NS   ns.example.com.
 SECTION ADDITIONAL
@@ -104,7 +104,7 @@ STEP 10 QUERY
 ENTRY_BEGIN
 REPLY RD
 SECTION QUESTION
-www.refused.example.com. IN A
+www.refused.example.com. IN AAAA
 ENTRY_END
 
 STEP 20 CHECK_ANSWER
@@ -112,9 +112,9 @@ ENTRY_BEGIN
 MATCH all
 REPLY QR RD RA NOERROR
 SECTION QUESTION
-www.refused.example.com. IN A
+www.refused.example.com. IN AAAA
 SECTION ANSWER
-www.refused.example.com. IN A  10.20.30.40
+www.refused.example.com. IN AAAA ::1
 SECTION AUTHORITY
 example.com.   IN NS   ns.example.com.
 SECTION ADDITIONAL