diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index f8146bdf..914935b9 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -546,9 +546,6 @@ bgp_conn_enter_openconfirm_state(struct bgp_conn *conn) bgp_conn_set_state(conn, BS_OPENCONFIRM); } -static const struct bgp_af_caps dummy_af_caps = { }; -static const struct bgp_af_caps basic_af_caps = { .ready = 1 }; - void bgp_conn_enter_established_state(struct bgp_conn *conn) { @@ -604,20 +601,6 @@ bgp_conn_enter_established_state(struct bgp_conn *conn) 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); - /* Use default if capabilities were not announced */ - if (!local->length && (c->afi == BGP_AF_IPV4)) - loc = &basic_af_caps; - - if (!peer->length && (c->afi == BGP_AF_IPV4)) - rem = &basic_af_caps; - - /* Ignore AFIs that were not announced in multiprotocol capability */ - if (!loc || !loc->ready) - loc = &dummy_af_caps; - - if (!rem || !rem->ready) - rem = &dummy_af_caps; - int active = loc->ready && rem->ready; c->c.disabled = !active; c->c.reloadable = p->route_refresh || c->cf->import_table; diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c index b7df5a7a..395169a4 100644 --- a/proto/bgp/packets.c +++ b/proto/bgp/packets.c @@ -173,8 +173,11 @@ bgp_create_notification(struct bgp_conn *conn, byte *buf) /* Capability negotiation as per RFC 5492 */ -const struct bgp_af_caps * -bgp_find_af_caps(struct bgp_caps *caps, u32 afi) +static const struct bgp_af_caps dummy_af_caps = { }; +static const struct bgp_af_caps basic_af_caps = { .ready = 1 }; + +static const struct bgp_af_caps * +bgp_find_af_caps_(struct bgp_caps *caps, u32 afi) { struct bgp_af_caps *ac; @@ -185,6 +188,23 @@ bgp_find_af_caps(struct bgp_caps *caps, u32 afi) return NULL; } +const struct bgp_af_caps * +bgp_find_af_caps(struct bgp_caps *caps, u32 afi) +{ + const struct bgp_af_caps *ac = bgp_find_af_caps_(caps, afi); + + /* Return proper capability if found */ + if (ac) + return ac; + + /* Use default if capabilities were not announced */ + if (!caps->length && (afi == BGP_AF_IPV4)) + return &basic_af_caps; + + /* Ignore AFIs that were not announced in multiprotocol capability */ + return &dummy_af_caps; +} + static struct bgp_af_caps * bgp_get_af_caps(struct bgp_caps **pcaps, u32 afi) { @@ -692,8 +712,7 @@ bgp_check_capabilities(struct bgp_conn *conn) const struct bgp_af_caps *rem = bgp_find_af_caps(remote, c->afi); /* Find out whether this channel will be active */ - int active = loc && loc->ready && - ((rem && rem->ready) || (!remote->length && (c->afi == BGP_AF_IPV4))); + int active = loc->ready && rem->ready; /* Mandatory must be active */ if (c->cf->mandatory && !active) @@ -2440,7 +2459,7 @@ bgp_create_update_bmp(struct bgp_channel *c, byte *buf, struct bgp_bucket *buck, .proto = p, .channel = c, .pool = tmp_linpool, - .mp_reach = (c->afi != BGP_AF_IPV4) || (rem && rem->ext_next_hop), + .mp_reach = (c->afi != BGP_AF_IPV4) || rem->ext_next_hop, .as4_session = 1, .add_path = c->add_path_rx, .mpls = c->desc->mpls,