summaryrefslogtreecommitdiff
path: root/lib/table.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/table.c')
-rw-r--r--lib/table.c75
1 files changed, 37 insertions, 38 deletions
diff --git a/lib/table.c b/lib/table.c
index edba7f1932..728615c776 100644
--- a/lib/table.c
+++ b/lib/table.c
@@ -33,12 +33,14 @@ DEFINE_MTYPE(LIB, ROUTE_NODE, "Route node")
static void route_table_free(struct route_table *);
-static bool route_table_hash_cmp(const void *a, const void *b)
+static int route_table_hash_cmp(const struct route_node *a,
+ const struct route_node *b)
{
- const struct prefix *pa = a, *pb = b;
- return prefix_cmp(pa, pb) == 0;
+ return prefix_cmp(&a->p, &b->p);
}
+DECLARE_HASH(rn_hash_node, struct route_node, nodehash, route_table_hash_cmp,
+ prefix_hash_key)
/*
* route_table_init_with_delegate
*/
@@ -49,8 +51,7 @@ route_table_init_with_delegate(route_table_delegate_t *delegate)
rt = XCALLOC(MTYPE_ROUTE_TABLE, sizeof(struct route_table));
rt->delegate = delegate;
- rt->hash = hash_create(prefix_hash_key, route_table_hash_cmp,
- "route table hash");
+ rn_hash_node_init(&rt->hash);
return rt;
}
@@ -69,15 +70,14 @@ static struct route_node *route_node_new(struct route_table *table)
static struct route_node *route_node_set(struct route_table *table,
const struct prefix *prefix)
{
- struct route_node *node, *inserted;
+ struct route_node *node;
node = route_node_new(table);
prefix_copy(&node->p, prefix);
node->table = table;
- inserted = hash_get(node->table->hash, node, hash_alloc_intern);
- assert(inserted == node);
+ rn_hash_node_add(&node->table->hash, node);
return node;
}
@@ -99,9 +99,6 @@ static void route_table_free(struct route_table *rt)
if (rt == NULL)
return;
- hash_clean(rt->hash, NULL);
- hash_free(rt->hash);
-
node = rt->top;
/* Bulk deletion of nodes remaining in this table. This function is not
@@ -123,6 +120,7 @@ static void route_table_free(struct route_table *rt)
tmp_node->table->count--;
tmp_node->lock = 0; /* to cause assert if unlocked after this */
+ rn_hash_node_del(&rt->hash, tmp_node);
route_node_free(rt, tmp_node);
if (node != NULL) {
@@ -137,6 +135,7 @@ static void route_table_free(struct route_table *rt)
assert(rt->count == 0);
+ rn_hash_node_fini(&rt->hash);
XFREE(MTYPE_ROUTE_TABLE, rt);
return;
}
@@ -192,7 +191,7 @@ static void set_link(struct route_node *node, struct route_node *new)
}
/* Find matched prefix. */
-struct route_node *route_node_match(const struct route_table *table,
+struct route_node *route_node_match(struct route_table *table,
union prefixconstptr pu)
{
const struct prefix *p = pu.p;
@@ -222,7 +221,7 @@ struct route_node *route_node_match(const struct route_table *table,
return NULL;
}
-struct route_node *route_node_match_ipv4(const struct route_table *table,
+struct route_node *route_node_match_ipv4(struct route_table *table,
const struct in_addr *addr)
{
struct prefix_ipv4 p;
@@ -235,7 +234,7 @@ struct route_node *route_node_match_ipv4(const struct route_table *table,
return route_node_match(table, (struct prefix *)&p);
}
-struct route_node *route_node_match_ipv6(const struct route_table *table,
+struct route_node *route_node_match_ipv6(struct route_table *table,
const struct in6_addr *addr)
{
struct prefix_ipv6 p;
@@ -245,49 +244,50 @@ struct route_node *route_node_match_ipv6(const struct route_table *table,
p.prefixlen = IPV6_MAX_PREFIXLEN;
p.prefix = *addr;
- return route_node_match(table, (struct prefix *)&p);
+ return route_node_match(table, &p);
}
/* Lookup same prefix node. Return NULL when we can't find route. */
-struct route_node *route_node_lookup(const struct route_table *table,
+struct route_node *route_node_lookup(struct route_table *table,
union prefixconstptr pu)
{
- struct prefix p;
- struct route_node *node;
- prefix_copy(&p, pu.p);
- apply_mask(&p);
+ struct route_node rn, *node;
+ prefix_copy(&rn.p, pu.p);
+ apply_mask(&rn.p);
- node = hash_get(table->hash, (void *)&p, NULL);
+ node = rn_hash_node_find(&table->hash, &rn);
return (node && node->info) ? route_lock_node(node) : NULL;
}
/* Lookup same prefix node. Return NULL when we can't find route. */
-struct route_node *route_node_lookup_maynull(const struct route_table *table,
+struct route_node *route_node_lookup_maynull(struct route_table *table,
union prefixconstptr pu)
{
- struct prefix p;
- struct route_node *node;
- prefix_copy(&p, pu.p);
- apply_mask(&p);
+ struct route_node rn, *node;
+ prefix_copy(&rn.p, pu.p);
+ apply_mask(&rn.p);
- node = hash_get(table->hash, (void *)&p, NULL);
+ node = rn_hash_node_find(&table->hash, &rn);
return node ? route_lock_node(node) : NULL;
}
/* Add node to routing table. */
-struct route_node *route_node_get(struct route_table *const table,
+struct route_node *route_node_get(struct route_table *table,
union prefixconstptr pu)
{
- const struct prefix *p = pu.p;
+ struct route_node search;
+ struct prefix *p = &search.p;
+
+ prefix_copy(p, pu.p);
+ apply_mask(p);
+
struct route_node *new;
struct route_node *node;
struct route_node *match;
- struct route_node *inserted;
uint16_t prefixlen = p->prefixlen;
const uint8_t *prefix = &p->u.prefix;
- apply_mask((struct prefix *)p);
- node = hash_get(table->hash, (void *)p, NULL);
+ node = rn_hash_node_find(&table->hash, &search);
if (node && node->info)
return route_lock_node(node);
@@ -314,8 +314,7 @@ struct route_node *route_node_get(struct route_table *const table,
new->p.family = p->family;
new->table = table;
set_link(new, node);
- inserted = hash_get(node->table->hash, new, hash_alloc_intern);
- assert(inserted == new);
+ rn_hash_node_add(&table->hash, new);
if (match)
set_link(match, new);
@@ -367,7 +366,7 @@ void route_node_delete(struct route_node *node)
node->table->count--;
- hash_release(node->table->hash, node);
+ rn_hash_node_del(&node->table->hash, node);
/* WARNING: FRAGILE CODE!
* route_node_free may have the side effect of free'ing the entire
@@ -472,7 +471,7 @@ struct route_node *route_next_until(struct route_node *node,
return NULL;
}
-unsigned long route_table_count(const struct route_table *table)
+unsigned long route_table_count(struct route_table *table)
{
return table->count;
}
@@ -607,7 +606,7 @@ static struct route_node *route_get_subtree_next(struct route_node *node)
* @see route_table_get_next
*/
static struct route_node *
-route_table_get_next_internal(const struct route_table *table,
+route_table_get_next_internal(struct route_table *table,
const struct prefix *p)
{
struct route_node *node, *tmp_node;
@@ -708,7 +707,7 @@ route_table_get_next_internal(const struct route_table *table,
* Find the node that occurs after the given prefix in order of
* iteration.
*/
-struct route_node *route_table_get_next(const struct route_table *table,
+struct route_node *route_table_get_next(struct route_table *table,
union prefixconstptr pu)
{
const struct prefix *p = pu.p;