summaryrefslogtreecommitdiff
path: root/lib/bfd.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2024-12-03 12:08:12 -0500
committerDonald Sharp <sharpd@nvidia.com>2024-12-03 12:08:12 -0500
commit2c6fcbdf84bbf01231e0933c15351901a5a7789e (patch)
treed9a8ab5ccb067a00ca5f1950c6492ff37f873a1e /lib/bfd.c
parentee5a3456d34a756c70ad8856ab7be7bed75ee31c (diff)
lib: Fix session re-establishment
Currently if you have this sequence of events: a) BGP starts b) BGP reads cli that has bfd configuration c) BGP attempts to install bfd configuration but fails because zebra is not connected to yet d) BGP connects to zebra e) BGP receives resend bfd code from bfdd f) BGP was not sending down the unsent data to bfd, never causing the bfd session to be established. So effectively bfd was attempting to install but failed and then when it was asked to replay everything it decided that the bfd information for a particular peer was actually installed and does not need to be resent. Modify the code such that the bfd code now tracks failed installation and allows the resend of data to bfdd. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Diffstat (limited to 'lib/bfd.c')
-rw-r--r--lib/bfd.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/bfd.c b/lib/bfd.c
index 4535fc1233..bc4b1c5b51 100644
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -32,6 +32,8 @@ enum bfd_session_event {
BSE_UNINSTALL,
/** Install the BFD session configuration. */
BSE_INSTALL,
+ /** We should install but it couldn't because of a error talking to zebra */
+ BSE_VALID_FOR_INSTALL,
};
/**
@@ -527,6 +529,10 @@ static void _bfd_sess_send(struct event *t)
vrf_id_to_name(bsp->args.vrf_id), bsp->args.vrf_id,
bsp->lastev == BSE_INSTALL ? "installed"
: "uninstalled");
+
+ bsp->installed = false;
+ if (bsp->lastev == BSE_INSTALL)
+ bsp->lastev = BSE_VALID_FOR_INSTALL;
}
}
@@ -883,7 +889,7 @@ int zclient_bfd_session_replay(ZAPI_CALLBACK_ARGS)
/* Replay all activated peers. */
TAILQ_FOREACH (bsp, &bsglobal.bsplist, entry) {
/* Skip not installed sessions. */
- if (!bsp->installed)
+ if (!bsp->installed && bsp->lastev != BSE_VALID_FOR_INSTALL)
continue;
/* We are reconnecting, so we must send installation. */