extern linpool *rte_update_pool;
-static void
-dump_hash_table(const struct aggregator_proto *p)
-{
- log("================ HASH TABLE DUMP ================");
-
- HASH_WALK(p->buckets, next_hash, b)
- {
- for (const struct rte *rte = b->rte; rte; rte = rte->next)
- {
- struct net_addr *addr = rte->net->n.addr;
- log("bucket %p: addr: %N,\troute: %p, net: %p, src: %p", b, addr, rte, rte->net, rte->src);
- }
- }
- HASH_WALK_END;
-
- log("============== END HASH TABLE DUMP ==============");
-}
-
static void aggregator_bucket_update(struct aggregator_proto *p, struct aggregator_bucket *bucket, struct network *net);
static inline int
int res = aggregator_bucket_compare(left->potential_buckets[i], right->potential_buckets[j]);
if (res == 0)
- {
- // log("left: %p, right: %p, res: %d, verdict: EQUAL", left->potential_buckets[i], right->potential_buckets[i], res);
- // log("Buckets are NOT disjoint");
return 0;
- }
else if (res == -1)
- {
- // log("left: %p, right: %p, res: %d, verdict: LEFT < RIGHT", left->potential_buckets[i], right->potential_buckets[i], res);
i++;
- }
else if (res == 1)
- {
- // log("left: %p, right: %p, res: %d, verdict: LEFT > RIGHT", left->potential_buckets[i], right->potential_buckets[i], res);
j++;
- }
else
bug("Impossible");
}
- // log("Buckets are disjoint");
- // log("==========================================");
return 1;
}
static void
create_route_ip4(struct aggregator_proto *p, const struct net_addr_ip4 *addr, struct aggregator_bucket *bucket)
{
- log("create route XXX arte: %p, src: %p", p->default_arte, p->default_arte->rte.src);
-
struct {
struct network net;
union net_addr_union u;
static void
collect_prefixes_helper_ip4(const struct trie_node *node, struct net_addr_ip4 *addr, struct aggregator_proto *p, int depth, int *count)
{
- log("collect prefixes XXX arte: %p, src: %p", p->default_arte, p->default_arte->rte.src);
-
assert(node != NULL);
if (is_leaf(node))
assert(p->addr_type == NET_IP4 || p->addr_type == NET_IP6);
log("====PREFIXES BEFORE ====");
- log("XXX arte: %p, src: %p", p->default_arte, p->default_arte->rte.src);
first_pass(p->root, p->trie_slab);
log("====FIRST PASS====");
- log("XXX arte: %p, src: %p", p->default_arte, p->default_arte->rte.src);
print_prefixes(p->root, p->addr_type);
second_pass(p->root);
log("====SECOND PASS====");
- log("XXX arte: %p, src: %p", p->default_arte, p->default_arte->rte.src);
print_prefixes(p->root, p->addr_type);
third_pass(p->root);
log("====THIRD PASS====");
- log("XXX arte: %p, src: %p", p->default_arte, p->default_arte->rte.src);
print_prefixes(p->root, p->addr_type);
collect_prefixes(p);
- log("XXX arte: %p, src: %p", p->default_arte, p->default_arte->rte.src);
log("==== AGGREGATION DONE ====");
}
static void
aggregator_bucket_update(struct aggregator_proto *p, struct aggregator_bucket *bucket, struct network *net)
{
- log("XXX arte: %p, src: %p", p->default_arte, p->default_arte->rte.src);
-
/* Empty bucket */
if (!bucket->rte)
{
log("New route created: id = %d, protocol: %s", new->src->global_id, new->src->proto->name);
log("===================================================");
- log("XXX arte: %p, src: %p", p->default_arte, p->default_arte->rte.src);
-
-
/* merge filter needs one argument called "routes" */
struct f_val val = {
.type = T_ROUTES_BLOCK,
sl_free(old_route);
}
- dump_hash_table(p);
-
HASH_WALK(p->buckets, next_hash, bucket)
{
for (const struct rte *rte = bucket->rte; rte; rte = rte->next)
arte->rte.net = default_net;
default_net->routes = &arte->rte;
- p->default_arte = arte;
-
HASH_INSERT2(p->routes, AGGR_RTE, p->p.pool, arte);
HASH_INSERT2(p->buckets, AGGR_BUCK, p->p.pool, new_bucket);
{
struct aggregator_proto *p = SKIP_BACK(struct aggregator_proto, p, P);
- HASH_WALK(p->buckets, next_hash, b)
- {
- log(L_WARN "Buckets: %u %p", _i, b);
-
- for (struct rte *r = b->rte; r; r = r->next)
- {
- log(L_WARN " in bucket: %p", SKIP_BACK(struct aggregator_route, rte, r));
- }
- }
- HASH_WALK_END;
-
- HASH_WALK(p->routes, next_hash, r)
- {
- log(L_WARN "Routes: %u %p, net: %p, src: %p, hash: %x", _i, r, r->rte.net, r->rte.src, aggr_route_hash(&r->rte));
- }
- HASH_WALK_END;
-
HASH_WALK_DELSAFE(p->buckets, next_hash, b)
{
while (b->rte)
{
- {
- HASH_WALK(p->routes, next_hash, r)
- {
- log(L_WARN "%u %p", _i, r);
- }
- HASH_WALK_END;
- }
-
- log("Hash table dump before");
- dump_hash_table(p);
-
struct aggregator_route *arte = SKIP_BACK(struct aggregator_route, rte, b->rte);
- struct net_addr *addr = arte->rte.net->n.addr;
-
- log("Removing arte %p, rte: %p, addr: %N, net: %p, src: %p, hash: %x",
- arte, &arte->rte, addr, arte->rte.net, arte->rte.src, aggr_route_hash(&arte->rte));
-
- net_addr_union *n = (void *)arte->rte.net->n.addr;
- log("Net type: %d", n->n.type);
b->rte = arte->rte.next;
b->count--;
- int count_before_remove = p->routes.count;
-
- assert(n->n.type == NET_IP4);
- log("Hash count before HASH_REMOVE: %d", count_before_remove);
HASH_REMOVE(p->routes, AGGR_RTE, arte);
- int count_after_remove = p->routes.count;
- log("Hash count after HASH_REMOVE: %d", count_after_remove);
- assert(count_before_remove == count_after_remove + 1);
rta_free(arte->rte.attrs);
sl_free(arte);
-
- log("Hash table dump after");
- dump_hash_table(p);
}
ASSERT_DIE(b->count == 0);