summaryrefslogtreecommitdiff
path: root/proto/bgp/bgp.c
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2022-09-08 19:41:02 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2022-10-03 20:18:12 +0200
commit54430df953d6c590e5f446530a21d18277eeda56 (patch)
treea3c99a8596c3d864bef40d87ddf8f82f9e9b17e0 /proto/bgp/bgp.c
parent605ff0a0ebdd32b1a98316737c3e65acb528a156 (diff)
BGP: Do not assume that all channels are struct bgp_channel
In principle, the channel list is a list of parent struct proto and can contain general structures of type struct channel, That is useful e.g. for adding MPLS channels to BGP.
Diffstat (limited to 'proto/bgp/bgp.c')
-rw-r--r--proto/bgp/bgp.c39
1 files changed, 25 insertions, 14 deletions
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index f07fcc16..e1e0d796 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -260,7 +260,7 @@ static inline struct bgp_channel *
bgp_find_channel(struct bgp_proto *p, u32 afi)
{
struct bgp_channel *c;
- WALK_LIST(c, p->p.channels)
+ BGP_WALK_CHANNELS(p, c)
if (c->afi == afi)
return c;
@@ -586,7 +586,7 @@ bgp_conn_enter_established_state(struct bgp_conn *conn)
/* Summary state of ADD_PATH RX for active channels */
uint summary_add_path_rx = 0;
- WALK_LIST(c, p->p.channels)
+ BGP_WALK_CHANNELS(p, c)
{
const struct bgp_af_caps *loc = bgp_find_af_caps(local, c->afi);
const struct bgp_af_caps *rem = bgp_find_af_caps(peer, c->afi);
@@ -668,7 +668,7 @@ bgp_conn_enter_established_state(struct bgp_conn *conn)
p->channel_count = num;
p->summary_add_path_rx = summary_add_path_rx;
- WALK_LIST(c, p->p.channels)
+ BGP_WALK_CHANNELS(p, c)
{
if (c->c.disabled)
continue;
@@ -747,7 +747,7 @@ bgp_handle_graceful_restart(struct bgp_proto *p)
p->gr_active_num = 0;
struct bgp_channel *c;
- WALK_LIST(c, p->p.channels)
+ BGP_WALK_CHANNELS(p, c)
{
/* FIXME: perhaps check for channel state instead of disabled flag? */
if (c->c.disabled)
@@ -842,7 +842,7 @@ bgp_graceful_restart_timeout(timer *t)
if (p->llgr_ready)
{
struct bgp_channel *c;
- WALK_LIST(c, p->p.channels)
+ BGP_WALK_CHANNELS(p, c)
{
/* Channel is not in GR and is already flushed */
if (!c->gr_active)
@@ -1394,6 +1394,10 @@ bgp_reload_routes(struct channel *C)
struct bgp_proto *p = (void *) C->proto;
struct bgp_channel *c = (void *) C;
+ /* Ignore non-BGP channels */
+ if (C->channel != &channel_bgp)
+ return;
+
ASSERT(p->conn && (p->route_refresh || c->c.in_table));
if (c->c.in_table)
@@ -1408,6 +1412,10 @@ bgp_feed_begin(struct channel *C, int initial)
struct bgp_proto *p = (void *) C->proto;
struct bgp_channel *c = (void *) C;
+ /* Ignore non-BGP channels */
+ if (C->channel != &channel_bgp)
+ return;
+
/* This should not happen */
if (!p->conn)
return;
@@ -1433,6 +1441,10 @@ bgp_feed_end(struct channel *C)
struct bgp_proto *p = (void *) C->proto;
struct bgp_channel *c = (void *) C;
+ /* Ignore non-BGP channels */
+ if (C->channel != &channel_bgp)
+ return;
+
/* This should not happen */
if (!p->conn)
return;
@@ -1547,7 +1559,7 @@ bgp_start(struct proto *P)
if (p->p.gr_recovery && p->cf->gr_mode)
{
struct bgp_channel *c;
- WALK_LIST(c, p->p.channels)
+ BGP_WALK_CHANNELS(p, c)
channel_graceful_restart_lock(&c->c);
}
@@ -1701,7 +1713,7 @@ bgp_init(struct proto_config *CF)
/* Add all channels */
struct bgp_channel_config *cc;
- WALK_LIST(cc, CF->channels)
+ BGP_CF_WALK_CHANNELS(cf, cc)
proto_add_channel(P, &cc->c);
return P;
@@ -1847,7 +1859,7 @@ bgp_find_channel_config(struct bgp_config *cf, u32 afi)
{
struct bgp_channel_config *cc;
- WALK_LIST(cc, cf->c.channels)
+ BGP_CF_WALK_CHANNELS(cf, cc)
if (cc->afi == afi)
return cc;
@@ -1997,7 +2009,7 @@ bgp_postconfig(struct proto_config *CF)
struct bgp_channel_config *cc;
- WALK_LIST(cc, CF->channels)
+ BGP_CF_WALK_CHANNELS(cf, cc)
{
/* Handle undefined import filter */
if (cc->c.in_filter == FILTER_UNDEF)
@@ -2104,20 +2116,16 @@ bgp_reconfigure(struct proto *P, struct proto_config *CF)
WALK_LIST(C, p->p.channels)
C->stale = 1;
- WALK_LIST(cc, new->c.channels)
+ BGP_CF_WALK_CHANNELS(new, cc)
{
C = (struct channel *) bgp_find_channel(p, cc->afi);
same = proto_configure_channel(P, &C, &cc->c) && same;
-
- if (C)
- C->stale = 0;
}
WALK_LIST_DELSAFE(C, C2, p->p.channels)
if (C->stale)
same = proto_configure_channel(P, &C, NULL) && same;
-
if (same && (p->start_state > BSS_PREPARE))
bgp_update_bfd(p, new->bfd);
@@ -2562,6 +2570,9 @@ bgp_show_proto_info(struct proto *P)
{
channel_show_info(&c->c);
+ if (c->c.channel != &channel_bgp)
+ continue;
+
if (p->gr_active_num)
cli_msg(-1006, " Neighbor GR: %s", bgp_gr_states[c->gr_active]);