mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-08 20:28:43 +00:00
Add new implementation of third_pass() and remove old implementation
This commit is contained in:
parent
ca4a1dc9d3
commit
5a933c6fe5
@ -413,59 +413,6 @@ bucket_is_present(const struct aggregator_bucket *bucket, const struct trie_node
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
static void
|
|
||||||
third_pass_helper(struct trie_node *node)
|
|
||||||
{
|
|
||||||
if (!node)
|
|
||||||
return;
|
|
||||||
|
|
||||||
//third_pass_helper(node->child[0]);
|
|
||||||
//third_pass_helper(node->child[1]);
|
|
||||||
|
|
||||||
assert(node->parent != NULL);
|
|
||||||
|
|
||||||
if (node->parent->bucket == NULL || bucket_is_present(node->parent->bucket, node))
|
|
||||||
node->bucket = NULL;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
assert(node->potential_buckets_count > 0);
|
|
||||||
node->bucket = node->potential_buckets[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
//third_pass_helper(node->child[0]);
|
|
||||||
//third_pass_helper(node->child[1]);
|
|
||||||
|
|
||||||
// Leaf node with unassigned nexthop is deleted
|
|
||||||
if (is_leaf(node) && node->bucket == NULL)
|
|
||||||
remove_node(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
third_pass(struct trie_node *node)
|
|
||||||
{
|
|
||||||
assert(node != NULL);
|
|
||||||
|
|
||||||
if (!node)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Node is a root
|
|
||||||
if (!node->parent)
|
|
||||||
{
|
|
||||||
assert(node->child[0] != NULL);
|
|
||||||
assert(node->child[1] != NULL);
|
|
||||||
assert(node->potential_buckets_count > 0);
|
|
||||||
|
|
||||||
if (node->potential_buckets_count > 0)
|
|
||||||
{
|
|
||||||
node->bucket = node->potential_buckets[0];
|
|
||||||
third_pass_helper(node->child[0]);
|
|
||||||
third_pass_helper(node->child[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_potential_buckets(struct trie_node *node)
|
remove_potential_buckets(struct trie_node *node)
|
||||||
{
|
{
|
||||||
@ -481,14 +428,23 @@ third_pass(struct trie_node *node)
|
|||||||
if (node == NULL)
|
if (node == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Root is assigned any of its potential buckets */
|
||||||
if (node->parent == NULL)
|
if (node->parent == NULL)
|
||||||
return;
|
{
|
||||||
|
assert(node->potential_buckets_count > 0);
|
||||||
|
node->bucket = node->potential_buckets[0];
|
||||||
|
}
|
||||||
|
|
||||||
const struct aggregator_bucket *inherited_bucket = get_ancestor_bucket(node);
|
const struct aggregator_bucket *inherited_bucket = get_ancestor_bucket(node);
|
||||||
|
|
||||||
if (bucket_is_present(inherited_bucket, node))
|
/*
|
||||||
|
* If bucket inherited from ancestor is among potential bucket for this node,
|
||||||
|
* this node doesn't need bucket because it inherits one
|
||||||
|
*/
|
||||||
|
if (is_bucket_potential(inherited_bucket, node))
|
||||||
{
|
{
|
||||||
node->bucket = NULL;
|
node->bucket = NULL;
|
||||||
|
remove_potential_buckets(node);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -496,49 +452,15 @@ third_pass(struct trie_node *node)
|
|||||||
node->bucket = node->potential_buckets[0];
|
node->bucket = node->potential_buckets[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Postorder traversal */
|
||||||
third_pass(node->child[0]);
|
third_pass(node->child[0]);
|
||||||
third_pass(node->child[1]);
|
third_pass(node->child[1]);
|
||||||
|
|
||||||
|
/* Leaves with no assigned bucket are removed */
|
||||||
|
if (node->bucket == NULL && is_leaf(node))
|
||||||
|
remove_node(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
static void
|
|
||||||
third_pass(struct trie_node *node)
|
|
||||||
{
|
|
||||||
// End of recursion
|
|
||||||
if (is_leaf(node))
|
|
||||||
{
|
|
||||||
assert(node->potential_buckets_count > 0);
|
|
||||||
node->bucket = node->potential_buckets[0];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Root
|
|
||||||
if (node->parent == NULL)
|
|
||||||
{
|
|
||||||
assert(node->potential_buckets_count > 0);
|
|
||||||
node->bucket = node->potential_buckets[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++)
|
|
||||||
{
|
|
||||||
const struct aggregator_bucket *inherited = get_ancestor_bucket(node);
|
|
||||||
|
|
||||||
if (bucket_is_present(inherited, node->child[i]))
|
|
||||||
{
|
|
||||||
remove_potential_buckets(node->child[i]);
|
|
||||||
node->bucket = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
assert(node->potential_buckets_count > 0);
|
|
||||||
node->bucket = node->potential_buckets[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
third_pass(node->child[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
get_trie_prefix_count_helper(const struct trie_node *node, int *count)
|
get_trie_prefix_count_helper(const struct trie_node *node, int *count)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user