tcp: stop timers and clean scoreboard in tcp_close()

Stop timers when in tcp_close() instead of doing that in tcp_discardcb().
A connection in CLOSED state shall not need any timers. Assert that no
timer is rescheduled after that in tcp_timer_activate() and verfiy that
this is also the expected state in tcp_discardcb().

PR:			276761
Reviewed By:		glebius, tuexen, #transport
Sponsored by:		NetApp, Inc.
Differential Revision:	https://reviews.freebsd.org/D43792
This commit is contained in:
Richard Scheffenegger 2024-02-10 10:28:42 +01:00
parent a8e817cf5c
commit 62d47d73b7
2 changed files with 3 additions and 2 deletions

View file

@ -2383,10 +2383,9 @@ tcp_discardcb(struct tcpcb *tp)
#endif
INP_WLOCK_ASSERT(inp);
MPASS(!callout_active(&tp->t_callout));
MPASS(TAILQ_EMPTY(&tp->snd_holes));
tcp_timer_stop(tp);
/* free the reassembly queue, if any */
tcp_reass_flush(tp);
@ -2522,6 +2521,7 @@ tcp_close(struct tcpcb *tp)
tcp_fastopen_decrement_counter(tp->t_tfo_pending);
tp->t_tfo_pending = NULL;
}
tcp_timer_stop(tp);
if (tp->t_fb->tfb_tcp_timer_stop_all != NULL)
tp->t_fb->tfb_tcp_timer_stop_all(tp);
in_pcbdrop(inp);

View file

@ -907,6 +907,7 @@ tcp_timer_activate(struct tcpcb *tp, tt_which which, u_int delta)
#endif
INP_WLOCK_ASSERT(inp);
MPASS(tp->t_state > TCPS_CLOSED);
if (delta > 0) {
what = TT_STARTING;