bgpd: Removed bgp startup timer

With "-K" option (graceful restart option) the startup timer is not
required anymore.

Signed-off-by: Pooja Jagadeesh Doijode <pdoijode@nvidia.com>
This commit is contained in:
Pooja Jagadeesh Doijode 2025-04-17 16:24:12 -07:00
parent c321ff334c
commit 13283b6238
12 changed files with 46 additions and 32 deletions

View file

@ -1433,7 +1433,7 @@ static bool gr_path_select_deferral_applicable(struct bgp *bgp)
* settings and GR is not complete and path selection
* deferral not yet done for this instance
*/
if (!bgp->t_startup && !bgp_in_graceful_restart())
if (!bgp_in_graceful_restart())
return false;
FOREACH_AFI_SAFI_NSF (afi, safi) {
if (!bgp_gr_supported_for_afi_safi(afi, safi))

View file

@ -1603,7 +1603,7 @@ static void bgp_peer_send_gr_capability(struct stream *s, struct peer *peer,
rcapp = stream_get_endp(s);
stream_putc(s, 0);
restart_time = bgp->restart_time;
if (peer->bgp->t_startup || bgp_in_graceful_restart()) {
if (bgp_in_graceful_restart()) {
SET_FLAG(restart_time, GRACEFUL_RESTART_R_BIT);
SET_FLAG(peer->cap, PEER_CAP_GRACEFUL_RESTART_R_BIT_ADV);
}

View file

@ -1325,7 +1325,7 @@ void bgp_capability_send(struct peer *peer, afi_t afi, safi_t safi,
stream_putc(s, 0);
gr_restart_time = peer->bgp->restart_time;
if (peer->bgp->t_startup || bgp_in_graceful_restart()) {
if (bgp_in_graceful_restart()) {
SET_FLAG(gr_restart_time, GRACEFUL_RESTART_R_BIT);
SET_FLAG(peer->cap, PEER_CAP_GRACEFUL_RESTART_R_BIT_ADV);
}
@ -2255,8 +2255,7 @@ static void bgp_update_receive_eor(struct bgp *bgp, struct peer *peer, afi_t afi
/* graceful-restart related processing */
UNSET_FLAG(peer->af_sflags[afi][safi], PEER_STATUS_GR_WAIT_EOR);
if ((bgp->t_startup || bgp_in_graceful_restart()) &&
bgp_gr_supported_for_afi_safi(afi, safi)) {
if (bgp_in_graceful_restart() && bgp_gr_supported_for_afi_safi(afi, safi)) {
struct graceful_restart_info *gr_info;
gr_info = &(bgp->gr_info[afi][safi]);

View file

@ -3663,7 +3663,7 @@ DEFUN (bgp_neighbor_graceful_restart_disable_set,
ret = bgp_neighbor_graceful_restart(peer, PEER_DISABLE_CMD);
if (ret == BGP_GR_SUCCESS) {
if (peer->bgp->t_startup || bgp_in_graceful_restart())
if (bgp_in_graceful_restart())
bgp_peer_gr_flags_update(peer);
VTY_BGP_GR_ROUTER_DETECT(bgp, peer, peer->bgp->peer);

View file

@ -3420,14 +3420,6 @@ int peer_group_bind(struct bgp *bgp, union sockunion *su, struct peer *peer,
return 0;
}
static void bgp_startup_timer_expire(struct event *thread)
{
struct bgp *bgp;
bgp = EVENT_ARG(thread);
bgp->t_startup = NULL;
}
/*
* On shutdown we call the cleanup function which
* does a free of the link list nodes, free up
@ -3606,9 +3598,6 @@ peer_init:
if (name && !bgp->name)
bgp->name = XSTRDUP(MTYPE_BGP_NAME, name);
event_add_timer(bm->master, bgp_startup_timer_expire, bgp,
bgp->restart_time, &bgp->t_startup);
/* printable name we can use in debug messages */
if (inst_type == BGP_INSTANCE_TYPE_DEFAULT && !hidden) {
bgp->name_pretty = XSTRDUP(MTYPE_BGP_NAME, "VRF default");
@ -4145,7 +4134,6 @@ int bgp_delete(struct bgp *bgp)
EVENT_OFF(bgp->t_revalidate[afi][safi]);
EVENT_OFF(bgp->t_condition_check);
EVENT_OFF(bgp->t_startup);
EVENT_OFF(bgp->t_maxmed_onstartup);
EVENT_OFF(bgp->t_update_delay);
EVENT_OFF(bgp->t_establish_wait);

View file

@ -554,9 +554,6 @@ struct bgp {
struct as_confed *confed_peers;
int confed_peers_cnt;
/* start-up timer on only once at the beginning */
struct event *t_startup;
struct event *clearing_end;
uint32_t v_maxmed_onstartup; /* Duration of max-med on start-up */

View file

@ -112,6 +112,7 @@ from lib.common_config import (
start_topology,
kill_router_daemons,
start_router_daemons,
start_router_daemons_gr,
verify_rib,
check_address_types,
write_test_footer,
@ -1034,7 +1035,8 @@ def test_BGP_GR_TC_4_p0(request):
)
logger.info("[Phase 5] : R2 is about to come up now ")
start_router_daemons(tgen, "r2", ["bgpd"])
start_router_daemons_gr(tgen, "r2", ["bgpd"])
logger.info("[Phase 4] : R2 is UP now, so time to collect GR stats ")
@ -1200,15 +1202,16 @@ def test_BGP_GR_TC_5_1_2_p1(request):
tc_name, result
)
#Verify that the Rbit is be set to false
result = verify_r_bit(tgen, topo, addr_type, input_dict, dut="r1", peer="r2")
assert result is True, "Testcase {} : Failed \n Error {}".format(
assert result is not True, "Testcase {} : Failed \n Error {}".format(
tc_name, result
)
logger.info("[Phase 2] : Restart BGPd on router R2. ")
kill_router_daemons(tgen, "r2", ["bgpd"])
start_router_daemons(tgen, "r2", ["bgpd"])
start_router_daemons_gr(tgen, "r2", ["bgpd"])
logger.info("[Phase 4] : R2 is UP now, so time to collect GR stats ")

View file

@ -113,6 +113,7 @@ from lib.common_config import (
start_topology,
kill_router_daemons,
start_router_daemons,
start_router_daemons_gr,
verify_rib,
check_address_types,
write_test_footer,
@ -359,7 +360,7 @@ def test_BGP_GR_TC_8_p1(request):
kill_router_daemons(tgen, "r1", ["bgpd"])
logger.info("[Phase 3] : R1 is about to come up now ")
start_router_daemons(tgen, "r1", ["bgpd"])
start_router_daemons_gr(tgen, "r1", ["bgpd"])
logger.info("[Phase 4] : R2 is UP now, so time to collect GR stats ")

View file

@ -1597,7 +1597,7 @@ def test_BGP_GR_TC_9_p1(request):
assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result)
result = verify_r_bit(tgen, topo, addr_type, input_dict, dut="r1", peer="r2")
assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result)
assert result is not True, "Testcase {} :Failed \n Error {}".format(tc_name, result)
result = verify_f_bit(
tgen, topo, addr_type, input_dict, dut="r1", peer="r2", expected=False

View file

@ -109,6 +109,7 @@ from lib.common_config import (
start_topology,
kill_router_daemons,
start_router_daemons,
start_router_daemons_gr,
verify_rib,
check_address_types,
write_test_footer,
@ -546,12 +547,12 @@ def test_BGP_GR_chaos_28_p1(request):
logger.info("[Step 3] : Start BGPd daemon on R1..")
# Start BGPd daemon on R1
start_router_daemons(tgen, "r1", ["bgpd"])
start_router_daemons_gr(tgen, "r1", ["bgpd"])
logger.info("[Step 4] : Start BGPd daemon on R3..")
# Start BGPd daemon on R3
start_router_daemons(tgen, "r3", ["bgpd"])
start_router_daemons_gr(tgen, "r3", ["bgpd"])
# Verify r_bit
for addr_type in ADDR_TYPES:

View file

@ -108,11 +108,13 @@ from lib.common_config import (
start_topology,
kill_router_daemons,
start_router_daemons,
start_router_daemons_gr,
verify_rib,
check_address_types,
write_test_footer,
check_router_status,
get_frr_ipv6_linklocal,
run_frr_cmd,
required_linux_kernel_version,
)
@ -722,10 +724,9 @@ def test_BGP_GR_chaos_37_p1(request):
logger.info("[Step 4] : Start BGPd daemon on R1..")
# Start BGPd daemon on R1
start_router_daemons(tgen, "r1", ["bgpd"])
start_router_daemons_gr(tgen, "r1", ["bgpd"])
logger.info("[Step 5] : Kill BGPd daemon on R3..")
# Kill BGPd daemon on R3
kill_router_daemons(tgen, "r3", ["bgpd"])
@ -738,7 +739,10 @@ def test_BGP_GR_chaos_37_p1(request):
logger.info("[Step 6] : Start BGPd daemon on R3..")
# Start BGPd daemon on R3
start_router_daemons(tgen, "r3", ["bgpd"])
start_router_daemons_gr(tgen, "r3", ["bgpd"])
#Wait for session to come up
sleep(120)
for addr_type in ADDR_TYPES:
# Verify r_bit
@ -910,7 +914,10 @@ def test_BGP_GR_chaos_30_p1(request):
logger.info("[Step 4] : Start BGPd daemon on R1..")
# Start BGPd daemon on R1
start_router_daemons(tgen, "r1", ["bgpd"])
start_router_daemons_gr(tgen, "r1", ["bgpd"])
# Wait for select-deferral-timer to expire/EORs to be received
sleep(360)
for addr_type in ADDR_TYPES:
# Verifying BGP RIB routes before shutting down BGPd daemon

View file

@ -430,6 +430,24 @@ def start_router_daemons(tgen, router, daemons):
return res
def start_router_daemons_gr(tgen, router, daemons):
"""
Set -K option in daemons file before starting
the daemon so that it can start in GR restarter mode.
Currently supported for bgpd and zebra only.
Remove -K option from daemons file once started
"""
#Adds extra parameters to daemons file for graceful restart
for daemon in daemons:
tgen.net[router].daemons_options[daemon] = "-K"
# Start daemon
start_router_daemons(tgen, router, daemons)
# Remove graceful restart option
for daemon in daemons:
tgen.net[router].daemons_options[daemon] = ""
def check_router_status(tgen):
"""
Check if all daemons are running for all routers in topology