[PATCH 1/2] dns64: Refactor handle_event checks for readability

Daniel Gröber dxld at darkboxed.org
Mon Oct 9 12:43:34 UTC 2023


No functional change intended.

Signed-off-by: Daniel Gröber <dxld at darkboxed.org>
---
 dns64/dns64.c | 56 ++++++++++++++++++++++++++-------------------------
 1 file changed, 29 insertions(+), 27 deletions(-)

diff --git a/dns64/dns64.c b/dns64/dns64.c
index 1e31f51e..83d61b2b 100644
--- a/dns64/dns64.c
+++ b/dns64/dns64.c
@@ -580,16 +580,16 @@ handle_event_pass(struct module_qstate* qstate, int id)
         /* Handle PTR queries for IPv6 addresses. */
         return handle_ipv6_ptr(qstate, id);
 
-	if (qstate->env->cfg->dns64_synthall &&
-	    iq && iq->state == DNS64_NEW_QUERY
-	    && qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA)
-		return generate_type_A_query(qstate, id);
-
-	if(dns64_always_synth_for_qname(qstate, id) &&
-	    iq && iq->state == DNS64_NEW_QUERY
-	    && !(qstate->query_flags & BIT_CD)
-	    && qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA) {
-		verbose(VERB_ALGO, "dns64: ignore-aaaa and synthesize anyway");
+	int synth_all_cfg = qstate->env->cfg->dns64_synthall;
+	int synth_qname =
+		dns64_always_synth_for_qname(qstate, id) &&
+		!(qstate->query_flags & BIT_CD);
+
+	if (iq && iq->state == DNS64_NEW_QUERY &&
+	    qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA &&
+	    (synth_all_cfg || synth_qname)) {
+		if (synth_qname)
+			verbose(VERB_ALGO, "dns64: ignore-aaaa and synthesize anyway");
 		return generate_type_A_query(qstate, id);
 	}
 
@@ -627,24 +627,26 @@ handle_event_moddone(struct module_qstate* qstate, int id)
      *        synthesize in (sec 5.1.2 of RFC6147).
      *   - A successful AAAA query with an answer.
      */
-	if((!iq || iq->state != DNS64_INTERNAL_QUERY)
-            && qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA
-	    && !(qstate->query_flags & BIT_CD)
-	    && !(qstate->return_msg &&
-		    qstate->return_msg->rep &&
-		    reply_find_answer_rrset(&qstate->qinfo,
-			    qstate->return_msg->rep)))
-		/* not internal, type AAAA, not CD, and no answer RRset,
-		 * So, this is a AAAA noerror/nodata answer */
-		return generate_type_A_query(qstate, id);
 
-	if((!iq || iq->state != DNS64_INTERNAL_QUERY)
-	    && qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA
-	    && !(qstate->query_flags & BIT_CD)
-	    && dns64_always_synth_for_qname(qstate, id)) {
-		/* if it is not internal, AAAA, not CD and listed domain,
-		 * generate from A record and ignore AAAA */
-		verbose(VERB_ALGO, "dns64: ignore-aaaa and synthesize anyway");
+	/* When an AAAA query completes check if we want to perform DNS64
+	 * synthesis. We skip queries with DNSSEC enabled (!CD) and
+	 * ones generated by us to retrive the A/PTR record to use for
+	 * synth. */
+	int want_synth =
+		qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA &&
+		(!iq || iq->state != DNS64_INTERNAL_QUERY) &&
+		!(qstate->query_flags & BIT_CD);
+	int has_data = /*< whether query returned non-empty rrset */
+		qstate->return_msg &&
+		qstate->return_msg->rep &&
+		reply_find_answer_rrset(&qstate->qinfo, qstate->return_msg->rep);
+	int synth_qname;
+
+	if(want_synth &&
+	   (!has_data || (synth_qname=dns64_always_synth_for_qname(qstate, id))))
+	{
+		if (synth_qname)
+			verbose(VERB_ALGO, "dns64: ignore-aaaa and synthesize anyway");
 		return generate_type_A_query(qstate, id);
 	}
 
-- 
2.39.2



More information about the Unbound-users mailing list