]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Simplify capability handling
authorOndrej Zajicek <santiago@crfreenet.org>
Thu, 23 Nov 2023 16:18:04 +0000 (17:18 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Thu, 23 Nov 2023 16:18:04 +0000 (17:18 +0100)
proto/bgp/bgp.c
proto/bgp/packets.c

index f8146bdf7e0e3cdac158535f2e0d1a9fa76977b5..914935b925aa27a1ec1bc1a5da7c984fc1371bbd 100644 (file)
@@ -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;
index b7df5a7adf0fc1fb4b0481d9419fe3c5886d636e..395169a4a2b29cce2ab5e6a4353e322a9b0c6f1d 100644 (file)
@@ -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,