mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-13 22:58:42 +00:00
BGP: Moved the suppressed and stale flags to pflags
This commit is contained in:
parent
cda7a1936d
commit
dd18eef5ac
@ -251,12 +251,6 @@ typedef struct rte {
|
|||||||
u32 router_id; /* Router that originated this route */
|
u32 router_id; /* Router that originated this route */
|
||||||
} ospf;
|
} ospf;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_BGP
|
|
||||||
struct {
|
|
||||||
u8 suppressed; /* Used for deterministic MED comparison */
|
|
||||||
s8 stale; /* Route is LLGR_STALE, -1 if unknown */
|
|
||||||
} bgp;
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_BABEL
|
#ifdef CONFIG_BABEL
|
||||||
struct {
|
struct {
|
||||||
u16 seqno; /* Babel seqno */
|
u16 seqno; /* Babel seqno */
|
||||||
|
@ -1881,14 +1881,24 @@ bgp_get_neighbor(rte *r)
|
|||||||
static inline int
|
static inline int
|
||||||
rte_stale(rte *r)
|
rte_stale(rte *r)
|
||||||
{
|
{
|
||||||
if (r->u.bgp.stale < 0)
|
if (r->pflags & BGP_REF_STALE)
|
||||||
{
|
return 1;
|
||||||
|
|
||||||
|
if (r->pflags & BGP_REF_NOT_STALE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* If staleness is unknown, compute and cache it */
|
/* If staleness is unknown, compute and cache it */
|
||||||
eattr *a = ea_find(r->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_COMMUNITY));
|
eattr *a = ea_find(r->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_COMMUNITY));
|
||||||
r->u.bgp.stale = a && int_set_contains(a->u.ptr, BGP_COMM_LLGR_STALE);
|
if (a && int_set_contains(a->u.ptr, BGP_COMM_LLGR_STALE))
|
||||||
|
{
|
||||||
|
r->pflags |= BGP_REF_STALE;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
r->pflags |= BGP_REF_NOT_STALE;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return r->u.bgp.stale;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -1900,8 +1910,8 @@ bgp_rte_better(rte *new, rte *old)
|
|||||||
u32 n, o;
|
u32 n, o;
|
||||||
|
|
||||||
/* Skip suppressed routes (see bgp_rte_recalculate()) */
|
/* Skip suppressed routes (see bgp_rte_recalculate()) */
|
||||||
n = new->u.bgp.suppressed;
|
n = new->pflags & BGP_REF_SUPPRESSED;
|
||||||
o = old->u.bgp.suppressed;
|
o = old->pflags & BGP_REF_SUPPRESSED;
|
||||||
if (n > o)
|
if (n > o)
|
||||||
return 0;
|
return 0;
|
||||||
if (n < o)
|
if (n < o)
|
||||||
@ -2045,17 +2055,14 @@ bgp_rte_mergable(rte *pri, rte *sec)
|
|||||||
u32 p, s;
|
u32 p, s;
|
||||||
|
|
||||||
/* Skip suppressed routes (see bgp_rte_recalculate()) */
|
/* Skip suppressed routes (see bgp_rte_recalculate()) */
|
||||||
if (pri->u.bgp.suppressed != sec->u.bgp.suppressed)
|
/* LLGR draft - depreference stale routes */
|
||||||
|
if (pri->pflags != sec->pflags)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* RFC 4271 9.1.2.1. Route resolvability test */
|
/* RFC 4271 9.1.2.1. Route resolvability test */
|
||||||
if (rte_resolvable(pri) != rte_resolvable(sec))
|
if (rte_resolvable(pri) != rte_resolvable(sec))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* LLGR draft - depreference stale routes */
|
|
||||||
if (rte_stale(pri) != rte_stale(sec))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Start with local preferences */
|
/* Start with local preferences */
|
||||||
x = ea_find(pri->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_LOCAL_PREF));
|
x = ea_find(pri->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_LOCAL_PREF));
|
||||||
y = ea_find(sec->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_LOCAL_PREF));
|
y = ea_find(sec->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_LOCAL_PREF));
|
||||||
@ -2135,7 +2142,7 @@ bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best)
|
|||||||
rte *key = new ? new : old;
|
rte *key = new ? new : old;
|
||||||
u32 lpref = key->attrs->pref;
|
u32 lpref = key->attrs->pref;
|
||||||
u32 lasn = bgp_get_neighbor(key);
|
u32 lasn = bgp_get_neighbor(key);
|
||||||
int old_suppressed = old ? old->u.bgp.suppressed : 0;
|
int old_suppressed = old ? !!(old->pflags & BGP_REF_SUPPRESSED) : 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Proper RFC 4271 path selection is a bit complicated, it cannot be
|
* Proper RFC 4271 path selection is a bit complicated, it cannot be
|
||||||
@ -2187,11 +2194,11 @@ bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (new)
|
if (new)
|
||||||
new->u.bgp.suppressed = 1;
|
new->pflags |= BGP_REF_SUPPRESSED;
|
||||||
|
|
||||||
if (old)
|
if (old)
|
||||||
{
|
{
|
||||||
old->u.bgp.suppressed = 1;
|
old->pflags |= BGP_REF_SUPPRESSED;
|
||||||
|
|
||||||
/* The fast case - replace not best with worse (or remove not best) */
|
/* The fast case - replace not best with worse (or remove not best) */
|
||||||
if (old_suppressed && !(new && bgp_rte_better(new, old)))
|
if (old_suppressed && !(new && bgp_rte_better(new, old)))
|
||||||
@ -2203,7 +2210,7 @@ bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best)
|
|||||||
for (s=net->routes; rte_is_valid(s); s=s->next)
|
for (s=net->routes; rte_is_valid(s); s=s->next)
|
||||||
if (use_deterministic_med(s) && same_group(s, lpref, lasn))
|
if (use_deterministic_med(s) && same_group(s, lpref, lasn))
|
||||||
{
|
{
|
||||||
s->u.bgp.suppressed = 1;
|
s->pflags |= BGP_REF_SUPPRESSED;
|
||||||
if (!r || bgp_rte_better(s, r))
|
if (!r || bgp_rte_better(s, r))
|
||||||
r = s;
|
r = s;
|
||||||
}
|
}
|
||||||
@ -2214,16 +2221,16 @@ bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best)
|
|||||||
|
|
||||||
/* Found if new is mergable with best-in-group */
|
/* Found if new is mergable with best-in-group */
|
||||||
if (new && (new != r) && bgp_rte_mergable(r, new))
|
if (new && (new != r) && bgp_rte_mergable(r, new))
|
||||||
new->u.bgp.suppressed = 0;
|
new->pflags &= ~BGP_REF_SUPPRESSED;
|
||||||
|
|
||||||
/* Found all existing routes mergable with best-in-group */
|
/* Found all existing routes mergable with best-in-group */
|
||||||
for (s=net->routes; rte_is_valid(s); s=s->next)
|
for (s=net->routes; rte_is_valid(s); s=s->next)
|
||||||
if (use_deterministic_med(s) && same_group(s, lpref, lasn))
|
if (use_deterministic_med(s) && same_group(s, lpref, lasn))
|
||||||
if ((s != r) && bgp_rte_mergable(r, s))
|
if ((s != r) && bgp_rte_mergable(r, s))
|
||||||
s->u.bgp.suppressed = 0;
|
s->pflags &= ~BGP_REF_SUPPRESSED;
|
||||||
|
|
||||||
/* Found best-in-group */
|
/* Found best-in-group */
|
||||||
r->u.bgp.suppressed = 0;
|
r->pflags &= ~BGP_REF_SUPPRESSED;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There are generally two reasons why we have to force
|
* There are generally two reasons why we have to force
|
||||||
@ -2271,7 +2278,7 @@ bgp_rte_modify_stale(struct rte *r, struct linpool *pool)
|
|||||||
r = rte_cow_rta(r, pool);
|
r = rte_cow_rta(r, pool);
|
||||||
bgp_set_attr_ptr(&(r->attrs->eattrs), pool, BA_COMMUNITY, flags,
|
bgp_set_attr_ptr(&(r->attrs->eattrs), pool, BA_COMMUNITY, flags,
|
||||||
int_set_add(pool, ad, BGP_COMM_LLGR_STALE));
|
int_set_add(pool, ad, BGP_COMM_LLGR_STALE));
|
||||||
r->u.bgp.stale = 1;
|
r->pflags |= BGP_REF_STALE;
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
@ -2358,7 +2365,7 @@ bgp_get_route_info(rte *e, byte *buf)
|
|||||||
|
|
||||||
buf += bsprintf(buf, " (%d", e->attrs->pref);
|
buf += bsprintf(buf, " (%d", e->attrs->pref);
|
||||||
|
|
||||||
if (e->u.bgp.suppressed)
|
if (e->pflags & BGP_REF_SUPPRESSED)
|
||||||
buf += bsprintf(buf, "-");
|
buf += bsprintf(buf, "-");
|
||||||
|
|
||||||
if (rte_stale(e))
|
if (rte_stale(e))
|
||||||
|
@ -200,6 +200,10 @@ struct bgp_channel_config {
|
|||||||
|
|
||||||
#define BGP_BFD_GRACEFUL 2 /* BFD down triggers graceful restart */
|
#define BGP_BFD_GRACEFUL 2 /* BFD down triggers graceful restart */
|
||||||
|
|
||||||
|
/* rte->pflags */
|
||||||
|
#define BGP_REF_SUPPRESSED 0x1 /* Used for deterministic MED comparison */
|
||||||
|
#define BGP_REF_STALE 0x2 /* Route is LLGR_STATE */
|
||||||
|
#define BGP_REF_NOT_STALE 0x4 /* Route is NOT LLGR_STATE */
|
||||||
|
|
||||||
struct bgp_af_caps {
|
struct bgp_af_caps {
|
||||||
u32 afi;
|
u32 afi;
|
||||||
|
@ -1365,7 +1365,6 @@ bgp_rte_update(struct bgp_parse_state *s, net_addr *n, u32 path_id, rta *a0)
|
|||||||
|
|
||||||
rte e0 = {
|
rte e0 = {
|
||||||
.attrs = rta_clone(s->cached_rta),
|
.attrs = rta_clone(s->cached_rta),
|
||||||
.u.bgp.stale = -1,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
rte_update(&(s->channel->c), n, &e0);
|
rte_update(&(s->channel->c), n, &e0);
|
||||||
|
@ -41,6 +41,10 @@
|
|||||||
#include "filter/filter.h"
|
#include "filter/filter.h"
|
||||||
#include "lib/string.h"
|
#include "lib/string.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_BGP
|
||||||
|
#include "proto/bgp/bgp.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "pipe.h"
|
#include "pipe.h"
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -81,7 +85,7 @@ pipe_rt_notify(struct proto *P, struct channel *src_ch, net *n, rte *new, rte *o
|
|||||||
#ifdef CONFIG_BGP
|
#ifdef CONFIG_BGP
|
||||||
/* Hack to cleanup cached value */
|
/* Hack to cleanup cached value */
|
||||||
if (e->attrs->src->proto->proto == &proto_bgp)
|
if (e->attrs->src->proto->proto == &proto_bgp)
|
||||||
e->u.bgp.stale = -1;
|
e->pflags &= ~(BGP_REF_STALE | BGP_REF_NOT_STALE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
src = a->src;
|
src = a->src;
|
||||||
|
Loading…
Reference in New Issue
Block a user