]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Do not start BGP session if BFD profile is in shutdown state
authorDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 12 Jun 2024 05:39:48 +0000 (08:39 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 12 Jun 2024 05:39:48 +0000 (08:39 +0300)
If we do:

```
bfd
 profile foo
  shutdown
```

The session is dropped, but immediately established again because we don't
have a proper check on BFD.

If BFD is administratively shutdown, ignore starting the session.

Fixes: https://github.com/FRRouting/frr/issues/16186
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgpd.c
lib/bfd.c
lib/bfd.h

index 81506f4410b158ffca7709ac24982f85a0cb193b..869d2b455214ffdb6509d993835d8b371c61a549 100644 (file)
@@ -4507,6 +4507,12 @@ bool peer_active(struct peer *peer)
 {
        if (BGP_CONNECTION_SU_UNSPEC(peer->connection))
                return false;
+
+       if (peer->bfd_config) {
+               if (bfd_session_is_down(peer->bfd_config->session))
+                       return false;
+       }
+
        if (peer->afc[AFI_IP][SAFI_UNICAST] || peer->afc[AFI_IP][SAFI_MULTICAST]
            || peer->afc[AFI_IP][SAFI_LABELED_UNICAST]
            || peer->afc[AFI_IP][SAFI_MPLS_VPN] || peer->afc[AFI_IP][SAFI_ENCAP]
index 2222bb95473727f75fe6d1c1eaa293145633364c..4535fc123378b77244697add7bc41c2a878ca52a 100644 (file)
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -1334,3 +1334,9 @@ int bfd_nht_update(const struct prefix *match, const struct zapi_route *route)
 
        return 0;
 }
+
+bool bfd_session_is_down(const struct bfd_session_params *session)
+{
+       return session->bss.state == BSS_DOWN ||
+              session->bss.state == BSS_ADMIN_DOWN;
+}
index bfa5287340f2c05d51b3f24b7c775b1a8864bf23..48929a95642c66e22605cc8d85956c9e796a88a3 100644 (file)
--- a/lib/bfd.h
+++ b/lib/bfd.h
@@ -464,6 +464,8 @@ extern bool bfd_protocol_integration_shutting_down(void);
 extern int bfd_nht_update(const struct prefix *match,
                          const struct zapi_route *route);
 
+extern bool bfd_session_is_down(const struct bfd_session_params *session);
+
 #ifdef __cplusplus
 }
 #endif