]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Allow bfd to work if peer known but interface address not yet 17473/head
authorDonald Sharp <sharpd@nvidia.com>
Wed, 20 Nov 2024 21:07:34 +0000 (16:07 -0500)
committerDonald Sharp <sharpd@nvidia.com>
Wed, 20 Nov 2024 21:13:42 +0000 (16:13 -0500)
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 a331585d32919aa794752d766e08a962739d902f..50b00d21b195f3e485a11cc1a3fd361e75d7d3d5 100644 (file)
@@ -151,7 +151,7 @@ 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;
+       struct bfd_session_params *session;
        const union sockunion *source = NULL;
        bool changed = false;
        int family;
@@ -162,6 +162,10 @@ void bgp_peer_bfd_update_source(struct peer *p)
        struct interface *ifp;
        union sockunion addr;
 
+       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 357d5292dabb9cce5f29b1bd1fc9c90793fc985f..bf0f3b15cfde6e20799179b6350625f75373887a 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)