Skip to content
Snippets Groups Projects
Commit 5ebc0f0b authored by Libor Peltan's avatar Libor Peltan
Browse files

adjust: using additionals_tree for adjusting point_to_nsec3

this improves speed of updates to zone with NSEC3 opt-out
parent 98f7fcee
No related branches found
No related tags found
1 merge request!1017adjust: using additionals_tree for adjusting point_to_nsec3
Pipeline #49247 passed
......@@ -145,6 +145,26 @@ int additionals_tree_update_node(additionals_tree_t *a_t, const knot_dname_t *zo
return ret;
}
int additionals_tree_update_nsec3(additionals_tree_t *a_t, const knot_dname_t *zone_apex,
const dnssec_nsec3_params_t *params,
zone_node_t *old_node, zone_node_t *new_node)
{
bool oldex = (old_node != NULL && !(old_node->flags & NODE_FLAGS_DELETED));
bool newex = (new_node != NULL && !(new_node->flags & NODE_FLAGS_DELETED));
bool addn = (!oldex && newex), remn = (oldex && !newex);
if (!addn && !remn) {
return KNOT_EOK;
}
const knot_dname_t *owner = addn ? new_node->owner : old_node->owner;
uint8_t nsec3_name[KNOT_DNAME_MAXLEN];
int ret = knot_create_nsec3_owner(nsec3_name, sizeof(nsec3_name), owner, zone_apex, params);
if (ret != KNOT_EOK) {
return ret;
}
a_t_node_ctx_t ctx = { a_t, addn ? binode_node(new_node, false) : binode_node(old_node, false) };
return (addn ? add_node_to_a_t : remove_node_from_a_t)(nsec3_name, &ctx);
}
int additionals_tree_from_zone(additionals_tree_t **a_t, const zone_contents_t *zone)
{
*a_t = additionals_tree_new();
......@@ -152,10 +172,16 @@ int additionals_tree_from_zone(additionals_tree_t **a_t, const zone_contents_t *
return KNOT_ENOMEM;
}
bool do_nsec3 = knot_is_nsec3_enabled(zone);
zone_tree_it_t it = { 0 };
int ret = zone_tree_it_begin(zone->nodes, &it);
while (!zone_tree_it_finished(&it) && ret == KNOT_EOK) {
ret = additionals_tree_update_node(*a_t, zone->apex->owner, NULL, zone_tree_it_val(&it));
if (do_nsec3 && ret == KNOT_EOK) {
ret = additionals_tree_update_nsec3(*a_t, zone->apex->owner, &zone->nsec3_params,
NULL, zone_tree_it_val(&it));
}
zone_tree_it_next(&it);
}
zone_tree_it_free(&it);
......@@ -168,13 +194,16 @@ int additionals_tree_from_zone(additionals_tree_t **a_t, const zone_contents_t *
}
int additionals_tree_update_from_binodes(additionals_tree_t *a_t, const zone_tree_t *tree,
const knot_dname_t *zone_apex)
const knot_dname_t *zone_apex, const dnssec_nsec3_params_t *params)
{
zone_tree_it_t it = { 0 };
int ret = zone_tree_it_begin((zone_tree_t *)tree, &it);
while (!zone_tree_it_finished(&it) && ret == KNOT_EOK) {
zone_node_t *node = zone_tree_it_val(&it);
ret = additionals_tree_update_node(a_t, zone_apex, binode_counterpart(node), node);
zone_node_t *node = zone_tree_it_val(&it), *counter = binode_counterpart(node);
ret = additionals_tree_update_node(a_t, zone_apex, counter, node);
if (params != NULL && ret == KNOT_EOK) {
ret = additionals_tree_update_nsec3(a_t, zone_apex, params, counter, node);
}
zone_tree_it_next(&it);
}
zone_tree_it_free(&it);
......
......@@ -18,6 +18,7 @@
#include "contrib/qp-trie/trie.h"
#include "knot/zone/contents.h"
#include "knot/dnssec/zone-nsec.h"
typedef trie_t additionals_tree_t;
......@@ -53,6 +54,11 @@ int zone_node_additionals_foreach(const zone_node_t *node, const knot_dname_t *z
int additionals_tree_update_node(additionals_tree_t *a_t, const knot_dname_t *zone_apex,
zone_node_t *old_node, zone_node_t *new_node);
int additionals_tree_update_nsec3(additionals_tree_t *a_t, const knot_dname_t *zone_apex,
const dnssec_nsec3_params_t *params,
zone_node_t *old_node, zone_node_t *new_node);
/*!
* \brief Create additionals tree from a zone (by scanning all additionals in zone RRsets).
*
......@@ -73,7 +79,7 @@ int additionals_tree_from_zone(additionals_tree_t **a_t, const zone_contents_t *
* \return KNOT_E*
*/
int additionals_tree_update_from_binodes(additionals_tree_t *a_t, const zone_tree_t *tree,
const knot_dname_t *zone_apex);
const knot_dname_t *zone_apex, const dnssec_nsec3_params_t *params);
/*!
* \brief Foreach node that has specified name in its additionals, do sth.
......
......@@ -375,20 +375,26 @@ static int adjust_additionals_cb(zone_node_t *node, void *ctx)
return adjust_cb_additionals(real_node, zone);
}
static int adjust_point_to_nsec3_cb(zone_node_t *node, void *ctx)
{
const zone_contents_t *zone = ctx;
zone_node_t *real_node = binode_node(node, (zone->nodes->flags & ZONE_TREE_BINO_SECOND));
return binode_fix_nsec3_pointer(real_node, zone);
}
int zone_adjust_incremental_update(zone_update_t *update)
{
int ret = zone_adjust_contents(update->new_cont, adjust_cb_flags, adjust_cb_nsec3_flags, false);
if (ret == KNOT_EOK) {
ret = zone_adjust_update(update, adjust_cb_wildcard_nsec3, adjust_cb_void, true);
}
if (ret == KNOT_EOK) {
ret = zone_adjust_contents(update->new_cont, binode_fix_nsec3_pointer, NULL, false);
}
dnssec_nsec3_params_t *params = knot_is_nsec3_enabled(update->new_cont) ? &update->new_cont->nsec3_params : NULL;
if (ret == KNOT_EOK) {
ret = additionals_tree_update_from_binodes(
update->new_cont->adds_tree,
update->a_ctx->node_ptrs,
update->new_cont->apex->owner
update->new_cont->apex->owner,
params
);
}
if (ret == KNOT_EOK) {
......@@ -399,5 +405,13 @@ int zone_adjust_incremental_update(zone_update_t *update)
update->new_cont
);
}
if (ret == KNOT_EOK) {
ret = additionals_reverse_apply_multi(
update->new_cont->adds_tree,
update->a_ctx->nsec3_ptrs,
adjust_point_to_nsec3_cb,
update->new_cont
);
}
return ret;
}
......@@ -369,7 +369,6 @@ static inline zone_node_t *node_nsec3_get(const zone_node_t *node)
if (!(node->flags & NODE_FLAGS_NSEC3_NODE) || node->nsec3_node == NULL) {
return NULL;
} else {
assert((node->nsec3_node->flags & NODE_FLAGS_SECOND) == (node->flags & NODE_FLAGS_SECOND));
return node->nsec3_node;
return binode_node(node->nsec3_node, (node->flags & NODE_FLAGS_SECOND));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment