+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).
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
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;
}
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
&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 {
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;
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;
* 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
* 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;
};
/**
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
ADJUST copy_id
REPLY QR REFUSED
SECTION QUESTION
-refused.example.com. IN NS
+refused.example.com. IN A
ENTRY_END
ENTRY_BEGIN
ADJUST copy_id
REPLY QR REFUSED
SECTION QUESTION
-www.refused.example.com. IN NS
+www.refused.example.com. IN A
ENTRY_END
ENTRY_BEGIN
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
ENTRY_BEGIN
REPLY RD
SECTION QUESTION
-www.refused.example.com. IN A
+www.refused.example.com. IN AAAA
ENTRY_END
STEP 20 CHECK_ANSWER
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