- 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
This commit is contained in:
Ralph Dolmans 2016-06-13 13:06:35 +00:00
parent 48acd0bf4d
commit 5b63c08c72
6 changed files with 76 additions and 52 deletions

View 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 13 June 2016: Wouter
- Fix #778: unbound 1.5.9: -h segfault (null deref). - Fix #778: unbound 1.5.9: -h segfault (null deref).

View file

@ -148,6 +148,7 @@ iter_new(struct module_qstate* qstate, int id)
iq->qchase = qstate->qinfo; iq->qchase = qstate->qinfo;
outbound_list_init(&iq->outlist); outbound_list_init(&iq->outlist);
iq->minimise_count = 0; iq->minimise_count = 0;
iq->minimise_timeout_count = 0;
if (qstate->env->cfg->qname_minimisation) if (qstate->env->cfg->qname_minimisation)
iq->minimisation_state = INIT_MINIMISE_STATE; iq->minimisation_state = INIT_MINIMISE_STATE;
else else
@ -2008,7 +2009,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
iq->dp->name))) { iq->dp->name))) {
iq->qinfo_out.qname = iq->dp->name; iq->qinfo_out.qname = iq->dp->name;
iq->qinfo_out.qname_len = iq->dp->namelen; 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->qinfo_out.qclass = iq->qchase.qclass;
iq->minimise_count = 0; 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 = iq->qchase.qname;
iq->qinfo_out.qname_len = iq->qchase.qname_len; iq->qinfo_out.qname_len = iq->qchase.qname_len;
iq->minimise_count++; iq->minimise_count++;
iq->minimise_timeout_count = 0;
/* Limit number of iterations for QNAMEs with more /* Limit number of iterations for QNAMEs with more
* than MAX_MINIMISE_COUNT labels. Send first MINIMISE_ONE_LAB * 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, &iq->qinfo_out.qname_len,
labdiff-1); labdiff-1);
} }
if(labdiff < 1 || if(labdiff < 1 || (labdiff < 2
(labdiff < 2 && iq->qchase.qtype == LDNS_RR_TYPE_DS)) && (iq->qchase.qtype == LDNS_RR_TYPE_DS
|| iq->qchase.qtype == LDNS_RR_TYPE_A)))
/* Stop minimising this query, resolve "as usual" */ /* Stop minimising this query, resolve "as usual" */
iq->minimisation_state = DONOT_MINIMISE_STATE; iq->minimisation_state = DONOT_MINIMISE_STATE;
else { else {
@ -2077,10 +2080,17 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
return 1; return 1;
} }
} }
if(iq->minimisation_state == SKIP_MINIMISE_STATE) if(iq->minimisation_state == SKIP_MINIMISE_STATE) {
/* Do not increment qname, continue incrementing next iq->minimise_timeout_count++;
* iteration */ if(iq->minimise_timeout_count < MAX_MINIMISE_TIMEOUT_COUNT)
iq->minimisation_state = MINIMISE_STATE; /* 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) if(iq->minimisation_state == DONOT_MINIMISE_STATE)
iq->qinfo_out = iq->qchase; iq->qinfo_out = iq->qchase;
@ -2158,7 +2168,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
iq->num_current_queries--; iq->num_current_queries--;
if(iq->response == NULL) { if(iq->response == NULL) {
/* Don't increment qname when QNAME minimisation is enabled */ /* 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->minimisation_state = SKIP_MINIMISE_STATE;
iq->chase_to_rd = 0; iq->chase_to_rd = 0;
iq->dnssec_lame_query = 0; iq->dnssec_lame_query = 0;

View file

@ -69,6 +69,9 @@ struct rbtree_t;
* QNAMEs with a lot of labels. * QNAMEs with a lot of labels.
*/ */
#define MAX_MINIMISE_COUNT 10 #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 * 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 * 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. * outgoing queries when QNAME minimisation is enabled.
*/ */
int minimise_count; int minimise_count;
/**
* Count number of time-outs. Used to prevent resolving failures when
* the QNAME minimisation QTYPE is blocked. */
int minimise_timeout_count;
}; };
/** /**

View file

@ -30,7 +30,7 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
com. IN NS com. IN A
SECTION AUTHORITY SECTION AUTHORITY
com. IN NS a.gtld-servers.net. com. IN NS a.gtld-servers.net.
SECTION ADDITIONAL SECTION ADDITIONAL
@ -46,8 +46,8 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
com. IN NS com. IN A
SECTION ANSWER SECTION AUTHORITY
com. IN NS a.gtld-servers.net. com. IN NS a.gtld-servers.net.
SECTION ADDITIONAL SECTION ADDITIONAL
a.gtld-servers.net. IN A 192.5.6.30 a.gtld-servers.net. IN A 192.5.6.30
@ -58,7 +58,7 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
example.com. IN NS example.com. IN A
SECTION AUTHORITY SECTION AUTHORITY
example.com. IN NS ns.example.com. example.com. IN NS ns.example.com.
SECTION ADDITIONAL SECTION ADDITIONAL
@ -74,20 +74,8 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
example.com. IN NS example.com. IN A
SECTION ANSWER SECTION AUTHORITY
example.com. IN NS ns.example.com.
SECTION ADDITIONAL
ns.example.com. IN A 1.2.3.4
ENTRY_END
ENTRY_BEGIN
MATCH opcode qtype qname
ADJUST copy_id
REPLY QR NOERROR
SECTION QUESTION
www.example.com. IN NS
SECTION ANSWER
example.com. IN NS ns.example.com. example.com. IN NS ns.example.com.
SECTION ADDITIONAL SECTION ADDITIONAL
ns.example.com. IN A 1.2.3.4 ns.example.com. IN A 1.2.3.4
@ -99,8 +87,20 @@ ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
www.example.com. IN A 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
ENTRY_END
ENTRY_BEGIN
MATCH opcode qtype qname
ADJUST copy_id
REPLY QR NOERROR
SECTION QUESTION
www.example.com. IN AAAA
SECTION ANSWER SECTION ANSWER
www.example.com. IN A 10.20.30.40 www.example.com. IN AAAA ::123
SECTION AUTHORITY SECTION AUTHORITY
example.com. IN NS ns.example.com. example.com. IN NS ns.example.com.
SECTION ADDITIONAL SECTION ADDITIONAL
@ -112,35 +112,35 @@ STEP 10 QUERY
ENTRY_BEGIN ENTRY_BEGIN
REPLY RD REPLY RD
SECTION QUESTION SECTION QUESTION
www.example.com. IN A www.example.com. IN AAAA
ENTRY_END ENTRY_END
STEP 20 CHECK_OUT_QUERY STEP 20 CHECK_OUT_QUERY
ENTRY_BEGIN ENTRY_BEGIN
MATCH qname qtype opcode MATCH qname qtype opcode
SECTION QUESTION SECTION QUESTION
com. IN NS com. IN A
ENTRY_END ENTRY_END
STEP 30 CHECK_OUT_QUERY STEP 30 CHECK_OUT_QUERY
ENTRY_BEGIN ENTRY_BEGIN
MATCH qname qtype opcode MATCH qname qtype opcode
SECTION QUESTION SECTION QUESTION
example.com. IN NS example.com. IN A
ENTRY_END ENTRY_END
STEP 40 CHECK_OUT_QUERY STEP 40 CHECK_OUT_QUERY
ENTRY_BEGIN ENTRY_BEGIN
MATCH qname qtype opcode MATCH qname qtype opcode
SECTION QUESTION SECTION QUESTION
www.example.com. IN NS www.example.com. IN A
ENTRY_END ENTRY_END
STEP 50 CHECK_OUT_QUERY STEP 50 CHECK_OUT_QUERY
ENTRY_BEGIN ENTRY_BEGIN
MATCH qname qtype opcode MATCH qname qtype opcode
SECTION QUESTION SECTION QUESTION
www.example.com. IN A www.example.com. IN AAAA
ENTRY_END ENTRY_END
STEP 60 CHECK_ANSWER STEP 60 CHECK_ANSWER
@ -148,9 +148,9 @@ ENTRY_BEGIN
MATCH all MATCH all
REPLY QR RD RA NOERROR REPLY QR RD RA NOERROR
SECTION QUESTION SECTION QUESTION
www.example.com. IN A www.example.com. IN AAAA
SECTION ANSWER SECTION ANSWER
www.example.com. IN A 10.20.30.40 www.example.com. IN AAAA ::123
SECTION AUTHORITY SECTION AUTHORITY
example.com. IN NS ns.example.com. example.com. IN NS ns.example.com.
SECTION ADDITIONAL SECTION ADDITIONAL

View file

@ -30,7 +30,7 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
com. IN NS com. IN A
SECTION AUTHORITY SECTION AUTHORITY
com. IN NS a.gtld-servers.net. com. IN NS a.gtld-servers.net.
SECTION ADDITIONAL SECTION ADDITIONAL
@ -46,8 +46,8 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
com. IN NS com. IN A
SECTION ANSWER SECTION AUTHORITY
com. IN NS a.gtld-servers.net. com. IN NS a.gtld-servers.net.
SECTION ADDITIONAL SECTION ADDITIONAL
a.gtld-servers.net. IN A 192.5.6.30 a.gtld-servers.net. IN A 192.5.6.30
@ -58,7 +58,7 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
example.com. IN NS example.com. IN A
SECTION AUTHORITY SECTION AUTHORITY
example.com. IN NS ns.example.com. example.com. IN NS ns.example.com.
SECTION ADDITIONAL SECTION ADDITIONAL
@ -74,8 +74,8 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
example.com. IN NS example.com. IN A
SECTION ANSWER SECTION AUTHORITY
example.com. IN NS ns.example.com. example.com. IN NS ns.example.com.
SECTION ADDITIONAL SECTION ADDITIONAL
ns.example.com. IN A 1.2.3.4 ns.example.com. IN A 1.2.3.4
@ -86,7 +86,7 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NXDOMAIN REPLY QR NXDOMAIN
SECTION QUESTION SECTION QUESTION
ent.example.com. IN NS ent.example.com. IN A
SECTION AUTHORITY SECTION AUTHORITY
example.com. SOA ns.example.com. h.example.com. 2007090504 1800 1800 2419200 7200 example.com. SOA ns.example.com. h.example.com. 2007090504 1800 1800 2419200 7200
ENTRY_END ENTRY_END

View file

@ -30,7 +30,7 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
com. IN NS com. IN A
SECTION AUTHORITY SECTION AUTHORITY
com. IN NS a.gtld-servers.net. com. IN NS a.gtld-servers.net.
SECTION ADDITIONAL SECTION ADDITIONAL
@ -46,8 +46,8 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
com. IN NS com. IN A
SECTION ANSWER SECTION AUTHORITY
com. IN NS a.gtld-servers.net. com. IN NS a.gtld-servers.net.
SECTION ADDITIONAL SECTION ADDITIONAL
a.gtld-servers.net. IN A 192.5.6.30 a.gtld-servers.net. IN A 192.5.6.30
@ -58,7 +58,7 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
example.com. IN NS example.com. IN A
SECTION AUTHORITY SECTION AUTHORITY
example.com. IN NS ns.example.com. example.com. IN NS ns.example.com.
SECTION ADDITIONAL SECTION ADDITIONAL
@ -74,7 +74,7 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR REFUSED REPLY QR REFUSED
SECTION QUESTION SECTION QUESTION
refused.example.com. IN NS refused.example.com. IN A
ENTRY_END ENTRY_END
ENTRY_BEGIN ENTRY_BEGIN
@ -82,7 +82,7 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR REFUSED REPLY QR REFUSED
SECTION QUESTION SECTION QUESTION
www.refused.example.com. IN NS www.refused.example.com. IN A
ENTRY_END ENTRY_END
ENTRY_BEGIN ENTRY_BEGIN
@ -90,9 +90,9 @@ MATCH opcode qtype qname
ADJUST copy_id ADJUST copy_id
REPLY QR NOERROR REPLY QR NOERROR
SECTION QUESTION SECTION QUESTION
www.refused.example.com. IN A www.refused.example.com. IN AAAA
SECTION ANSWER SECTION ANSWER
www.refused.example.com. IN A 10.20.30.40 www.refused.example.com. IN AAAA ::1
SECTION AUTHORITY SECTION AUTHORITY
example.com. IN NS ns.example.com. example.com. IN NS ns.example.com.
SECTION ADDITIONAL SECTION ADDITIONAL
@ -104,7 +104,7 @@ STEP 10 QUERY
ENTRY_BEGIN ENTRY_BEGIN
REPLY RD REPLY RD
SECTION QUESTION SECTION QUESTION
www.refused.example.com. IN A www.refused.example.com. IN AAAA
ENTRY_END ENTRY_END
STEP 20 CHECK_ANSWER STEP 20 CHECK_ANSWER
@ -112,9 +112,9 @@ ENTRY_BEGIN
MATCH all MATCH all
REPLY QR RD RA NOERROR REPLY QR RD RA NOERROR
SECTION QUESTION SECTION QUESTION
www.refused.example.com. IN A www.refused.example.com. IN AAAA
SECTION ANSWER SECTION ANSWER
www.refused.example.com. IN A 10.20.30.40 www.refused.example.com. IN AAAA ::1
SECTION AUTHORITY SECTION AUTHORITY
example.com. IN NS ns.example.com. example.com. IN NS ns.example.com.
SECTION ADDITIONAL SECTION ADDITIONAL