#include "knot/dnssec/zone-nsec.h"
#include "knot/zone/adds_tree.h"
+typedef enum {
+ ADJUST_MEASURE_SIZE_NONE = 0,
+ ADJUST_MEASURE_SIZE_NORM = 1,
+ ADJUST_MEASURE_SIZE_DIFF = -1,
+} adjust_measure_size_t;
+
int adjust_cb_flags(zone_node_t *node, const zone_contents_t *zone)
{
zone_node_t *parent = node_parent(node);
const zone_contents_t *zone;
zone_node_t *previous_node;
size_t zone_size;
+ size_t counter_size;
uint32_t zone_max_ttl;
adjust_cb_t adjust_cb;
bool adjust_prevs;
- bool measure_size;
+ adjust_measure_size_t measure_size;
} zone_adjust_arg_t;
static int adjust_single(zone_node_t *node, void *data)
assert(node != NULL);
assert(data != NULL);
+ zone_adjust_arg_t *args = (zone_adjust_arg_t *)data;
+ if (args->measure_size == ADJUST_MEASURE_SIZE_DIFF) {
+ node_size(binode_counterpart(node), &args->counter_size);
+ }
+
if ((node->flags & NODE_FLAGS_DELETED)) {
return KNOT_EOK;
}
- zone_adjust_arg_t *args = (zone_adjust_arg_t *)data;
-
// remember first node
if (args->first_node == NULL) {
args->first_node = node;
if (args->measure_size) {
node_size(node, &args->zone_size);
}
+
node_max_ttl(node, &args->zone_max_ttl);
return args->adjust_cb(node, args->zone);
}
static int zone_adjust_tree(zone_tree_t *tree, const zone_contents_t *zone, adjust_cb_t adjust_cb,
- size_t *tree_size, uint32_t *tree_max_ttl, bool adjust_prevs, bool measure_size)
+ ssize_t *tree_size, uint32_t *tree_max_ttl, bool adjust_prevs,
+ adjust_measure_size_t measure_size)
{
if (zone_tree_is_empty(tree)) {
return KNOT_EOK;
}
- zone_adjust_arg_t arg = {
- .zone = zone,
- .adjust_cb = adjust_cb,
- .adjust_prevs = adjust_prevs,
- .measure_size = measure_size,
- };
+ zone_adjust_arg_t arg = { 0 };
+ arg.zone = zone;
+ arg.adjust_cb = adjust_cb;
+ arg.adjust_prevs = adjust_prevs;
+ arg.measure_size = measure_size;
int ret = zone_tree_apply(tree, adjust_single, &arg);
if (ret != KNOT_EOK) {
}
if (tree_size != NULL) {
- *tree_size = arg.zone_size;
+ *tree_size = arg.zone_size - arg.counter_size;
}
if (tree_max_ttl != NULL) {
*tree_max_ttl = arg.zone_max_ttl;
}
zone->dnssec = node_rrtype_is_signed(zone->apex, KNOT_RRTYPE_SOA);
- size_t nodes_size = 0, nsec3_size = 0;
+ ssize_t nodes_size = 0, nsec3_size = 0;
uint32_t nodes_max_ttl = 0, nsec3_max_ttl = 0;
+ adjust_measure_size_t ms = (measure_size && nsec3_cb != NULL ? ADJUST_MEASURE_SIZE_NORM : ADJUST_MEASURE_SIZE_NONE);
if (nsec3_cb != NULL) {
- ret = zone_adjust_tree(zone->nsec3_nodes, zone, nsec3_cb, &nsec3_size, &nsec3_max_ttl, true, measure_size && (nodes_cb != NULL));
+ ret = zone_adjust_tree(zone->nsec3_nodes, zone, nsec3_cb, &nsec3_size, &nsec3_max_ttl, true, ms);
}
if (ret == KNOT_EOK && nodes_cb != NULL) {
- ret = zone_adjust_tree(zone->nodes, zone, nodes_cb, &nodes_size, &nodes_max_ttl, true, measure_size);
+ ret = zone_adjust_tree(zone->nodes, zone, nodes_cb, &nodes_size, &nodes_max_ttl, true, ms);
}
if (ret == KNOT_EOK && nodes_cb != NULL && nsec3_cb != NULL) {
- zone->size = nodes_size + nsec3_size;
+ if (measure_size) {
+ zone->size = nodes_size + nsec3_size;
+ }
zone->max_ttl = MAX(nodes_max_ttl, nsec3_max_ttl);
}
return ret;
}
-int zone_adjust_update(zone_update_t *update, adjust_cb_t nodes_cb, adjust_cb_t nsec3_cb)
+int zone_adjust_update(zone_update_t *update, adjust_cb_t nodes_cb, adjust_cb_t nsec3_cb, bool measure_size)
{
int ret = KNOT_EOK;
+ adjust_measure_size_t ms = (measure_size && nsec3_cb != NULL ? ADJUST_MEASURE_SIZE_DIFF : ADJUST_MEASURE_SIZE_NONE);
+ ssize_t nodes_size = 0, nsec3_size = 0;
+
if (nsec3_cb != NULL) {
- ret = zone_adjust_tree(update->a_ctx->nsec3_ptrs, update->new_cont, nsec3_cb, NULL, NULL, false, false);
+ ret = zone_adjust_tree(update->a_ctx->nsec3_ptrs, update->new_cont, nsec3_cb, &nsec3_size, NULL, false, ms);
}
if (ret == KNOT_EOK && nodes_cb != NULL) {
- ret = zone_adjust_tree(update->a_ctx->node_ptrs, update->new_cont, nodes_cb, NULL, NULL, false, false);
+ ret = zone_adjust_tree(update->a_ctx->node_ptrs, update->new_cont, nodes_cb, &nodes_size, NULL, false, ms);
+ }
+ if (ret == KNOT_EOK && measure_size && nodes_cb != NULL && nsec3_cb != NULL) {
+ update->new_cont->size += nodes_size + nsec3_size;
}
return ret;
}
int zone_adjust_incremental_update(zone_update_t *update)
{
- int ret = zone_adjust_contents(update->new_cont, adjust_cb_flags, adjust_cb_nsec3_flags, true);
+ int ret = zone_adjust_contents(update->new_cont, adjust_cb_flags, adjust_cb_nsec3_flags, false);
if (ret == KNOT_EOK) {
ret = zone_adjust_contents(update->new_cont, adjust_cb_point_to_nsec3, NULL, false);
}
if (ret == KNOT_EOK) {
- ret = zone_adjust_update(update, adjust_cb_wildcard_nsec3, NULL);
+ ret = zone_adjust_update(update, adjust_cb_wildcard_nsec3, adjust_cb_void, true);
}
if (ret == KNOT_EOK) {
ret = additionals_tree_update_from_binodes(