summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoranlan_cs <vic.lan@pica8.com>2022-04-22 02:38:33 -0400
committeranlan_cs <vic.lan@pica8.com>2022-04-24 05:23:40 -0400
commit6ca42634545a0412256c7da9941671e30db66d38 (patch)
tree652ecf4f8771fb847df5c2cb33bca7dec56af40d
parent60d296518b48c75ab4d21ed696e970b8d987a5ac (diff)
bfdd: fix broken FSM in active mode
With the simple BFD configuration - (active mode, single hop, without other parameters) ``` ! bfd peer 11.11.11.11 exit ! ``` The interface with 11.11.11.0/24 is a *virtual* interface, which can be deleted. After BFD FSM is created and session is ok, do these things: 1) delete this interface 2) create this interface 3) set same ip address in this interface Now, everything seems completely restored because all configuration is same. But bad thing happens, BFD session hang on "down" status - ``` root# show bfd peer 11.11.11.11 BFD Peer: peer 11.11.11.11 vrf default ID: 638815827 Remote ID: 0 Active mode Status: down Downtime: 3 second(s) Diagnostics: path down <- caused by destroyed interface Remote diagnostics: ok ``` With the interface creating, `bfdd_sessions_enable_interface()` wrongly compares added interface with the created, even key of this `bfd_session` isn't binded with any interface. So this `bfd_session` will hang on "down" status for ever. So skip the compare in this case (no interface in key) to wake up this `bfd_session`. Signed-off-by: anlan_cs <vic.lan@pica8.com>
-rw-r--r--bfdd/ptm_adapter.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/bfdd/ptm_adapter.c b/bfdd/ptm_adapter.c
index 0e5f701fc2..f6259b9c3b 100644
--- a/bfdd/ptm_adapter.c
+++ b/bfdd/ptm_adapter.c
@@ -678,7 +678,8 @@ static void bfdd_sessions_enable_interface(struct interface *ifp)
/* If Interface matches vrfname, then bypass iface check */
if (vrf_is_backend_netns() || strcmp(ifp->name, vrf->name)) {
/* Interface name mismatch. */
- if (strcmp(ifp->name, bs->key.ifname))
+ if (bs->key.ifname[0] &&
+ strcmp(ifp->name, bs->key.ifname))
continue;
}