]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Update source address for BFD session
authorDonatas Abraitis <donatas@opensourcerouting.org>
Tue, 12 Nov 2024 11:09:09 +0000 (13:09 +0200)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 12 Feb 2025 21:39:16 +0000 (23:39 +0200)
If BFD is down, we should try to detect the source automatically from the given
interface.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgp_bfd.c

index af6068cb1feb5791fe347787b6d33f1824001075..1fad9f1c0f50152d3e6c198ea29c4a3f1f189eb8 100644 (file)
@@ -26,6 +26,7 @@
 #include "bgpd/bgp_debug.h"
 #include "bgpd/bgp_vty.h"
 #include "bgpd/bgp_packet.h"
+#include "bgpd/bgp_network.h"
 
 DEFINE_MTYPE_STATIC(BGPD, BFD_CONFIG, "BFD configuration data");
 
@@ -158,16 +159,33 @@ void bgp_peer_bfd_update_source(struct peer *p)
                struct in_addr v4;
                struct in6_addr v6;
        } src, dst;
+       struct interface *ifp;
+       union sockunion addr;
 
        /* Nothing to do for groups. */
        if (CHECK_FLAG(p->sflags, PEER_STATUS_GROUP))
                return;
 
        /* Figure out the correct source to use. */
-       if (CHECK_FLAG(p->flags, PEER_FLAG_UPDATE_SOURCE) && p->update_source)
-               source = p->update_source;
-       else
+       if (CHECK_FLAG(p->flags, PEER_FLAG_UPDATE_SOURCE)) {
+               if (p->update_source) {
+                       source = p->update_source;
+               } else if (p->update_if) {
+                       ifp = if_lookup_by_name(p->update_if, p->bgp->vrf_id);
+                       if (ifp) {
+                               sockunion_init(&addr);
+                               if (bgp_update_address(ifp, &p->connection->su, &addr)) {
+                                       if (BGP_DEBUG(bfd, BFD_LIB))
+                                               zlog_debug("%s: can't find the source address for interface %s",
+                                                          __func__, p->update_if);
+                               }
+
+                               source = &addr;
+                       }
+               }
+       } else {
                source = p->su_local;
+       }
 
        /* Update peer's source/destination addresses. */
        bfd_sess_addresses(session, &family, &src.v6, &dst.v6);