0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-22 09:41:54 +00:00

Nest: Do not compare rte.flags during rte_update()

Route flags are mosty internal state of rtable, they are not significant
to whether a route has changed. With the old code, all routes received as
a part of enhanced route refresh are always re-announced to other peers
due to change in REF_STALE.
This commit is contained in:
Ondrej Zajicek (work) 2019-02-22 02:16:39 +01:00
parent ae294cc2d0
commit 93af78d2d2

View File

@ -1007,12 +1007,13 @@ 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 */
return return
x->attrs == y->attrs && x->attrs == y->attrs &&
x->flags == y->flags &&
x->pflags == y->pflags && x->pflags == y->pflags &&
x->pref == y->pref && x->pref == y->pref &&
(!x->attrs->src->proto->rte_same || x->attrs->src->proto->rte_same(x, y)); (!x->attrs->src->proto->rte_same || x->attrs->src->proto->rte_same(x, y)) &&
rte_is_filtered(x) == rte_is_filtered(y);
} }
static inline int rte_is_ok(rte *e) { return e && !rte_is_filtered(e); } static inline int rte_is_ok(rte *e) { return e && !rte_is_filtered(e); }
@ -1056,7 +1057,9 @@ rte_recalculate(struct channel *c, net *net, rte *new, struct rte_src *src)
if (new && rte_same(old, new)) if (new && rte_same(old, new))
{ {
/* No changes, ignore the new route */ /* No changes, ignore the new route and refresh the old one */
old->flags &= ~(REF_STALE | REF_DISCARD | REF_MODIFY);
if (!rte_is_filtered(new)) if (!rte_is_filtered(new))
{ {
@ -2362,7 +2365,16 @@ rte_update_in(struct channel *c, const net_addr *n, rte *new, struct rte_src *sr
if (old->attrs->src == src) if (old->attrs->src == src)
{ {
if (new && rte_same(old, new)) if (new && rte_same(old, new))
{
/* Refresh the old rte, continue with update to main rtable */
if (old->flags & (REF_STALE | REF_DISCARD | REF_MODIFY))
{
old->flags &= ~(REF_STALE | REF_DISCARD | REF_MODIFY);
return 1;
}
goto drop_update; goto drop_update;
}
/* Remove the old rte */ /* Remove the old rte */
*pos = old->next; *pos = old->next;