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

Split route data structure to storage (ro) / manipulation (rw) structures.

Routes are now allocated only when they are just to be inserted to the
table. Updating a route needs a locally allocated route structure.
Ownership of the attributes is also now not transfered from protocols to
tables and vice versa but just borrowed which should be easier to handle
in a multithreaded environment.
This commit is contained in:
Maria Matejka
2020-01-28 11:42:46 +01:00
committed by Maria Matejka
parent 60880b539b
commit 69d1ffde4c
27 changed files with 611 additions and 875 deletions

View File

@@ -207,16 +207,15 @@ rip_announce_rte(struct rip_proto *p, struct rip_entry *en)
.u.data = (uintptr_t) a0.nh.iface,
};
rta *a = rta_lookup(&a0);
rte *e = rte_get_temp(a, p->p.main_source);
rte e0 = {
.attrs = &a0,
.src = p->p.main_source,
};
rte_update(&p->p, en->n.addr, e);
rte_update(p->p.main_channel, en->n.addr, &e0, p->p.main_source);
}
else
{
/* Withdraw */
rte_update(&p->p, en->n.addr, NULL);
}
rte_update(p->p.main_channel, en->n.addr, NULL, p->p.main_source);
}
/**
@@ -311,8 +310,8 @@ rip_withdraw_rte(struct rip_proto *p, net_addr *n, struct rip_neighbor *from)
* it into our data structures.
*/
static void
rip_rt_notify(struct proto *P, struct channel *ch UNUSED, struct network *net, struct rte *new,
struct rte *old UNUSED)
rip_rt_notify(struct proto *P, struct channel *ch UNUSED, const net_addr *net, struct rte *new,
const struct rte *old UNUSED)
{
struct rip_proto *p = (struct rip_proto *) P;
struct rip_entry *en;
@@ -328,14 +327,14 @@ rip_rt_notify(struct proto *P, struct channel *ch UNUSED, struct network *net, s
if (rt_metric > p->infinity)
{
log(L_WARN "%s: Invalid rip_metric value %u for route %N",
p->p.name, rt_metric, net->n.addr);
p->p.name, rt_metric, net);
rt_metric = p->infinity;
}
if (rt_tag > 0xffff)
{
log(L_WARN "%s: Invalid rip_tag value %u for route %N",
p->p.name, rt_tag, net->n.addr);
p->p.name, rt_tag, net);
rt_metric = p->infinity;
rt_tag = 0;
}
@@ -347,7 +346,7 @@ rip_rt_notify(struct proto *P, struct channel *ch UNUSED, struct network *net, s
* collection.
*/
en = fib_get(&p->rtable, net->n.addr);
en = fib_get(&p->rtable, net);
old_metric = en->valid ? en->metric : -1;
@@ -361,7 +360,7 @@ rip_rt_notify(struct proto *P, struct channel *ch UNUSED, struct network *net, s
else
{
/* Withdraw */
en = fib_find(&p->rtable, net->n.addr);
en = fib_find(&p->rtable, net);
if (!en || en->valid != RIP_ENTRY_VALID)
return;