mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
Nest: Fix several issues with pflags
There were some confusion about validity and usage of pflags, which caused incorrect usage after some flags from (now removed) protocol- specific area were moved to pflags. We state that pflags: - Are secondary data used by protocol-specific hooks - Can be changed on an existing route (in contrast to copy-on-write for primary data) - Are irrelevant for propagation (not propagated when changed) - Are specific to a routing table (not propagated by pipe) The patch did these fixes: - Do not compare pflags in rte_same(), as they may keep cached values like BGP_REF_STALE, causing spurious propagation. - Initialize pflags to zero in rte_get_temp(), avoid initialization in protocol code, fixing at least two forgotten initializations (krt and one case in babel). - Improve documentation about pflags
This commit is contained in:
parent
8b06a4d8af
commit
6d1ae197d1
@ -92,7 +92,6 @@ dev_ifa_notify(struct proto *P, uint flags, struct ifa *ad)
|
|||||||
|
|
||||||
a = rta_lookup(&a0);
|
a = rta_lookup(&a0);
|
||||||
e = rte_get_temp(a, src);
|
e = rte_get_temp(a, src);
|
||||||
e->pflags = 0;
|
|
||||||
rte_update2(c, net, e, src);
|
rte_update2(c, net, e, src);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,11 +21,15 @@
|
|||||||
* on the list being the best one (i.e., the one we currently use
|
* on the list being the best one (i.e., the one we currently use
|
||||||
* for routing), the order of the other ones is undetermined.
|
* for routing), the order of the other ones is undetermined.
|
||||||
*
|
*
|
||||||
* The &rte contains information specific to the route (preference, protocol
|
* The &rte contains information about the route. There are net and src, which
|
||||||
* metrics, time of last modification etc.) and a pointer to a &rta structure
|
* together forms a key identifying the route in a routing table. There is a
|
||||||
* (see the route attribute module for a precise explanation) holding the
|
* pointer to a &rta structure (see the route attribute module for a precise
|
||||||
* remaining route attributes which are expected to be shared by multiple
|
* explanation) holding the route attributes, which are primary data about the
|
||||||
* routes in order to conserve memory.
|
* route. There are several technical fields used by routing table code (route
|
||||||
|
* id, REF_* flags), There is also the pflags field, holding protocol-specific
|
||||||
|
* flags. They are not used by routing table code, but by protocol-specific
|
||||||
|
* hooks. In contrast to route attributes, they are not primary data and their
|
||||||
|
* validity is also limited to the routing table.
|
||||||
*
|
*
|
||||||
* There are several mechanisms that allow automatic update of routes in one
|
* There are several mechanisms that allow automatic update of routes in one
|
||||||
* routing table (dst) as a result of changes in another routing table (src).
|
* routing table (dst) as a result of changes in another routing table (src).
|
||||||
@ -558,10 +562,9 @@ rte_find(net *net, struct rte_src *src)
|
|||||||
* rte_get_temp - get a temporary &rte
|
* rte_get_temp - get a temporary &rte
|
||||||
* @a: attributes to assign to the new route (a &rta; in case it's
|
* @a: attributes to assign to the new route (a &rta; in case it's
|
||||||
* un-cached, rte_update() will create a cached copy automatically)
|
* un-cached, rte_update() will create a cached copy automatically)
|
||||||
|
* @src: route source
|
||||||
*
|
*
|
||||||
* Create a temporary &rte and bind it with the attributes @a.
|
* Create a temporary &rte and bind it with the attributes @a.
|
||||||
* Also set route preference to the default preference set for
|
|
||||||
* the protocol.
|
|
||||||
*/
|
*/
|
||||||
rte *
|
rte *
|
||||||
rte_get_temp(rta *a, struct rte_src *src)
|
rte_get_temp(rta *a, struct rte_src *src)
|
||||||
@ -571,6 +574,7 @@ rte_get_temp(rta *a, struct rte_src *src)
|
|||||||
e->attrs = a;
|
e->attrs = a;
|
||||||
e->id = 0;
|
e->id = 0;
|
||||||
e->flags = 0;
|
e->flags = 0;
|
||||||
|
e->pflags = 0;
|
||||||
rt_lock_source(e->src = src);
|
rt_lock_source(e->src = src);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@ -1205,10 +1209,9 @@ rte_free_quick(rte *e)
|
|||||||
static int
|
static int
|
||||||
rte_same(rte *x, rte *y)
|
rte_same(rte *x, rte *y)
|
||||||
{
|
{
|
||||||
/* rte.flags are not checked, as they are mostly internal to rtable */
|
/* rte.flags / rte.pflags are not checked, as they are internal to rtable */
|
||||||
return
|
return
|
||||||
x->attrs == y->attrs &&
|
x->attrs == y->attrs &&
|
||||||
x->pflags == y->pflags &&
|
|
||||||
x->src == y->src &&
|
x->src == y->src &&
|
||||||
rte_is_filtered(x) == rte_is_filtered(y);
|
rte_is_filtered(x) == rte_is_filtered(y);
|
||||||
}
|
}
|
||||||
|
@ -715,7 +715,6 @@ babel_announce_rte(struct babel_proto *p, struct babel_entry *e)
|
|||||||
|
|
||||||
rta *a = rta_lookup(&a0);
|
rta *a = rta_lookup(&a0);
|
||||||
rte *rte = rte_get_temp(a, p->p.main_source);
|
rte *rte = rte_get_temp(a, p->p.main_source);
|
||||||
rte->pflags = 0;
|
|
||||||
|
|
||||||
e->unreachable = 1;
|
e->unreachable = 1;
|
||||||
rte_update2(c, e->n.addr, rte, p->p.main_source);
|
rte_update2(c, e->n.addr, rte, p->p.main_source);
|
||||||
|
@ -1464,7 +1464,6 @@ bgp_rte_update(struct bgp_parse_state *s, const net_addr *n, u32 path_id, rta *a
|
|||||||
rta *a = rta_clone(s->cached_rta);
|
rta *a = rta_clone(s->cached_rta);
|
||||||
rte *e = rte_get_temp(a, s->last_src);
|
rte *e = rte_get_temp(a, s->last_src);
|
||||||
|
|
||||||
e->pflags = 0;
|
|
||||||
rte_update3(&s->channel->c, n, e, s->last_src);
|
rte_update3(&s->channel->c, n, e, s->last_src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,7 +162,6 @@ perf_loop(void *data)
|
|||||||
|
|
||||||
for (uint i=0; i<N; i++) {
|
for (uint i=0; i<N; i++) {
|
||||||
rte *e = rte_get_temp(p->data[i].a, p->p.main_source);
|
rte *e = rte_get_temp(p->data[i].a, p->p.main_source);
|
||||||
e->pflags = 0;
|
|
||||||
|
|
||||||
rte_update(P, &(p->data[i].net), e);
|
rte_update(P, &(p->data[i].net), e);
|
||||||
}
|
}
|
||||||
|
@ -77,13 +77,6 @@ pipe_rt_notify(struct proto *P, struct channel *src_ch, net *n, rte *new, rte *o
|
|||||||
a->cached = 0;
|
a->cached = 0;
|
||||||
a->hostentry = NULL;
|
a->hostentry = NULL;
|
||||||
e = rte_get_temp(a, src);
|
e = rte_get_temp(a, src);
|
||||||
e->pflags = new->pflags;
|
|
||||||
|
|
||||||
#ifdef CONFIG_BGP
|
|
||||||
/* Hack to cleanup cached value */
|
|
||||||
if (e->src->proto->proto == &proto_bgp)
|
|
||||||
e->pflags &= ~(BGP_REF_STALE | BGP_REF_NOT_STALE);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -130,8 +130,6 @@ rpki_table_add_roa(struct rpki_cache *cache, struct channel *channel, const net_
|
|||||||
rta *a = rta_lookup(&a0);
|
rta *a = rta_lookup(&a0);
|
||||||
rte *e = rte_get_temp(a, p->p.main_source);
|
rte *e = rte_get_temp(a, p->p.main_source);
|
||||||
|
|
||||||
e->pflags = 0;
|
|
||||||
|
|
||||||
rte_update2(channel, &pfxr->n, e, e->src);
|
rte_update2(channel, &pfxr->n, e, e->src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +104,6 @@ static_announce_rte(struct static_proto *p, struct static_route *r)
|
|||||||
|
|
||||||
/* We skip rta_lookup() here */
|
/* We skip rta_lookup() here */
|
||||||
rte *e = rte_get_temp(a, src);
|
rte *e = rte_get_temp(a, src);
|
||||||
e->pflags = 0;
|
|
||||||
|
|
||||||
if (r->cmds)
|
if (r->cmds)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user