]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
dns64: Refactor handle_event checks for readability
authorDaniel Gröber via Unbound-users <unbound-users@lists.nlnetlabs.nl>
Mon, 9 Oct 2023 12:43:34 +0000 (14:43 +0200)
committerGeorge Thessalonikefs <yorgos@nlnetlabs.nl>
Wed, 18 Oct 2023 10:03:40 +0000 (12:03 +0200)
No functional change intended.

Signed-off-by: Daniel Gröber <dxld@darkboxed.org>
dns64/dns64.c

index 1e31f51e831fbd94f249b7e945b8fc40a8f4b9af..83d61b2bdd38973d1edbaea279319dbdfe903e66 100644 (file)
@@ -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);
        }