From nobody Thu Jun 26 17:03:41 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4bSlQ63Qxcz60mYP; Thu, 26 Jun 2025 17:03:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bSlQ60hYqz474p; Thu, 26 Jun 2025 17:03:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1750957422; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=43G2oBnlJWOTNOeh30+9pOGhYDpBnv6pTyeMy8GPIFA=; b=CDVDAdgackBjsuNg7YUyxGHCR+L9C9JdEknPoq/tBrGSSRjcPulnbwbuPANdJ+Yme741cy vnylE4nyEmsJ0IWvKxFQSrObj4VTJSAzrZmPUEYDvTw1TezNfXc9vSwtZWxhz4QjQhsMuQ twgOrP4PNA/R8NoxZb1vzLcEWYi0OqqCVl2AsKtanx5SxnZjj/LqsajrsJGydFdXQ5qVfp 5f88SjWLkNhtpaBFN32/VaBH8tVOsr7F2jCKPnbZXLQnF49l5gBwdVHiTFYzickH05/fwz Sfys0MjDPrFDUQO36ys7qMKQKtbw9lGQA/p5rwLkkPpDrY6Q8qfDVyH5vwOXMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1750957422; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=43G2oBnlJWOTNOeh30+9pOGhYDpBnv6pTyeMy8GPIFA=; b=F8LBAerCvkv7mY1CyyGtLis2enWxI8a0NQBJcCaN9j/7aemWkUK/X1yZ88e4Sz+eytiDXO g/v/tzvINq2zFY0AuKYL9xKosNO8Rt3rP5nYZerF6b+fON9opCE4hWR1fZVBVCTb06uKYQ cg5Ofqut8tG7HzQskxtnUXPk/VwkXF75mvOw2+aLxmUwNMJlZTWhE4DWwADmJ/17Xij5GO Ipye3+xCN649Ge4RCcQhjQXHzeA06QjI+iQRc4HDgLUtUbuUejzNX34Mok3Hyrk3xfPl05 xVE+gIybimn8e29/EJG67n+qpOGCjAtAbTkTZjiLWAtEcvvkn1p1dtA4N7yxsA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1750957422; a=rsa-sha256; cv=none; b=OYROo4LmvuUjjScfDUM129u8NpdRW515qZl0RCJAP7459Bi2kH1nl8cjQuZ24hOHye0jIX vgtqs7LYtfxmFcVNl4/dMg4sq+reIQmIDmVMpbOd6crnf6qL4Yk4teLHREsdIHriH2O2Pa 3bm9ybUyBuTfwSY0vwutoOCJ/tHXdL+WFRJ0smoDjHGz4JOvaQtvFOLZD27gd1P5CxN/o1 GgbjfOJFtjo1HPMGCvwfQE4F/mKDWfS5flIMr6nfscCfSWZ4t5il8+RvLR3c0n9dk/C2// uJLl9xNUmSXZvXeKOKCRbl3ZYZnODN7rDtm/JuLLZcWvXouv/rHYvr0d/IqIJw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4bSlQ607fQz1B2F; Thu, 26 Jun 2025 17:03:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 55QH3f2N060221; Thu, 26 Jun 2025 17:03:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 55QH3fqK060218; Thu, 26 Jun 2025 17:03:41 GMT (envelope-from git) Date: Thu, 26 Jun 2025 17:03:41 GMT Message-Id: <202506261703.55QH3fqK060218@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Michael Tuexen Subject: git: 5fb4b091e835 - main - tcp: allow specifying a MSL for local communications List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: tuexen X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5fb4b091e8352602894fc2b7284c8e1e3d8a8729 Auto-Submitted: auto-generated The branch main has been updated by tuexen: URL: https://cgit.FreeBSD.org/src/commit/?id=5fb4b091e8352602894fc2b7284c8e1e3d8a8729 commit 5fb4b091e8352602894fc2b7284c8e1e3d8a8729 Author: Michael Tuexen AuthorDate: 2025-06-26 16:59:36 +0000 Commit: Michael Tuexen CommitDate: 2025-06-26 16:59:36 +0000 tcp: allow specifying a MSL for local communications When setting the sysctl-variable net.inet.tcp.nolocaltimewait to 1, which is the default, a TCP endpoint does not enter the TIME-WAIT state, when the communication is local. This can result in sending RST-segments without any error situation. By setting the sysctl-variable net.inet.tcp.nolocaltimewait to 0, this does not occur, and the behavior is compliant with the TCP specification. But there is no reason to stay in the TIME-WAIT state for two times the value of the sysctl-variable net.inet.tcp.msl, if the communication is local. Therefore provide a separate sysctl-variable net.inet.tcp.msl_local, which controls how long an TCP end-point stays in the TIME-WAIT state, if the communication is local. The default value is 10 ms. Reviewed by: glebius, Peter Lei Sponsored by: Netflix, Inc. Differential Revision: https://reviews.freebsd.org/D50637 --- share/man/man4/tcp.4 | 7 +++++++ sys/netinet/tcp_subr.c | 1 + sys/netinet/tcp_timer.c | 6 ++++++ sys/netinet/tcp_timer.h | 3 +++ sys/netinet/tcp_timewait.c | 26 ++++++++++++++++++++++++-- 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/share/man/man4/tcp.4 b/share/man/man4/tcp.4 index 536bd904d796..f19b6cb2ae14 100644 --- a/share/man/man4/tcp.4 +++ b/share/man/man4/tcp.4 @@ -780,6 +780,13 @@ Minimum TCP Maximum Segment Size; used to prevent a denial of service attack from an unreasonably low MSS. .It Va msl The Maximum Segment Lifetime, in milliseconds, for a packet. +.It Va msl_local +The Maximum Segment Lifetime, in milliseconds, for a packet when both endpoints +are local. +.Va msl_local +is only used if +.Va nolocaltimewait +is zero. .It Va mssdflt The default value used for the TCP Maximum Segment Size .Pq Dq MSS diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index 6b1907305fb9..bbcd20b715ba 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -1455,6 +1455,7 @@ tcp_vnet_init(void *arg __unused) VNET_PCPUSTAT_ALLOC(tcpstat, M_WAITOK); V_tcp_msl = TCPTV_MSL; + V_tcp_msl_local = TCPTV_MSL_LOCAL; arc4rand(&V_ts_offset_secret, sizeof(V_ts_offset_secret), 0); } VNET_SYSINIT(tcp_vnet_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_FOURTH, diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c index a9046e5725d5..32ce3001929c 100644 --- a/sys/netinet/tcp_timer.c +++ b/sys/netinet/tcp_timer.c @@ -109,6 +109,12 @@ SYSCTL_PROC(_net_inet_tcp, OID_AUTO, msl, &VNET_NAME(tcp_msl), 0, sysctl_msec_to_ticks, "I", "Maximum segment lifetime"); +VNET_DEFINE(int, tcp_msl_local); +SYSCTL_PROC(_net_inet_tcp, OID_AUTO, msl_local, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_VNET, + &VNET_NAME(tcp_msl_local), 0, sysctl_msec_to_ticks, "I", + "Maximum segment lifetime for local communication"); + int tcp_rexmit_initial; SYSCTL_PROC(_net_inet_tcp, OID_AUTO, rexmit_initial, CTLTYPE_INT | CTLFLAG_RW, &tcp_rexmit_initial, 0, sysctl_msec_to_ticks, "I", diff --git a/sys/netinet/tcp_timer.h b/sys/netinet/tcp_timer.h index 394207bcb89b..34a0f1375463 100644 --- a/sys/netinet/tcp_timer.h +++ b/sys/netinet/tcp_timer.h @@ -74,6 +74,7 @@ * Time constants. */ #define TCPTV_MSL MSEC_2_TICKS(30000) /* max seg lifetime (hah!) */ +#define TCPTV_MSL_LOCAL MSEC_2_TICKS(10) /* max seg lifetime for local comm */ #define TCPTV_SRTTBASE 0 /* base roundtrip time; if 0, no idea yet */ #define TCPTV_RTOBASE MSEC_2_TICKS(1000) /* assumed RTO if no info */ @@ -183,6 +184,8 @@ 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) +VNET_DECLARE(int, tcp_msl_local); +#define V_tcp_msl_local VNET(tcp_msl_local) #endif /* _KERNEL */ diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c index 2b4ae462af89..9f2943725ef0 100644 --- a/sys/netinet/tcp_timewait.c +++ b/sys/netinet/tcp_timewait.c @@ -93,6 +93,28 @@ SYSCTL_BOOL(_net_inet_tcp, OID_AUTO, nolocaltimewait, CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nolocaltimewait), true, "Do not create TCP TIME_WAIT state for local connections"); +static u_int +tcp_msl(struct tcpcb *tp) +{ + struct inpcb *inp = tptoinpcb(tp); +#ifdef INET6 + bool isipv6 = inp->inp_inc.inc_flags & INC_ISIPV6; +#endif + + if ( +#ifdef INET6 + isipv6 ? in6_localip(&inp->in6p_faddr) : +#endif +#ifdef INET + in_localip(inp->inp_faddr)) +#else + false) +#endif + return (V_tcp_msl_local); + else + return (V_tcp_msl); +} + /* * Move a TCP connection into TIME_WAIT state. * inp is locked, and is unlocked before returning. @@ -140,7 +162,7 @@ tcp_twstart(struct tcpcb *tp) return; } - tcp_timer_activate(tp, TT_2MSL, 2 * V_tcp_msl); + tcp_timer_activate(tp, TT_2MSL, 2 * tcp_msl(tp)); INP_WUNLOCK(inp); } @@ -283,7 +305,7 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct tcphdr *th, if (thflags & TH_FIN) { seq = th->th_seq + tlen + (thflags & TH_SYN ? 1 : 0); if (seq + 1 == tp->rcv_nxt) - tcp_timer_activate(tp, TT_2MSL, 2 * V_tcp_msl); + tcp_timer_activate(tp, TT_2MSL, 2 * tcp_msl(tp)); } /*