]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: update BFD config on update-source change
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Wed, 3 Nov 2021 11:43:17 +0000 (08:43 -0300)
committermergify-bot <noreply@mergify.io>
Sat, 6 Nov 2021 15:09:11 +0000 (15:09 +0000)
Update BFD sessions when the update-source configuration is set so the
session follows the new configured source address.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
(cherry picked from commit 7196f56eb3d3866ccafee095c8be66f058d99abf)

bgpd/bgp_bfd.c
bgpd/bgpd.c

index d32a5d556e7dab69e374664de1261cff05f58055..b988a6f0f628a325968b5db4c8e799e396923f80 100644 (file)
@@ -150,6 +150,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;
+       const union sockunion *source;
        bool changed = false;
        int family;
        union {
@@ -161,44 +162,45 @@ void bgp_peer_bfd_update_source(struct peer *p)
        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))
+               source = p->update_source;
+       else
+               source = p->su_local;
+
        /* Update peer's source/destination addresses. */
        bfd_sess_addresses(session, &family, &src.v6, &dst.v6);
        if (family == AF_INET) {
-               if ((p->su_local
-                    && p->su_local->sin.sin_addr.s_addr != src.v4.s_addr)
+               if ((source && source->sin.sin_addr.s_addr != src.v4.s_addr)
                    || p->su.sin.sin_addr.s_addr != dst.v4.s_addr) {
                        if (BGP_DEBUG(bfd, BFD_LIB))
                                zlog_debug(
                                        "%s: address [%pI4->%pI4] to [%pI4->%pI4]",
                                        __func__, &src.v4, &dst.v4,
-                                       p->su_local ? &p->su_local->sin.sin_addr
-                                                   : &src.v4,
+                                       source ? &source->sin.sin_addr
+                                              : &src.v4,
                                        &p->su.sin.sin_addr);
 
                        bfd_sess_set_ipv4_addrs(
-                               session,
-                               p->su_local ? &p->su_local->sin.sin_addr : NULL,
+                               session, source ? &source->sin.sin_addr : NULL,
                                &p->su.sin.sin_addr);
                        changed = true;
                }
        } else {
-               if ((p->su_local
-                    && memcmp(&p->su_local->sin6, &src.v6, sizeof(src.v6)))
+               if ((source && memcmp(&source->sin6, &src.v6, sizeof(src.v6)))
                    || memcmp(&p->su.sin6, &dst.v6, sizeof(dst.v6))) {
                        if (BGP_DEBUG(bfd, BFD_LIB))
                                zlog_debug(
                                        "%s: address [%pI6->%pI6] to [%pI6->%pI6]",
                                        __func__, &src.v6, &dst.v6,
-                                       p->su_local
-                                               ? &p->su_local->sin6.sin6_addr
-                                               : &src.v6,
+                                       source ? &source->sin6.sin6_addr
+                                              : &src.v6,
                                        &p->su.sin6.sin6_addr);
 
-                       bfd_sess_set_ipv6_addrs(
-                               session,
-                               p->su_local ? &p->su_local->sin6.sin6_addr
-                                           : NULL,
-                               &p->su.sin6.sin6_addr);
+                       bfd_sess_set_ipv6_addrs(session,
+                                               source ? &source->sin6.sin6_addr
+                                                      : NULL,
+                                               &p->su.sin6.sin6_addr);
                        changed = true;
                }
        }
index 362f1ee01557b3c0c612e5193465d81725855e95..178cf89bec7256d108099acd78d5db3201cbb8da 100644 (file)
@@ -4858,6 +4858,10 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)
                } else
                        bgp_session_reset(peer);
 
+               /* Apply new source configuration to BFD session. */
+               if (peer->bfd_config)
+                       bgp_peer_bfd_update_source(peer);
+
                /* Skip peer-group mechanics for regular peers. */
                return 0;
        }
@@ -4891,6 +4895,10 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
                } else
                        bgp_session_reset(member);
+
+               /* Apply new source configuration to BFD session. */
+               if (member->bfd_config)
+                       bgp_peer_bfd_update_source(member);
        }
 
        return 0;
@@ -4921,6 +4929,10 @@ int peer_update_source_addr_set(struct peer *peer, const union sockunion *su)
                } else
                        bgp_session_reset(peer);
 
+               /* Apply new source configuration to BFD session. */
+               if (peer->bfd_config)
+                       bgp_peer_bfd_update_source(peer);
+
                /* Skip peer-group mechanics for regular peers. */
                return 0;
        }
@@ -4953,6 +4965,10 @@ int peer_update_source_addr_set(struct peer *peer, const union sockunion *su)
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
                } else
                        bgp_session_reset(member);
+
+               /* Apply new source configuration to BFD session. */
+               if (member->bfd_config)
+                       bgp_peer_bfd_update_source(member);
        }
 
        return 0;
@@ -4990,6 +5006,10 @@ int peer_update_source_unset(struct peer *peer)
                } else
                        bgp_session_reset(peer);
 
+               /* Apply new source configuration to BFD session. */
+               if (peer->bfd_config)
+                       bgp_peer_bfd_update_source(peer);
+
                /* Skip peer-group mechanics for regular peers. */
                return 0;
        }
@@ -5021,6 +5041,10 @@ int peer_update_source_unset(struct peer *peer)
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
                } else
                        bgp_session_reset(member);
+
+               /* Apply new source configuration to BFD session. */
+               if (member->bfd_config)
+                       bgp_peer_bfd_update_source(member);
        }
 
        return 0;