git: d64a952f8d8a - releng/13.1 - tcp: virtualise net.inet.tcp.msl sysctl.

From: Alexander V. Chernikov <melifaro_at_FreeBSD.org>
Date: Mon, 28 Mar 2022 15:25:56 UTC
The branch releng/13.1 has been updated by melifaro:

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

commit d64a952f8d8ad935c20db327d68d5db78b4bbea8
Author:     Alexander V. Chernikov <melifaro@FreeBSD.org>
AuthorDate: 2021-12-04 22:02:44 +0000
Commit:     Alexander V. Chernikov <melifaro@FreeBSD.org>
CommitDate: 2022-03-28 15:24:28 +0000

    tcp: virtualise net.inet.tcp.msl sysctl.
    
    VNET teardown waits 2*MSL (60 seconds by default) before expiring
     tcp PCBs. These PCBs holds references to nexthops, which, in turn,
     reference ifnets. This chain results in VNET interfaces being destroyed
     and moved to default VNET only after 60 seconds.
    Allow tcp_msl to be set in jail by virtualising net.inet.tcp.msl sysctl,
     permitting more predictable VNET tests outcomes.
    
    MFC after:      1 week
    Reviewed by:    glebius
    Approved by:    re(gjb)
    Differential Revision: https://reviews.freebsd.org/D33270
    
    (cherry picked from commit c2c8e360d8c0b8712158d334686d88f052aef819)
    (cherry picked from commit 057793e63771816315cb54869c067b1c2b2bb4dc)
---
 sys/netinet/tcp_subr.c     | 5 +++--
 sys/netinet/tcp_timer.c    | 6 +++---
 sys/netinet/tcp_timer.h    | 3 ++-
 sys/netinet/tcp_timewait.c | 2 +-
 4 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index f435ced03e09..62042df50d18 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -1451,19 +1451,20 @@ tcp_init(void)
 
 	tcp_fastopen_init();
 
+	V_tcp_msl = TCPTV_MSL;
+
 	/* Skip initialization of globals for non-default instances. */
 	if (!IS_DEFAULT_VNET(curvnet))
 		return;
 
 	tcp_reass_global_init();
 
-	/* XXX virtualize those bellow? */
+	/* XXX virtualize those below? */
 	tcp_delacktime = TCPTV_DELACK;
 	tcp_keepinit = TCPTV_KEEP_INIT;
 	tcp_keepidle = TCPTV_KEEP_IDLE;
 	tcp_keepintvl = TCPTV_KEEPINTVL;
 	tcp_maxpersistidle = TCPTV_KEEP_IDLE;
-	tcp_msl = TCPTV_MSL;
 	tcp_rexmit_initial = TCPTV_RTOBASE;
 	if (tcp_rexmit_initial < 1)
 		tcp_rexmit_initial = 1;
diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c
index 96b95ab1c15f..4b00b686be32 100644
--- a/sys/netinet/tcp_timer.c
+++ b/sys/netinet/tcp_timer.c
@@ -117,10 +117,10 @@ SYSCTL_PROC(_net_inet_tcp, TCPCTL_DELACKTIME, delacktime,
     &tcp_delacktime, 0, sysctl_msec_to_ticks, "I",
     "Time before a delayed ACK is sent");
 
-int	tcp_msl;
+VNET_DEFINE(int, tcp_msl);
 SYSCTL_PROC(_net_inet_tcp, OID_AUTO, msl,
-    CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
-    &tcp_msl, 0, sysctl_msec_to_ticks, "I",
+    CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_VNET,
+    &VNET_NAME(tcp_msl), 0, sysctl_msec_to_ticks, "I",
     "Maximum segment lifetime");
 
 int	tcp_rexmit_initial;
diff --git a/sys/netinet/tcp_timer.h b/sys/netinet/tcp_timer.h
index 9a711d173386..316b76e50f7e 100644
--- a/sys/netinet/tcp_timer.h
+++ b/sys/netinet/tcp_timer.h
@@ -195,7 +195,6 @@ extern int tcp_maxpersistidle;
 extern int tcp_rexmit_initial;
 extern int tcp_rexmit_min;
 extern int tcp_rexmit_slop;
-extern int tcp_msl;
 extern int tcp_ttl;			/* time to live for TCP segs */
 extern int tcp_backoff[];
 extern int tcp_totbackoff;
@@ -212,6 +211,8 @@ VNET_DECLARE(int, tcp_pmtud_blackhole_mss);
 #define	V_tcp_pmtud_blackhole_mss	VNET(tcp_pmtud_blackhole_mss)
 VNET_DECLARE(int, tcp_v6pmtud_blackhole_mss);
 #define V_tcp_v6pmtud_blackhole_mss	VNET(tcp_v6pmtud_blackhole_mss)
+VNET_DECLARE(int, tcp_msl);
+#define V_tcp_msl			VNET(tcp_msl)
 
 void tcp_inpinfo_lock_del(struct inpcb *inp, struct tcpcb *tp);
 
diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c
index ee31c449cd1e..970f46274791 100644
--- a/sys/netinet/tcp_timewait.c
+++ b/sys/netinet/tcp_timewait.c
@@ -744,7 +744,7 @@ tcp_tw_2msl_reset(struct tcptw *tw, int rearm)
 	TW_WLOCK(V_tw_lock);
 	if (rearm)
 		TAILQ_REMOVE(&V_twq_2msl, tw, tw_2msl);
-	tw->tw_time = ticks + 2 * tcp_msl;
+	tw->tw_time = ticks + 2 * V_tcp_msl;
 	TAILQ_INSERT_TAIL(&V_twq_2msl, tw, tw_2msl);
 	TW_WUNLOCK(V_tw_lock);
 }