]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
node: replace NODE_FLAGS_DELEG with NODE_FLAGS_DELEG_NS and NODE_FLAGS_DELEG_DELEG
authorDaniel Salzman <daniel.salzman@nic.cz>
Sun, 26 Apr 2026 18:26:10 +0000 (20:26 +0200)
committerLibor Peltan <libor.peltan@nic.cz>
Wed, 6 May 2026 13:12:59 +0000 (15:12 +0200)
src/knot/nameserver/internet.c
src/knot/nameserver/nsec_proofs.c
src/knot/zone/adjust.c
src/knot/zone/node.h
src/knot/zone/semantic-check.c

index e7757f81f94219b89bcaf587d50adb6a9eb2d9bb..46fd228409f0607446c0447226b5325534440768 100644 (file)
@@ -44,6 +44,12 @@ static int wildcard_visit(knotd_qdata_t *qdata, const zone_node_t *node,
        return KNOT_EOK;
 }
 
+inline static bool node_is_deleg(const knotd_qdata_t *qdata, const zone_node_t *node)
+{
+       return (node->flags & NODE_FLAGS_DELEG_NS) ||
+              (qdata->deleg_aware && (node->flags & NODE_FLAGS_DELEG_DELEG));
+}
+
 /*! \brief Synthesizes a CNAME RR from a DNAME. */
 static int dname_cname_synth(const knot_rrset_t *dname_rr,
                              const knot_dname_t *qname,
@@ -177,7 +183,7 @@ static int put_delegation(knot_pkt_t *pkt, knotd_qdata_t *qdata)
        }
 
        uint16_t rr_type = KNOT_RRTYPE_NS;
-       if (qdata->deleg_aware && node_rrtype_exists(qdata->extra->node, KNOT_RRTYPE_DELEG)) {
+       if (qdata->deleg_aware && (qdata->extra->node->flags & NODE_FLAGS_DELEG_DELEG)) {
                rr_type = KNOT_RRTYPE_DELEG;
        }
 
@@ -366,13 +372,12 @@ static knotd_in_state_t name_found(knot_pkt_t *pkt, knotd_qdata_t *qdata)
 {
        uint16_t qtype = knot_pkt_qtype(pkt);
 
-       bool at_deleg = (qdata->extra->node->flags & NODE_FLAGS_DELEG);
+       bool at_deleg = node_is_deleg(qdata, qdata->extra->node);
        bool below_deleg = (qdata->extra->node->flags & NODE_FLAGS_NONAUTH);
        bool parent_side = (qtype == KNOT_RRTYPE_DS);
        if (qdata->deleg_aware) {
                parent_side = parent_side || (qtype == KNOT_RRTYPE_DELEG);
        } else {
-               at_deleg = at_deleg && node_rrtype_exists(qdata->extra->node, KNOT_RRTYPE_NS);
                below_deleg = below_deleg && !(qdata->extra->node->flags & NODE_FLAGS_NONAUTH_DELEG);
        }
 
@@ -453,8 +458,7 @@ static knotd_in_state_t name_not_found(knot_pkt_t *pkt, knotd_qdata_t *qdata)
        }
 
        /* Name is below delegation. */
-       if ((node->flags & NODE_FLAGS_DELEG) &&
-           (qdata->deleg_aware || node_rrtype_exists(node, KNOT_RRTYPE_NS))) {
+       if (node_is_deleg(qdata, node)) {
                qdata->extra->node = node;
                return KNOTD_IN_STATE_DELEG;
        }
index 1aae8ef7d378b50960754915d3716687b5eff7a1..7fbf8b4600ca5bc281bbc4821a59cf8d6c799324 100644 (file)
@@ -624,7 +624,7 @@ int nsec_prove_dp_security(knot_pkt_t *pkt, knotd_qdata_t *qdata)
 
        // Prove that DS and/or DELEG does not exist.
        if (knot_rrset_empty(&rrset) ||
-           (qdata->deleg_aware && !node_rrtype_exists(qdata->extra->node, KNOT_RRTYPE_DELEG))) {
+           (qdata->deleg_aware && !(qdata->extra->node->flags & NODE_FLAGS_DELEG_DELEG))) {
                ret = put_nodata(qdata->extra->node, qdata->extra->encloser, qdata->extra->previous,
                                 qdata->extra->contents, qdata->name, qdata, pkt);
        }
index 26acfd6ac20577166dba724ed63ea0383e2fd65a..da0f54f387d9e8aa53585f3acc984a74dab780da 100644 (file)
@@ -41,21 +41,24 @@ int adjust_cb_flags(zone_node_t *node, adjust_ctx_t *ctx)
 
        if (parent && (parent->flags & NODE_FLAGS_DELEG || parent->flags & NODE_FLAGS_NONAUTH)) {
                node->flags |= NODE_FLAGS_NONAUTH;
-               if (parent->flags & NODE_FLAGS_NONAUTH_DELEG ||
-                   ((parent->flags & NODE_FLAGS_DELEG) && !node_rrtype_exists(parent, KNOT_RRTYPE_NS))) {
+               if ((parent->flags & NODE_FLAGS_NONAUTH_DELEG) ||
+                   ((parent->flags & NODE_FLAGS_DELEG_DELEG) && !(parent->flags & NODE_FLAGS_DELEG_NS))) {
                        node->flags |= NODE_FLAGS_NONAUTH_DELEG;
                }
-       } else if (node_rrtype_exists(node, KNOT_RRTYPE_DELEG) && node != ctx->zone->apex) {
-               ctx->zone->nodes->flags |= ZONE_TREE_CONTAINS_DELEG;
-               node->flags |= NODE_FLAGS_DELEG;
-               set_subt_auth = true;
-       } else if (node_rrtype_exists(node, KNOT_RRTYPE_NS) && node != ctx->zone->apex) {
-               node->flags |= NODE_FLAGS_DELEG;
-               if (node_rrtype_exists(node, KNOT_RRTYPE_DS)) {
+       } else {
+               if (node_rrtype_exists(node, KNOT_RRTYPE_DELEG) && node != ctx->zone->apex) {
+                       ctx->zone->nodes->flags |= ZONE_TREE_CONTAINS_DELEG;
+                       node->flags |= NODE_FLAGS_DELEG_DELEG;
+                       set_subt_auth = true;
+               }
+               if (node_rrtype_exists(node, KNOT_RRTYPE_NS) && node != ctx->zone->apex) {
+                       node->flags |= NODE_FLAGS_DELEG_NS;
+                       if (node_rrtype_exists(node, KNOT_RRTYPE_DS)) {
+                               set_subt_auth = true;
+                       }
+               } else if (has_data) {
                        set_subt_auth = true;
                }
-       } else if (has_data) {
-               set_subt_auth = true;
        }
 
        if (set_subt_auth) {
index 0ad1514f7eccff9354989ce348ae7982dbe8652a..54940b5379cbecd0bf6643b4992433565b99f453 100644 (file)
@@ -67,14 +67,14 @@ struct rr_data {
 enum node_flags {
        /*! \brief Node is authoritative, default. */
        NODE_FLAGS_AUTH =            0 << 0,
-       /*! \brief Node is a delegation point (i.e. marking a zone cut). */
-       NODE_FLAGS_DELEG =           1 << 0,
+       /*! \brief Node is a delegation point using NS (i.e. marking a zone cut). */
+       NODE_FLAGS_DELEG_NS =        1 << 0,
+       /*! \brief Node is a delegation point using DELEG (i.e. marking a zone cut). */
+       NODE_FLAGS_DELEG_DELEG =     1 << 1,
        /*! \brief Node is not authoritative (i.e. below a zone cut). */
-       NODE_FLAGS_NONAUTH =         1 << 1,
+       NODE_FLAGS_NONAUTH =         1 << 2,
        /*! \brief RRSIGs in node have been cryptographically validated by Knot. */
-       NODE_FLAGS_RRSIGS_VALID =    1 << 2,
-       /*! \brief Node is empty and will be deleted after update. */
-       NODE_FLAGS_EMPTY =           1 << 3,
+       NODE_FLAGS_RRSIGS_VALID =    1 << 3,
        /*! \brief Node has a wildcard child. */
        NODE_FLAGS_WILDCARD_CHILD =  1 << 4,
        /*! \brief Is this NSEC3 node compatible with zone's NSEC3PARAMS ? */
@@ -99,6 +99,8 @@ enum node_flags {
        NODE_FLAGS_NONAUTH_DELEG =   1 << 14,
 };
 
+#define NODE_FLAGS_DELEG (NODE_FLAGS_DELEG_NS | NODE_FLAGS_DELEG_DELEG)
+
 typedef void (*node_addrem_cb)(zone_node_t *, void *);
 typedef zone_node_t *(*node_new_cb)(const knot_dname_t *, void *);
 
index 68b89a4b14a673f5ed7c0f9a3f8a3ab2db1ac384..f60120e2239fd578a7f14157d2b43d2897490b9a 100644 (file)
@@ -153,7 +153,7 @@ static int check_delegation(const zone_node_t *node, semchecks_data_t *data)
 
        const knot_rdataset_t *ns_rrs = node_rdataset(node, KNOT_RRTYPE_NS);
        if (ns_rrs == NULL) {
-               if (node_rrtype_exists(node, KNOT_RRTYPE_DELEG)) {
+               if (node->flags & NODE_FLAGS_DELEG_DELEG) {
                        return KNOT_EOK;
                }
                assert(data->zone->apex == node);