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>
This commit is contained in:
Donald Sharp 2024-12-03 12:08:12 -05:00
parent ee5a3456d3
commit 2c6fcbdf84

View File

@ -32,6 +32,8 @@ enum bfd_session_event {
BSE_UNINSTALL, BSE_UNINSTALL,
/** Install the BFD session configuration. */ /** Install the BFD session configuration. */
BSE_INSTALL, 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, vrf_id_to_name(bsp->args.vrf_id), bsp->args.vrf_id,
bsp->lastev == BSE_INSTALL ? "installed" bsp->lastev == BSE_INSTALL ? "installed"
: "uninstalled"); : "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. */ /* Replay all activated peers. */
TAILQ_FOREACH (bsp, &bsglobal.bsplist, entry) { TAILQ_FOREACH (bsp, &bsglobal.bsplist, entry) {
/* Skip not installed sessions. */ /* Skip not installed sessions. */
if (!bsp->installed) if (!bsp->installed && bsp->lastev != BSE_VALID_FOR_INSTALL)
continue; continue;
/* We are reconnecting, so we must send installation. */ /* We are reconnecting, so we must send installation. */