Download raw body.
bgpd: sendHoldTimer cleanup
While reviewing draft-ietf-idr-bgp-sendholdtimer-03 I noticed that our
implementation of SendHoldTimer could be a bit better. Especially we need
to be careful to disable the timer when HoldTime is negotiated to 0.
Now the draft itself only applies the SendHoldTimer when in state
Established while we do it all the time. This does not really matter
IMO that's why I did not add the extra check for that.
--
:wq Claudio
Index: session.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.c,v
diff -u -p -r1.466 session.c
--- session.c 22 Mar 2024 15:41:34 -0000 1.466
+++ session.c 25 Mar 2024 11:07:36 -0000
@@ -58,6 +58,7 @@ void session_sighdlr(int);
int setup_listeners(u_int *);
void init_peer(struct peer *);
void start_timer_holdtime(struct peer *);
+void start_timer_sendholdtime(struct peer *);
void start_timer_keepalive(struct peer *);
void session_close_connection(struct peer *);
void change_state(struct peer *, enum session_state, enum session_events);
@@ -836,6 +837,20 @@ start_timer_holdtime(struct peer *peer)
}
void
+start_timer_sendholdtime(struct peer *peer)
+{
+ uint16_t holdtime = INTERVAL_HOLD;
+
+ if (peer->holdtime > INTERVAL_HOLD)
+ holdtime = peer->holdtime;
+
+ if (peer->holdtime > 0)
+ timer_set(&peer->timers, Timer_SendHold, holdtime);
+ else
+ timer_stop(&peer->timers, Timer_SendHold);
+}
+
+void
start_timer_keepalive(struct peer *peer)
{
if (peer->holdtime > 0)
@@ -1929,10 +1944,7 @@ session_dispatch_msg(struct pollfd *pfd,
return (1);
}
p->stats.last_write = getmonotime();
- if (p->holdtime > 0)
- timer_set(&p->timers, Timer_SendHold,
- p->holdtime < INTERVAL_HOLD ? INTERVAL_HOLD :
- p->holdtime);
+ start_timer_sendholdtime(p);
if (p->throttled && p->wbuf.queued < SESS_MSG_LOW_MARK) {
if (imsg_rde(IMSG_XON, p->conf.id, NULL, 0) == -1)
log_peer_warn(&p->conf, "imsg_compose XON");
bgpd: sendHoldTimer cleanup