git: 62d47d73b7eb - main - tcp: stop timers and clean scoreboard in tcp_close()

From: Richard Scheffenegger <rscheff_at_FreeBSD.org>
Date: Sat, 10 Feb 2024 09:34:01 UTC
The branch main has been updated by rscheff:

URL: https://cgit.FreeBSD.org/src/commit/?id=62d47d73b7eb01f3b0a37541df5e7aaa36f54335

commit 62d47d73b7eb01f3b0a37541df5e7aaa36f54335
Author:     Richard Scheffenegger <rscheff@FreeBSD.org>
AuthorDate: 2024-02-10 09:28:42 +0000
Commit:     Richard Scheffenegger <rscheff@FreeBSD.org>
CommitDate: 2024-02-10 09:30:00 +0000

    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
---
 sys/netinet/tcp_subr.c  | 4 ++--
 sys/netinet/tcp_timer.c | 1 +
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 6043a3d458e5..90e1496a822c 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -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);
diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c
index f0eb3bad33cf..ed50659abf8e 100644
--- a/sys/netinet/tcp_timer.c
+++ b/sys/netinet/tcp_timer.c
@@ -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;