From 3c7ef0a9c75d3ab2fc4395be31f06b87c1d719eb Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Sat, 26 Aug 2023 20:56:20 -0400 Subject: [PATCH] bgpd: make bgp_timer_set use a peer_connection instead The bgp_timer_set function should use a peer_connection pointer instead. Signed-off-by: Donald Sharp --- bgpd/bgp_fsm.c | 101 ++++++++++++++++++++++------------------------ bgpd/bgp_fsm.h | 2 +- bgpd/bgp_packet.c | 2 +- bgpd/bgpd.c | 12 +++--- 4 files changed, 57 insertions(+), 60 deletions(-) diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index 781c8aa1e2..c6e6f08d74 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -346,90 +346,90 @@ static struct peer *peer_xfer_conn(struct peer *from_peer) /* Hook function called after bgp event is occered. And vty's neighbor command invoke this function after making neighbor structure. */ -void bgp_timer_set(struct peer *peer) +void bgp_timer_set(struct peer_connection *connection) { afi_t afi; safi_t safi; + struct peer *peer = connection->peer; - switch (peer->connection->status) { + switch (connection->status) { case Idle: /* First entry point of peer's finite state machine. In Idle status start timer is on unless peer is shutdown or peer is inactive. All other timer must be turned off */ if (BGP_PEER_START_SUPPRESSED(peer) || !peer_active(peer) || peer->bgp->vrf_id == VRF_UNKNOWN) { - EVENT_OFF(peer->connection->t_start); + EVENT_OFF(connection->t_start); } else { - BGP_TIMER_ON(peer->connection->t_start, bgp_start_timer, + BGP_TIMER_ON(connection->t_start, bgp_start_timer, peer->v_start); } - EVENT_OFF(peer->connection->t_connect); - EVENT_OFF(peer->connection->t_holdtime); + EVENT_OFF(connection->t_connect); + EVENT_OFF(connection->t_holdtime); bgp_keepalives_off(peer); - EVENT_OFF(peer->connection->t_routeadv); - EVENT_OFF(peer->connection->t_delayopen); + EVENT_OFF(connection->t_routeadv); + EVENT_OFF(connection->t_delayopen); break; case Connect: /* After start timer is expired, the peer moves to Connect status. Make sure start timer is off and connect timer is on. */ - EVENT_OFF(peer->connection->t_start); + EVENT_OFF(connection->t_start); if (CHECK_FLAG(peer->flags, PEER_FLAG_TIMER_DELAYOPEN)) - BGP_TIMER_ON(peer->connection->t_connect, - bgp_connect_timer, + BGP_TIMER_ON(connection->t_connect, bgp_connect_timer, (peer->v_delayopen + peer->v_connect)); else - BGP_TIMER_ON(peer->connection->t_connect, - bgp_connect_timer, peer->v_connect); + BGP_TIMER_ON(connection->t_connect, bgp_connect_timer, + peer->v_connect); - EVENT_OFF(peer->connection->t_holdtime); + EVENT_OFF(connection->t_holdtime); bgp_keepalives_off(peer); - EVENT_OFF(peer->connection->t_routeadv); + EVENT_OFF(connection->t_routeadv); break; case Active: /* Active is waiting connection from remote peer. And if connect timer is expired, change status to Connect. */ - EVENT_OFF(peer->connection->t_start); + EVENT_OFF(connection->t_start); /* If peer is passive mode, do not set connect timer. */ if (CHECK_FLAG(peer->flags, PEER_FLAG_PASSIVE) || CHECK_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT)) { - EVENT_OFF(peer->connection->t_connect); + EVENT_OFF(connection->t_connect); } else { if (CHECK_FLAG(peer->flags, PEER_FLAG_TIMER_DELAYOPEN)) - BGP_TIMER_ON(peer->connection->t_connect, + BGP_TIMER_ON(connection->t_connect, bgp_connect_timer, (peer->v_delayopen + peer->v_connect)); else - BGP_TIMER_ON(peer->connection->t_connect, + BGP_TIMER_ON(connection->t_connect, bgp_connect_timer, peer->v_connect); } - EVENT_OFF(peer->connection->t_holdtime); + EVENT_OFF(connection->t_holdtime); bgp_keepalives_off(peer); - EVENT_OFF(peer->connection->t_routeadv); + EVENT_OFF(connection->t_routeadv); break; case OpenSent: /* OpenSent status. */ - EVENT_OFF(peer->connection->t_start); - EVENT_OFF(peer->connection->t_connect); + EVENT_OFF(connection->t_start); + EVENT_OFF(connection->t_connect); if (peer->v_holdtime != 0) { - BGP_TIMER_ON(peer->connection->t_holdtime, - bgp_holdtime_timer, peer->v_holdtime); + BGP_TIMER_ON(connection->t_holdtime, bgp_holdtime_timer, + peer->v_holdtime); } else { - EVENT_OFF(peer->connection->t_holdtime); + EVENT_OFF(connection->t_holdtime); } bgp_keepalives_off(peer); - EVENT_OFF(peer->connection->t_routeadv); - EVENT_OFF(peer->connection->t_delayopen); + EVENT_OFF(connection->t_routeadv); + EVENT_OFF(connection->t_delayopen); break; case OpenConfirm: /* OpenConfirm status. */ - EVENT_OFF(peer->connection->t_start); - EVENT_OFF(peer->connection->t_connect); + EVENT_OFF(connection->t_start); + EVENT_OFF(connection->t_connect); /* * If the negotiated Hold Time value is zero, then the Hold Time @@ -437,24 +437,24 @@ void bgp_timer_set(struct peer *peer) * Additionally if a different hold timer has been negotiated * than we must stop then start the timer again */ - EVENT_OFF(peer->connection->t_holdtime); + EVENT_OFF(connection->t_holdtime); if (peer->v_holdtime == 0) bgp_keepalives_off(peer); else { - BGP_TIMER_ON(peer->connection->t_holdtime, - bgp_holdtime_timer, peer->v_holdtime); + BGP_TIMER_ON(connection->t_holdtime, bgp_holdtime_timer, + peer->v_holdtime); bgp_keepalives_on(peer); } - EVENT_OFF(peer->connection->t_routeadv); - EVENT_OFF(peer->connection->t_delayopen); + EVENT_OFF(connection->t_routeadv); + EVENT_OFF(connection->t_delayopen); break; case Established: /* In Established status start and connect timer is turned off. */ - EVENT_OFF(peer->connection->t_start); - EVENT_OFF(peer->connection->t_connect); - EVENT_OFF(peer->connection->t_delayopen); + EVENT_OFF(connection->t_start); + EVENT_OFF(connection->t_connect); + EVENT_OFF(connection->t_delayopen); /* * Same as OpenConfirm, if holdtime is zero then both holdtime @@ -462,12 +462,12 @@ void bgp_timer_set(struct peer *peer) * Additionally if a different hold timer has been negotiated * then we must stop then start the timer again */ - EVENT_OFF(peer->connection->t_holdtime); + EVENT_OFF(connection->t_holdtime); if (peer->v_holdtime == 0) bgp_keepalives_off(peer); else { - BGP_TIMER_ON(peer->connection->t_holdtime, - bgp_holdtime_timer, peer->v_holdtime); + BGP_TIMER_ON(connection->t_holdtime, bgp_holdtime_timer, + peer->v_holdtime); bgp_keepalives_on(peer); } break; @@ -482,12 +482,12 @@ void bgp_timer_set(struct peer *peer) EVENT_OFF(peer->t_refresh_stalepath); /* fallthru */ case Clearing: - EVENT_OFF(peer->connection->t_start); - EVENT_OFF(peer->connection->t_connect); - EVENT_OFF(peer->connection->t_holdtime); + EVENT_OFF(connection->t_start); + EVENT_OFF(connection->t_connect); + EVENT_OFF(connection->t_holdtime); bgp_keepalives_off(peer); - EVENT_OFF(peer->connection->t_routeadv); - EVENT_OFF(peer->connection->t_delayopen); + EVENT_OFF(connection->t_routeadv); + EVENT_OFF(connection->t_delayopen); break; case BGP_STATUS_MAX: flog_err(EC_LIB_DEVELOPMENT, @@ -661,7 +661,7 @@ static void bgp_graceful_restart_timer_off(struct peer *peer) peer_delete(peer); } - bgp_timer_set(peer); + bgp_timer_set(peer->connection); } static void bgp_llgr_stale_timer_expire(struct event *thread) @@ -2637,12 +2637,10 @@ int bgp_event_update(struct peer *peer, enum bgp_fsm_events event) enum bgp_fsm_status next; enum bgp_fsm_state_progress ret = 0; int fsm_result = FSM_PEER_NOOP; - struct peer *other; int passive_conn = 0; int dyn_nbr; struct peer_connection *connection = peer->connection; - other = peer->doppelganger; passive_conn = (CHECK_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER)) ? 1 : 0; dyn_nbr = peer_dynamic_neighbor(peer); @@ -2675,7 +2673,6 @@ int bgp_event_update(struct peer *peer, enum bgp_fsm_events event) bgp_establish. Update the peer pointer accordingly */ fsm_result = FSM_PEER_TRANSFERRED; - peer = other; } /* If status is changed. */ @@ -2694,7 +2691,7 @@ int bgp_event_update(struct peer *peer, enum bgp_fsm_events event) } /* Make sure timer is set. */ - bgp_timer_set(peer); + bgp_timer_set(connection); break; case BGP_FSM_FAILURE: /* @@ -2717,7 +2714,7 @@ int bgp_event_update(struct peer *peer, enum bgp_fsm_events event) peer_down_str[peer->last_reset]); bgp_stop(connection); bgp_fsm_change_status(peer, Idle); - bgp_timer_set(peer); + bgp_timer_set(connection); } fsm_result = FSM_PEER_STOPPED; break; diff --git a/bgpd/bgp_fsm.h b/bgpd/bgp_fsm.h index 0a36e0009e..0e2fbb2921 100644 --- a/bgpd/bgp_fsm.h +++ b/bgpd/bgp_fsm.h @@ -109,7 +109,7 @@ extern void bgp_fsm_nht_update(struct peer *peer, bool has_valid_nexthops); extern void bgp_event(struct event *event); extern int bgp_event_update(struct peer *, enum bgp_fsm_events event); extern enum bgp_fsm_state_progress bgp_stop(struct peer_connection *connection); -extern void bgp_timer_set(struct peer *); +extern void bgp_timer_set(struct peer_connection *connection); extern void bgp_routeadv_timer(struct event *event); extern void bgp_fsm_change_status(struct peer *peer, enum bgp_fsm_status status); diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index e90593356e..00715baf13 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -1952,7 +1952,7 @@ static void bgp_refresh_stalepath_timer_expire(struct event *thread) "%pBP route-refresh (BoRR) timer expired for afi/safi: %d/%d", peer, afi, safi); - bgp_timer_set(peer); + bgp_timer_set(peer->connection); } /** diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 1e18b1602c..ec66c5c405 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -1205,7 +1205,7 @@ static void peer_free(struct peer *peer) /* this /ought/ to have been done already through bgp_stop earlier, * but just to be sure.. */ - bgp_timer_set(peer); + bgp_timer_set(peer->connection); bgp_reads_off(peer->connection); bgp_writes_off(peer->connection); event_cancel_event_ready(bm->master, peer); @@ -1920,7 +1920,7 @@ struct peer *peer_create(union sockunion *su, const char *conf_if, peer_flag_set(peer, PEER_FLAG_SHUTDOWN); /* Set up peer's events and timers. */ else if (!active && peer_active(peer)) - bgp_timer_set(peer); + bgp_timer_set(peer->connection); bgp_peer_gr_flags_update(peer); BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp, bgp->peer); @@ -2322,7 +2322,7 @@ static int peer_activate_af(struct peer *peer, afi_t afi, safi_t safi) peer_group2peer_config_copy_af(peer->group, peer, afi, safi); if (!active && peer_active(peer)) { - bgp_timer_set(peer); + bgp_timer_set(peer->connection); } else { if (peer_established(peer)) { if (CHECK_FLAG(peer->cap, PEER_CAP_DYNAMIC_RCV)) { @@ -2652,7 +2652,7 @@ int peer_delete(struct peer *peer) bgp_md5_unset(peer); } - bgp_timer_set(peer); /* stops all timers for Deleted */ + bgp_timer_set(peer->connection); /* stops all timers for Deleted */ /* Delete from all peer list. */ if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP) @@ -3242,7 +3242,7 @@ int peer_group_bind(struct bgp *bgp, union sockunion *su, struct peer *peer, /* Set up peer's events and timers. */ if (peer_active(peer)) - bgp_timer_set(peer); + bgp_timer_set(peer->connection); } return 0; @@ -4731,7 +4731,7 @@ void bgp_shutdown_disable(struct bgp *bgp) UNSET_FLAG(bgp->flags, BGP_FLAG_SHUTDOWN); for (ALL_LIST_ELEMENTS_RO(bgp->peer, node, peer)) - bgp_timer_set(peer); + bgp_timer_set(peer->connection); } /* Change specified peer flag. */ -- 2.39.5