summaryrefslogtreecommitdiffstats
path: root/lib/table.c
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@diac24.net>2019-05-21 05:00:09 +0200
committerDavid Lamparter <equinox@diac24.net>2019-05-21 05:42:13 +0200
commit0734f93b8ed51de625720346c953bd50e9f40487 (patch)
tree89a5496e235a705d8410d6b203f7da5e9f61d6e3 /lib/table.c
parenttests: more datastructure tests (diff)
downloadfrr-0734f93b8ed51de625720346c953bd50e9f40487.tar.xz
frr-0734f93b8ed51de625720346c953bd50e9f40487.zip
lib/table: remove odd casts
Working with a proper struct route_node gets us around a bunch of weird casts here and makes the code slightly more robust. Signed-off-by: David Lamparter <equinox@diac24.net>
Diffstat (limited to 'lib/table.c')
-rw-r--r--lib/table.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/lib/table.c b/lib/table.c
index 2d42e2d55..4bd52b3d8 100644
--- a/lib/table.c
+++ b/lib/table.c
@@ -33,10 +33,10 @@ DEFINE_MTYPE(LIB, ROUTE_NODE, "Route node")
static void route_table_free(struct route_table *);
-static int 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);
+ return prefix_cmp(&a->p, &b->p);
}
DECLARE_HASH(rn_hash_node, struct route_node, nodehash, route_table_hash_cmp,
@@ -244,19 +244,18 @@ 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,
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 = rn_hash_node_find(&table->hash, (void *)&p);
+ node = rn_hash_node_find(&table->hash, &rn);
return (node && node->info) ? route_lock_node(node) : NULL;
}
@@ -264,12 +263,11 @@ struct route_node *route_node_lookup(const struct route_table *table,
struct route_node *route_node_lookup_maynull(const 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 = rn_hash_node_find(&table->hash, (void *)&p);
+ node = rn_hash_node_find(&table->hash, &rn);
return node ? route_lock_node(node) : NULL;
}
@@ -277,15 +275,19 @@ struct route_node *route_node_lookup_maynull(const struct route_table *table,
struct route_node *route_node_get(struct route_table *const 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;
uint16_t prefixlen = p->prefixlen;
const uint8_t *prefix = &p->u.prefix;
- apply_mask((struct prefix *)p);
- node = rn_hash_node_find(&table->hash, (void *)p);
+ node = rn_hash_node_find(&table->hash, &search);
if (node && node->info)
return route_lock_node(node);