From nobody Wed Apr 01 21:49:14 2026 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 4fmJXp31Pnz6YZym for ; Wed, 01 Apr 2026 21:49:14 +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 "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fmJXp2Lgkz3sWB for ; Wed, 01 Apr 2026 21:49:14 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775080154; 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=Gcbli1k9qz5Nea3c/st5UbMNx3+sFju7y3c/lw45euY=; b=eIBA+ifk2pYdXoiMMI8ncdZF7QkRaL5+W8EgdsPi/bG1smv5enxnlHr7xsaPoRTCV+TIsP Kwjsrna78kWBXY44iWFy+mE4HcIJ81Z84Zp3nxqn2bKpc+5YC6DwZ2tTMxiOTIVH/VpayW 6bvNusUaIwtnkpWn2VsZ58xI9+/NSE2AWYXfKtMWt3damomUA+oXJWAXsiaMT2Px9I4TK1 DhipsiR1C3gjmXgVHOI+yUhD1eLkOUYZwg0lrMgnTmUA/Oms5FOTYUP4ntw0EqnR6kiswu C9pU8qk/pq1muCeysn+QBDJoDw8yrEyEeFJdyey6kJK5TZYVRFts2EJnaAvOUA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1775080154; a=rsa-sha256; cv=none; b=xsRFrIe6ddqQQxWZdEhs1p9fwp/aGObGp4ObulGxiITvRTuHGki7fmD13Pu8PZNOZLai1t BHPJpUNzto1TdtHMV76lvqd5qp3WKXtEIWz184LlFrKbQZndPISBhxr8B24vLMBMZWzAPp 8UO9Tn7O9OgQ7ArZ+/wmqUdvp4PD5JFhqnND96dSh26t2DfJ4XD4o7OrOmZyRCeNvry5rZ RBs+/W5brns0oxmyEDDlIrfM7LGESsaWF21CTSDRnbM/5MPUFfLd8fKfwSuAdEKmxxGwVb hJslP1mhyzldrs0wSC5d8sdVH3S2LOBfxonoVX6HxuqqVnnZHlmoS6CVj5Ov/Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775080154; 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=Gcbli1k9qz5Nea3c/st5UbMNx3+sFju7y3c/lw45euY=; b=RFm8fem+44nWU88GDbNJwrWG9eBQpy3gv4gXTp2g0frE1Z9IqHuEAbLhT1ufBHVsMvOC2J GcssaIvHzjI02XOZ5HoFGzbn/TbLco2AOqCRmoNbzR72BcnMBEiQM8I/D6IZy5IVEYtz/2 vptY/xlZ0O5cIUUtA7MxFnkmeXqTXEFUvaJbq1OGzlJuJp+IbDP8KHzbqfGO7ZxioCbO/7 31EyG2tsX8jzJBggasqZ+igDHI7Xmj5UxAoQSBljy2tDetJQyOKY5ZgGhouvGJqD1NCiWv bgZfGHjmuAE7OZMfc3OEWoeC20mWR0Czg1KSU16RN8hQKiHIelLeaKduNDSvAg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fmJXp1GRYzZR6 for ; Wed, 01 Apr 2026 21:49:14 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 40a00 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 01 Apr 2026 21:49:14 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Maxim Sobolev Subject: git: 5d4a39d8ed77 - main - compat/linux: map TCP_USER_TIMEOUT sockopt into TCP_MAXUNACKTIME 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: sobomax X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5d4a39d8ed775d607e0702f317f687491ac0a23d Auto-Submitted: auto-generated Date: Wed, 01 Apr 2026 21:49:14 +0000 Message-Id: <69cd92da.40a00.1d73727f@gitrepo.freebsd.org> The branch main has been updated by sobomax: URL: https://cgit.FreeBSD.org/src/commit/?id=5d4a39d8ed775d607e0702f317f687491ac0a23d commit 5d4a39d8ed775d607e0702f317f687491ac0a23d Author: Maxim Sobolev AuthorDate: 2026-04-01 21:42:50 +0000 Commit: Maxim Sobolev CommitDate: 2026-04-01 21:46:08 +0000 compat/linux: map TCP_USER_TIMEOUT sockopt into TCP_MAXUNACKTIME After reading both manual pages, our TCP_MAXUNACKTIME is fairly similar to the TCP_USER_TIMEOUT, the only considerable difference is ours is in seconds and linux's in milliseconds. Round up linux's in setsockopt(2) to a next whole second and clamp ours getter to UINT_MAX ms. Reviewed by: tuexen, glebius Differential Revision: https://reviews.freebsd.org/D56168 MFC after: 2 weeks Sponsored by: Sippy Software, Inc. --- sys/compat/linux/linux_socket.c | 61 +++++++++++++++++++++++++++++++++++++++++ sys/compat/linux/linux_socket.h | 1 + 2 files changed, 62 insertions(+) diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index b1a483ce611c..023be1e6b885 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -594,10 +594,34 @@ linux_to_bsd_tcp_sockopt(int opt) return (-2); case LINUX_TCP_MD5SIG: return (TCP_MD5SIG); + case LINUX_TCP_USER_TIMEOUT: + return (TCP_MAXUNACKTIME); } return (-1); } +static u_int +linux_to_bsd_tcp_user_timeout(l_uint linux_timeout) +{ + + /* + * Linux exposes TCP_USER_TIMEOUT in milliseconds while + * TCP_MAXUNACKTIME uses whole seconds. Round up partial + * seconds so a non-zero Linux timeout never becomes zero. + */ + return (howmany(linux_timeout, 1000U)); +} + +static l_uint +bsd_to_linux_tcp_user_timeout(u_int bsd_timeout) +{ + + if (bsd_timeout > UINT_MAX / 1000U) + return (UINT_MAX); + + return (bsd_timeout * 1000U); +} + static int linux_to_bsd_msg_flags(int flags) { @@ -2057,8 +2081,10 @@ linux_setsockopt(struct thread *td, struct linux_setsockopt_args *args) struct proc *p = td->td_proc; struct linux_pemuldata *pem; l_timeval linux_tv; + l_uint linux_timeout; struct sockaddr *sa; struct timeval tv; + u_int bsd_timeout; socklen_t len; int error, level, name, val; @@ -2130,6 +2156,24 @@ linux_setsockopt(struct thread *td, struct linux_setsockopt_args *args) break; case IPPROTO_TCP: name = linux_to_bsd_tcp_sockopt(args->optname); + switch (name) { + case TCP_MAXUNACKTIME: + if (args->optlen < sizeof(linux_timeout)) + return (EINVAL); + + error = copyin(PTRIN(args->optval), &linux_timeout, + sizeof(linux_timeout)); + if (error != 0) + return (error); + + bsd_timeout = linux_to_bsd_tcp_user_timeout( + linux_timeout); + return (kern_setsockopt(td, args->s, level, name, + &bsd_timeout, UIO_SYSSPACE, + sizeof(bsd_timeout))); + default: + break; + } break; case SOL_NETLINK: name = args->optname; @@ -2279,10 +2323,12 @@ linux_getsockopt_so_linger(struct thread *td, int linux_getsockopt(struct thread *td, struct linux_getsockopt_args *args) { + l_uint linux_timeout; l_timeval linux_tv; struct timeval tv; socklen_t tv_len, xulen, len; struct sockaddr *sa; + u_int bsd_timeout; struct xucred xu; struct l_ucred lxu; int error, level, name, newval; @@ -2373,6 +2419,21 @@ linux_getsockopt(struct thread *td, struct linux_getsockopt_args *args) break; case IPPROTO_TCP: name = linux_to_bsd_tcp_sockopt(args->optname); + switch (name) { + case TCP_MAXUNACKTIME: + len = sizeof(bsd_timeout); + error = kern_getsockopt(td, args->s, level, name, + &bsd_timeout, UIO_SYSSPACE, &len); + if (error != 0) + return (error); + + linux_timeout = bsd_to_linux_tcp_user_timeout( + bsd_timeout); + return (linux_sockopt_copyout(td, &linux_timeout, + sizeof(linux_timeout), args)); + default: + break; + } break; default: name = -1; diff --git a/sys/compat/linux/linux_socket.h b/sys/compat/linux/linux_socket.h index 68176c3cc401..f2a96b3e7dcb 100644 --- a/sys/compat/linux/linux_socket.h +++ b/sys/compat/linux/linux_socket.h @@ -322,6 +322,7 @@ int linux_accept(struct thread *td, struct linux_accept_args *args); #define LINUX_TCP_KEEPCNT 6 #define LINUX_TCP_INFO 11 #define LINUX_TCP_MD5SIG 14 +#define LINUX_TCP_USER_TIMEOUT 18 struct l_ifmap { l_ulong mem_start;