From: Donatas Abraitis Date: Tue, 12 Nov 2024 11:09:09 +0000 (+0200) Subject: bgpd: Update source address for BFD session X-Git-Tag: docker/10.1.3~17^2~3 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=a681fa69b893d38cf8a2e28d7fc4f1b7c1ba442d;p=matthieu%2Ffrr.git bgpd: Update source address for BFD session If BFD is down, we should try to detect the source automatically from the given interface. Signed-off-by: Donatas Abraitis --- diff --git a/bgpd/bgp_bfd.c b/bgpd/bgp_bfd.c index af6068cb1f..1fad9f1c0f 100644 --- a/bgpd/bgp_bfd.c +++ b/bgpd/bgp_bfd.c @@ -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);