From: Ralph Dolmans Date: Mon, 13 Jun 2016 13:06:35 +0000 (+0000) Subject: - Use QTYPE=A for QNAME minimisation. X-Git-Tag: release-1.5.10~83 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5b63c08c72c22175cbbb8b4c86bb95cbb25dc654;p=thirdparty%2Funbound.git - 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. git-svn-id: file:///svn/unbound/trunk@3782 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index c02e694b0..03ccb4f9f 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -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). diff --git a/iterator/iterator.c b/iterator/iterator.c index 139cae4ba..749fba6af 100644 --- a/iterator/iterator.c +++ b/iterator/iterator.c @@ -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; diff --git a/iterator/iterator.h b/iterator/iterator.h index 7c32a74f8..5585f5789 100644 --- a/iterator/iterator.h +++ b/iterator/iterator.h @@ -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; }; /** diff --git a/testdata/iter_resolve_minimised.rpl b/testdata/iter_resolve_minimised.rpl index 305064646..fc42bae81 100644 --- a/testdata/iter_resolve_minimised.rpl +++ b/testdata/iter_resolve_minimised.rpl @@ -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 diff --git a/testdata/iter_resolve_minimised_nx.rpl b/testdata/iter_resolve_minimised_nx.rpl index 4d91bb235..cb877bc25 100644 --- a/testdata/iter_resolve_minimised_nx.rpl +++ b/testdata/iter_resolve_minimised_nx.rpl @@ -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 diff --git a/testdata/iter_resolve_minimised_refused.rpl b/testdata/iter_resolve_minimised_refused.rpl index dde546f11..82852a438 100644 --- a/testdata/iter_resolve_minimised_refused.rpl +++ b/testdata/iter_resolve_minimised_refused.rpl @@ -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