From d1e7215da064eab02be7c1874cab27a6b7d0cacf Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Sat, 26 Aug 2023 21:34:59 -0400 Subject: [PATCH] bgpd: make bgp_keepalives_on|off connection oriented The bgp_keepalives_on|off functions should use a peer_connection as a basis for it's operation. Signed-off-by: Donald Sharp --- bgpd/bgp_fsm.c | 24 ++++++++++++------------ bgpd/bgp_keepalives.c | 8 ++++++-- bgpd/bgp_keepalives.h | 4 ++-- bgpd/bgpd.c | 2 +- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index b8e6cf6caa..a730f97450 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -157,7 +157,7 @@ static struct peer *peer_xfer_conn(struct peer *from_peer) * fd is set to -1. If blocked on lock then keepalive * thread can access peer pointer with fd -1. */ - bgp_keepalives_off(from_peer); + bgp_keepalives_off(from_peer->connection); EVENT_OFF(peer->connection->t_routeadv); EVENT_OFF(peer->connection->t_connect); @@ -366,7 +366,7 @@ void bgp_timer_set(struct peer_connection *connection) } EVENT_OFF(connection->t_connect); EVENT_OFF(connection->t_holdtime); - bgp_keepalives_off(peer); + bgp_keepalives_off(connection); EVENT_OFF(connection->t_routeadv); EVENT_OFF(connection->t_delayopen); break; @@ -384,7 +384,7 @@ void bgp_timer_set(struct peer_connection *connection) peer->v_connect); EVENT_OFF(connection->t_holdtime); - bgp_keepalives_off(peer); + bgp_keepalives_off(connection); EVENT_OFF(connection->t_routeadv); break; @@ -407,7 +407,7 @@ void bgp_timer_set(struct peer_connection *connection) bgp_connect_timer, peer->v_connect); } EVENT_OFF(connection->t_holdtime); - bgp_keepalives_off(peer); + bgp_keepalives_off(connection); EVENT_OFF(connection->t_routeadv); break; @@ -421,7 +421,7 @@ void bgp_timer_set(struct peer_connection *connection) } else { EVENT_OFF(connection->t_holdtime); } - bgp_keepalives_off(peer); + bgp_keepalives_off(connection); EVENT_OFF(connection->t_routeadv); EVENT_OFF(connection->t_delayopen); break; @@ -439,11 +439,11 @@ void bgp_timer_set(struct peer_connection *connection) */ EVENT_OFF(connection->t_holdtime); if (peer->v_holdtime == 0) - bgp_keepalives_off(peer); + bgp_keepalives_off(connection); else { BGP_TIMER_ON(connection->t_holdtime, bgp_holdtime_timer, peer->v_holdtime); - bgp_keepalives_on(peer); + bgp_keepalives_on(connection); } EVENT_OFF(connection->t_routeadv); EVENT_OFF(connection->t_delayopen); @@ -464,11 +464,11 @@ void bgp_timer_set(struct peer_connection *connection) */ EVENT_OFF(connection->t_holdtime); if (peer->v_holdtime == 0) - bgp_keepalives_off(peer); + bgp_keepalives_off(connection); else { BGP_TIMER_ON(connection->t_holdtime, bgp_holdtime_timer, peer->v_holdtime); - bgp_keepalives_on(peer); + bgp_keepalives_on(connection); } break; case Deleted: @@ -485,7 +485,7 @@ void bgp_timer_set(struct peer_connection *connection) EVENT_OFF(connection->t_start); EVENT_OFF(connection->t_connect); EVENT_OFF(connection->t_holdtime); - bgp_keepalives_off(peer); + bgp_keepalives_off(connection); EVENT_OFF(connection->t_routeadv); EVENT_OFF(connection->t_delayopen); break; @@ -1507,7 +1507,7 @@ enum bgp_fsm_state_progress bgp_stop(struct peer_connection *connection) } /* stop keepalives */ - bgp_keepalives_off(peer); + bgp_keepalives_off(connection); /* Stop read and write threads. */ bgp_writes_off(connection); @@ -2290,7 +2290,7 @@ bgp_establish(struct peer_connection *connection) /* Reset uptime, turn on keepalives, send current table. */ if (!peer->v_holdtime) - bgp_keepalives_on(peer); + bgp_keepalives_on(connection); peer->uptime = monotime(NULL); diff --git a/bgpd/bgp_keepalives.c b/bgpd/bgp_keepalives.c index 48bde1220d..92123c2cd9 100644 --- a/bgpd/bgp_keepalives.c +++ b/bgpd/bgp_keepalives.c @@ -229,8 +229,10 @@ void *bgp_keepalives_start(void *arg) /* --- thread external functions ------------------------------------------- */ -void bgp_keepalives_on(struct peer *peer) +void bgp_keepalives_on(struct peer_connection *connection) { + struct peer *peer = connection->peer; + if (CHECK_FLAG(peer->thread_flags, PEER_THREAD_KEEPALIVES_ON)) return; @@ -258,8 +260,10 @@ void bgp_keepalives_on(struct peer *peer) } } -void bgp_keepalives_off(struct peer *peer) +void bgp_keepalives_off(struct peer_connection *connection) { + struct peer *peer = connection->peer; + if (!CHECK_FLAG(peer->thread_flags, PEER_THREAD_KEEPALIVES_ON)) return; diff --git a/bgpd/bgp_keepalives.h b/bgpd/bgp_keepalives.h index 2b4389cac3..33e574da13 100644 --- a/bgpd/bgp_keepalives.h +++ b/bgpd/bgp_keepalives.h @@ -27,7 +27,7 @@ * If the peer is already registered for keepalives via this function, nothing * happens. */ -extern void bgp_keepalives_on(struct peer *); +extern void bgp_keepalives_on(struct peer_connection *connection); /** * Turns off keepalives for a peer. @@ -36,7 +36,7 @@ extern void bgp_keepalives_on(struct peer *); * * If the peer is already unregistered for keepalives, nothing happens. */ -extern void bgp_keepalives_off(struct peer *); +extern void bgp_keepalives_off(struct peer_connection *connection); /** * Pre-run initialization function for keepalives pthread. diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index ec66c5c405..749225bd30 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -2588,7 +2588,7 @@ int peer_delete(struct peer *peer) bgp_soft_reconfig_table_task_cancel(bgp, NULL, peer); - bgp_keepalives_off(peer); + bgp_keepalives_off(peer->connection); bgp_reads_off(peer->connection); bgp_writes_off(peer->connection); event_cancel_event_ready(bm->master, peer); -- 2.39.5