1
0
mirror of https://gitlab.labs.nic.cz/labs/bird.git synced 2024-05-11 16:54:54 +00:00

Core multipath support.

This commit is contained in:
Ondrej Zajicek
2010-12-07 23:33:55 +01:00
parent 01427d3f2b
commit 7e95c05d88
5 changed files with 140 additions and 55 deletions

View File

@@ -57,9 +57,65 @@
pool *rta_pool;
static slab *rta_slab;
static slab *mpnh_slab;
struct protocol *attr_class_to_protocol[EAP_MAX];
static inline unsigned int
mpnh_hash(struct mpnh *x)
{
unsigned int h = 0;
for (; x; x = x->next)
h ^= ipa_hash(x->gw);
return h;
}
int
mpnh__same(struct mpnh *x, struct mpnh *y)
{
for (; x && y; x = x->next, y = y->next)
if (!ipa_equal(x->gw, y->gw) || (x->iface != y->iface) || (x->weight != y->weight))
return 0;
return x == y;
}
static struct mpnh *
mpnh_copy(struct mpnh *o)
{
struct mpnh *first = NULL;
struct mpnh **last = &first;
for (; o; o = o->next)
{
struct mpnh *n = sl_alloc(mpnh_slab);
n->gw = o->gw;
n->iface = o->iface;
n->next = NULL;
n->weight = o->weight;
*last = n;
last = &(n->next);
}
return first;
}
static void
mpnh_free(struct mpnh *o)
{
struct mpnh *n;
while (o)
{
n = o->next;
sl_free(mpnh_slab, o);
o = n;
}
}
/*
* Extended Attributes
*/
@@ -587,7 +643,8 @@ rta_alloc_hash(void)
static inline unsigned int
rta_hash(rta *a)
{
return (a->proto->hash_key ^ ipa_hash(a->gw) ^ ea_hash(a->eattrs)) & 0xffff;
return (a->proto->hash_key ^ ipa_hash(a->gw) ^
mpnh_hash(a->nexthops) ^ ea_hash(a->eattrs)) & 0xffff;
}
static inline int
@@ -604,6 +661,7 @@ rta_same(rta *x, rta *y)
ipa_equal(x->from, y->from) &&
x->iface == y->iface &&
x->hostentry == y->hostentry &&
mpnh_same(x->nexthops, y->nexthops) &&
ea_same(x->eattrs, y->eattrs));
}
@@ -614,6 +672,7 @@ rta_copy(rta *o)
memcpy(r, o, sizeof(rta));
r->uc = 1;
r->nexthops = mpnh_copy(o->nexthops);
r->eattrs = ea_list_copy(o->eattrs);
return r;
}
@@ -707,6 +766,7 @@ rta__free(rta *a)
a->next->pprev = a->pprev;
a->aflags = 0; /* Poison the entry */
rt_unlock_hostentry(a->hostentry);
mpnh_free(a->nexthops);
ea_free(a->eattrs);
sl_free(rta_slab, a);
}
@@ -798,6 +858,7 @@ rta_init(void)
{
rta_pool = rp_new(&root_pool, "Attributes");
rta_slab = sl_new(rta_pool, sizeof(rta));
mpnh_slab = sl_new(rta_pool, sizeof(struct mpnh));
rta_alloc_hash();
}