summaryrefslogtreecommitdiff
path: root/nest/rt-fib.c
diff options
context:
space:
mode:
Diffstat (limited to 'nest/rt-fib.c')
-rw-r--r--nest/rt-fib.c43
1 files changed, 23 insertions, 20 deletions
diff --git a/nest/rt-fib.c b/nest/rt-fib.c
index c12d0519..c83ae171 100644
--- a/nest/rt-fib.c
+++ b/nest/rt-fib.c
@@ -43,7 +43,7 @@
#define HASH_DEF_ORDER 10
#define HASH_HI_MARK *4
#define HASH_HI_STEP 2
-#define HASH_HI_MAX 16 /* Must be at most 16 */
+#define HASH_HI_MAX 16
#define HASH_LO_MARK /5
#define HASH_LO_STEP 2
#define HASH_LO_MIN 10
@@ -266,38 +266,32 @@ fib_get(struct fib *f, const net_addr *a)
return b;
}
-static void *
-fib_route_ip4(struct fib *f, const net_addr *n0)
+static inline void *
+fib_route_ip4(struct fib *f, net_addr_ip4 *n)
{
- net_addr net;
- net_addr_ip4 *n = (net_addr_ip4 *) &net;
- void *b;
+ void *r;
- net_copy(&net, n0);
- while (!(b = fib_find(f, &net)) && (n->pxlen > 0))
+ while (!(r = fib_find(f, (net_addr *) n)) && (n->pxlen > 0))
{
n->pxlen--;
ip4_clrbit(&n->prefix, n->pxlen);
}
- return b;
+ return r;
}
-static void *
-fib_route_ip6(struct fib *f, const net_addr *n0)
+static inline void *
+fib_route_ip6(struct fib *f, net_addr_ip6 *n)
{
- net_addr net;
- net_addr_ip6 *n = (net_addr_ip6 *) &net;
- void *b;
+ void *r;
- net_copy(&net, n0);
- while (!(b = fib_find(f, &net)) && (n->pxlen > 0))
+ while (!(r = fib_find(f, (net_addr *) n)) && (n->pxlen > 0))
{
n->pxlen--;
ip6_clrbit(&n->prefix, n->pxlen);
}
- return b;
+ return r;
}
/**
@@ -314,21 +308,25 @@ fib_route(struct fib *f, const net_addr *n)
{
ASSERT(f->addr_type == n->type);
+ net_addr *n0 = alloca(n->length);
+ net_copy(n0, n);
+
switch (n->type)
{
case NET_IP4:
case NET_VPN4:
- return fib_route_ip4(f, n);
+ return fib_route_ip4(f, (net_addr_ip4 *) n0);
case NET_IP6:
case NET_VPN6:
- return fib_route_ip6(f, n);
+ return fib_route_ip6(f, (net_addr_ip6 *) n0);
default:
return NULL;
}
}
+
static inline void
fib_merge_readers(struct fib_iterator *i, struct fib_node *to)
{
@@ -398,7 +396,12 @@ fib_delete(struct fib *f, void *E)
}
fib_merge_readers(it, l);
}
- sl_free(f->fib_slab, e);
+
+ if (f->fib_slab)
+ sl_free(f->fib_slab, E);
+ else
+ mb_free(E);
+
if (f->entries-- < f->entries_min)
fib_rehash(f, -HASH_LO_STEP);
return;