]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: update BFD config on update-source change 9990/head
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:26 +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 4995f9a1fd8bc4c3e73cba8d0f7851af8415d003..f23e6b2e9be9dbcb4bd18a5b3fe8033384506a88 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 82f59150cbbcb8ae31542327250d69c3c940adfe..0416186171b320aeec411277c48ef9f416854005 100644 (file)
@@ -4875,6 +4875,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;
        }
@@ -4908,6 +4912,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;
@@ -4938,6 +4946,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;
        }
@@ -4970,6 +4982,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;
@@ -5007,6 +5023,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;
        }
@@ -5038,6 +5058,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;