diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2023-11-23 17:18:04 +0100 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2023-11-23 17:18:04 +0100 |
commit | b6923f6386b04340d6b2b6a75fbe83c392f207ca (patch) | |
tree | 77299aae78af31a8a95d097516708dfd766a49e0 /proto/bgp/packets.c | |
parent | 31aa62ae6d2e111e87c08b4b27a16ead968f0689 (diff) |
BGP: Simplify capability handling
Diffstat (limited to 'proto/bgp/packets.c')
-rw-r--r-- | proto/bgp/packets.c | 29 |
1 files changed, 24 insertions, 5 deletions
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, |