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,
}
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;
}
{
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);
}
}
/* 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;
}
// 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);
}
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) {
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 ? */
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 *);
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);