]> git.puffer.fish Git - mirror/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>
Tue, 12 Nov 2024 11:09:09 +0000 (13:09 +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 14ff5f2e11514f519e520530d7189e36ef6c8a3e..2edc840fbf156e6f18199d429e7bcbdeab814a98 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");
 
@@ -142,23 +143,40 @@ 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;
+       const union sockunion *source = NULL;
        bool changed = false;
        int family;
        union {
                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);