]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Allow bfd to work if peer known but interface address not yet
authorDonald Sharp <sharpd@nvidia.com>
Wed, 20 Nov 2024 21:07:34 +0000 (16:07 -0500)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Mon, 10 Feb 2025 07:42:21 +0000 (09:42 +0200)
If bgp is coming up and bgp has not received the interface address yet
but bgp has knowledge about a bfd peering, allow it to set the peering
data appropriately.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
bgpd/bgp_bfd.c
bgpd/bgp_nexthop.c

index 240b310696af75311879d9b3018d272ec41bf23a..82dd0b593eaeb9182cc3ab93776f4eaeabab9e9c 100644 (file)
@@ -145,8 +145,8 @@ void bgp_peer_config_apply(struct peer *p, struct peer_group *pg)
 
 void bgp_peer_bfd_update_source(struct peer *p)
 {
-       struct bfd_session_params *session = p->bfd_config->session;
-       const union sockunion *source;
+       struct bfd_session_params *session;
+       const union sockunion *source = NULL;
        bool changed = false;
        int family;
        union {
@@ -154,6 +154,10 @@ void bgp_peer_bfd_update_source(struct peer *p)
                struct in6_addr v6;
        } src, dst;
 
+       if (!p->bfd_config)
+               return;
+
+       session = p->bfd_config->session;
        /* Nothing to do for groups. */
        if (CHECK_FLAG(p->sflags, PEER_STATUS_GROUP))
                return;
index ba6d70710917dfb8fa97463f16b7a01e821df3ce..68a1b858062347eaa83368b579e91de412489b5b 100644 (file)
@@ -32,6 +32,7 @@
 #include "bgpd/bgp_vty.h"
 #include "bgpd/bgp_rd.h"
 #include "bgpd/bgp_mplsvpn.h"
+#include "bgpd/bgp_bfd.h"
 
 DEFINE_MTYPE_STATIC(BGPD, MARTIAN_STRING, "BGP Martian Addr Intf String");
 
@@ -409,17 +410,6 @@ void bgp_connected_add(struct bgp *bgp, struct connected *ifc)
                        bgp_dest_set_bgp_connected_ref_info(dest, bc);
                }
 
-               for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
-                       if (peer->conf_if &&
-                           (strcmp(peer->conf_if, ifc->ifp->name) == 0) &&
-                           !peer_established(peer->connection) &&
-                           !CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY)) {
-                               connection = peer->connection;
-                               if (peer_active(peer))
-                                       BGP_EVENT_ADD(connection, BGP_Stop);
-                               BGP_EVENT_ADD(connection, BGP_Start);
-                       }
-               }
        } else if (addr->family == AF_INET6) {
                apply_mask_ipv6((struct prefix_ipv6 *)&p);
 
@@ -443,6 +433,22 @@ void bgp_connected_add(struct bgp *bgp, struct connected *ifc)
                        bgp_dest_set_bgp_connected_ref_info(dest, bc);
                }
        }
+
+       /*
+        * Iterate over all the peers and attempt to set the bfd session
+        * data and if it's a bgp unnumbered get her flowing if necessary
+        */
+       for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
+               bgp_peer_bfd_update_source(peer);
+               if (peer->conf_if && (strcmp(peer->conf_if, ifc->ifp->name) == 0) &&
+                   !peer_established(peer->connection) &&
+                   !CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY)) {
+                       connection = peer->connection;
+                       if (peer_active(peer))
+                               BGP_EVENT_ADD(connection, BGP_Stop);
+                       BGP_EVENT_ADD(connection, BGP_Start);
+               }
+       }
 }
 
 void bgp_connected_delete(struct bgp *bgp, struct connected *ifc)