From nobody Mon Aug 24 01:42:03 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EA3292472AF for ; Mon, 17 Aug 2026 03:57:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939043; cv=none; b=Oi9hI+e3ghHKilIKK91wJ16qyIgHQkL4wJQncFoCnCKIsy3tYQGLvXfhZaX3Sd+5Szr2Wtkp3a1bm4Pk6XRkx+rt03FXxnX6XyRhkpSSi8o40gZ+pulgr6ClVlOzD0VjYPQ8P5QnzX9dJkZKEg9So8u7C7wrlrapHqMdQFkxJnQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939043; c=relaxed/simple; bh=Lo/luMwGvhUXzB0lM5mpPl2mhqNVI54+T8/eMm3zDA4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fIAnxlwU7V5AMyugC35TYvmCI7YbNKRGv+w46sM57uxpxlLMWRnKS7DdaIvLuc+SUpo+bysAJ1HwTk5T2X8Gj6v+vWyr07MT205P1tJr7eZihbXbdYrVyQqzb9A8m8S6eDFe2ehGgrGO7hamvTh84cMQx84md8CUbRlH3+a5XLs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DDX92n+1; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DDX92n+1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9F23F1F000E9; Mon, 17 Aug 2026 03:57:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786939041; bh=vO8H1WhN7OHYWalQwbdJxYUxmWafoBJbqxlYf63qE8A=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=DDX92n+1fkfQM98hijyrR2qvTqr3T6F303Wd+Ro9vQM/FhP9gJMzOwUwfZ7pfecPV py9sfupRAVY/4FWqLw3dMyCDG+G1gT3ztYR1KCQh9JzoPNr6UKTcVyClxNVZqjpmip GTlXAW1JgPSxOaDBax/biJazwn47kZG6rIh/43S7vesdwqK+kn89BGn5c2QXhV8TtF BuGknIlQ0BQUw9pKlxPJqSnvRJYz5YHLeKJtagEvDLrhM1RpkC0xLOv2Wyjp75+ODn X9epadpgPpq14hnHCostPCmEuEtcIozI2FkAMCa+rUdhotHTaQ8tlZ7Sgui1dkxVDT 74ippNEcZ2o0A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 1/6] mptcp: handle TCP_MAXSEG getsockopt in common case Date: Mon, 17 Aug 2026 11:57:08 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Move TCP_MAXSEG from a tail-clause into the common case alongside other "first subflow only" options (TCP_FASTOPEN_*), making the dispatch logic more uniform. No behavioural change. Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 922f6ae5c80c..2c1eaf66202a 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -1499,6 +1499,7 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock= *msk, int optname, case TCP_FASTOPEN_CONNECT: case TCP_FASTOPEN_KEY: case TCP_FASTOPEN_NO_COOKIE: + case TCP_MAXSEG: return mptcp_getsockopt_first_sf_only(msk, SOL_TCP, optname, optval, optlen); case TCP_INQ: @@ -1523,9 +1524,6 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock= *msk, int optname, return mptcp_put_int_option(msk, optval, optlen, msk->notsent_lowat); case TCP_IS_MPTCP: return mptcp_put_int_option(msk, optval, optlen, 1); - case TCP_MAXSEG: - return mptcp_getsockopt_first_sf_only(msk, SOL_TCP, optname, - optval, optlen); } return -EOPNOTSUPP; } --=20 2.53.0 From nobody Mon Aug 24 01:42:03 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BFD252E8DE3 for ; Mon, 17 Aug 2026 03:57:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939044; cv=none; b=KgdSXJ1uuvYWsL7T8sNNKTbD+HdNvt1LekZEwOMzmh3RG70ElF+KIq7fp4WrGOXd9qfaDWUYWHiZf/ttGHN9kpKYvx4gPCU9nhVOabhJD08vEzgt6sgXTg9kUOnewpOjvt4NAeG8SLWP7xOLycmGzIIUtGpT5qlLSNZ1LekIZQ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939044; c=relaxed/simple; bh=12+apjuioBC8N62eTgEHwNuUizgwxX00zkAyPACTVRg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tDpkB3iZU60miz5h8wftEsmaskfeD3juTBsXLSysSjFhab2+9dn/4foyoNg7ZRb4mXXiPyt/hNc28izjtEW5G0DcaA2bWMKAEZ5JfhzoTloT2eDa9CI7vq7vSPhCGU4YKnBnKYKH9n/FPyNku+JrdVlAeSmj93euP/dEWiVVz4I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CMYCtC0a; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CMYCtC0a" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 358211F00A3A; Mon, 17 Aug 2026 03:57:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786939043; bh=HSIVj8uxv01MAdlABgCTwQ/hQsJ3+MOdestkgSTkj7s=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=CMYCtC0a4dfBIIVmNJAuWdr2Fi+UJRpLe0sCxOGRe8Sp6X+wo700eZha2vTKuTHed kMx21M6vha6mrKKdlADJJpExu2KjgwKsWxZ2I3EXwkAspT7mdwUHV5i9o2YvbpDkKD A2hqWCdpkd2U7VCS5jrl9UeW9ezWBfC3jAUf+qLw3HJ59uvBFh45lSNpJ+oOtudda9 qWlIHNQq5EE4+om3q3A8Rh930Tzq4/26AJwc1Z18ZjqKrqkxvFtfvk0VMVc5HtS/AP 1qtmshJE1Z6+0LNDcBRvqqjgeogAbvVtlUScOv6lyBOTPNuyfU7EVp4bDNbI6soP+B eDwjDiHCEbxTg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Gang Yan , Geliang Tang Subject: [PATCH mptcp-next v6 2/6] mptcp: take TCP_MAXSEG handling into setsockopt_set_val Date: Mon, 17 Aug 2026 11:57:09 +0800 Message-ID: <24bc4215f264b6800070d5b7e75553b2c7e79da9.1786938892.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Gang Yan Replace mptcp_setsockopt_all_sf() with __mptcp_setsockopt_set_val() for TCP_MAXSEG option handling. This aligns the implementation with other socket options that use the same helper and simplifies the code. Co-developed-by: Geliang Tang Signed-off-by: Geliang Tang Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 2c1eaf66202a..5de371e29721 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -968,9 +968,9 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *= msk, int optname, val); break; case TCP_MAXSEG: - msk->maxseg =3D val; - ret =3D mptcp_setsockopt_all_sf(msk, SOL_TCP, optname, optval, - optlen); + ret =3D __mptcp_setsockopt_set_val(msk, MAX_TCP_WINDOW, + &tcp_sock_set_maxseg, + &msk->maxseg, val); break; default: ret =3D -ENOPROTOOPT; --=20 2.53.0 From nobody Mon Aug 24 01:42:03 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 16C0F2EEE99 for ; Mon, 17 Aug 2026 03:57:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939047; cv=none; b=L59rQc78TJ/FcwWRKamZ872r242/ka7izKSaAVpj1I1zwv4iMGfUH7K3Fx/tfl0jQeIOjuR+tNfosu7xI76+Jtl5j9CnOZ7dJakuxe7gJDP/wcWmTkopNaT8qbdlFBSorMieCD1UdDophsDdIp6AL4CPeNhu33QUFqOLR+32Mf4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939047; c=relaxed/simple; bh=uU2ubTbjmwcZNrSzEOXBAAmtiq0X3ijL6W654BWwMEY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mBtlLpVUd3PTN0EhIJGWWczI16msYmLmSh+QgHN5iy0TczHe5JQP831pWXHG4ovxsIcnydvb3IF5atwe/SiDbyeQTxYwjvc3bFWoKuwMW1JZ/+f5jfduppEgm1+wzTk+Z7Te3jQPtMGcxQH7xNtkIJjbhJNQHFCe6mYhgfy/mIQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HZHUbDEJ; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HZHUbDEJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2F4ED1F000E9; Mon, 17 Aug 2026 03:57:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786939045; bh=c20Mpmv3QU/CCWfP13eRgQrAO/5fSVs0PfiMsAYb3k4=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=HZHUbDEJz+kRV1zk3cycGN455PtIVNeHkB80lJRlLJMOLw0utN8yvnLFfQn/hoFzW dW+PYkLDDr5iuvTIKWOb9gUMSTkOSrDL6Sibm52Tz8yprfgiDTC+A+pd1ZgMDdcsHs ZJFaIFrIVQaX8ypmDp0XdMZ8ZCIgXtGmp8ez9EJpZlVzvKumu2ZfhN02OJsNacJwKF khpzB6Se1WfkaB6BbsBpHJxvHvgk52t0aAYZCDm3zxSa5X3SpsCgQ4wpOOftMUBRFr RAjeD7xv6tGhkl68L0ZDE6cIfbRaWb+PP6oU4fqcsycWSs2mxtxMpn4HLMMXGBzK9q 532/QAMh7TWSQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 3/6] mptcp: inherit sk_reuse and fix dev bind override Date: Mon, 17 Aug 2026 11:57:10 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Propagate sk_reuse and sk_reuseport from master socket to subflows, and bump setsockopt_seq so later subflows pick up the changes. This patch also fixes unconditional sk_bound_dev_if override in __mptcp_subflow_connect(): only set it when local->ifindex is non-zero, otherwise preserve the value inherited from the master socket via sync_socket_options(). Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 5 +++++ net/mptcp/subflow.c | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 5de371e29721..d79139eb5b8a 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -335,6 +335,8 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_soc= k *msk, int optname, sk->sk_bound_dev_if =3D ssk->sk_bound_dev_if; else if (optname =3D=3D SO_BINDTOIFINDEX) sk->sk_bound_dev_if =3D ssk->sk_bound_dev_if; + + sockopt_seq_inc(msk); } release_sock(sk); return ret; @@ -1704,6 +1706,9 @@ static void sync_socket_options(struct mptcp_sock *ms= k, struct sock *ssk) assign_bit(b, &inet_sk(ssk)->inet_flags, src & BIT(b)); =20 WRITE_ONCE(inet_sk(ssk)->local_port_range, READ_ONCE(inet_sk(sk)->local_p= ort_range)); + + ssk->sk_reuse =3D sk->sk_reuse; + ssk->sk_reuseport =3D sk->sk_reuseport; } =20 void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index af81ad5e699d..47ff736c4d66 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1672,7 +1672,9 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_pm_local *local, if (addr.ss_family =3D=3D AF_INET6) addrlen =3D sizeof(struct sockaddr_in6); #endif - ssk->sk_bound_dev_if =3D local->ifindex; + /* Only override the bound device if the path manager picked one. */ + if (local->ifindex) + ssk->sk_bound_dev_if =3D local->ifindex; err =3D kernel_bind(sf, (struct sockaddr_unsized *)&addr, addrlen); if (err) { MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTXBINDERR); --=20 2.53.0 From nobody Mon Aug 24 01:42:03 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8B9BA2E8DE3 for ; Mon, 17 Aug 2026 03:57:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939048; cv=none; b=VgDjhLB1hxy2ei3nZUglXiTlQ37fpYsdzf9Om9IlyBPax/9sgOu68Omg9FWjiE+W2nkKJkpkZakNRNRCHuNgTIkrgOLRd5JOoQxGF7FJlnzrrO1LFuAijzJ9R1RnBuVSaCb0q7ubE+KUEmGXRtWcMkSxwg1k/4yhAXCQmIXpaTk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939048; c=relaxed/simple; bh=OoW1mOHrfQr3p6XnrxuF9rleL3z6nH6jNspTKo/LlBA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YrJgGTYoa8ozpa2E0dPsiLyZTRYEbb2aa0tR18XthWs7kdSWbHEVrbjUTtCtKhyGtFezi3ds7zgFosW/MG8wKPL3W0PDyGQTc3GDQi4ADaldiOFG2MI2G4zyNsU5F2TZInqqQtm2Fl388HgYEcxnrlHZo6ngbknobA6gyvyOD+s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jcs/NcJZ; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jcs/NcJZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 35BF61F00A3A; Mon, 17 Aug 2026 03:57:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786939047; bh=68LYAzFqK7LWuCmZshunI/FHnd4fzYZzcErEL3W3Cxo=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=jcs/NcJZdIZv6d67Nwj0MPI+3YOn2YxCmRKRJ973I06mvWr5MbePce1nFdlXMNjsm rdtCu+BIsMdrcAhHABQ9R/ONebNwhMrkk9k+KXOEOlYocVulh/pZXsYjtFTQMwKTHO vNyXnJTTiawhOZmslFkcKgPaf7lIieCv2m+/jdn5bN8tkeufFAUKy+OYPNqHR5LOAN WdAL8VZyjTFfZrgkTnOEhJdkIBUu7djCoeZ2Ozd2oYVJuPDoD4sYyG1HDvcDAFDRrQ r/TZgVJZxzieFHleUSYCMHTvF5bohrwDbCQ2nDow97BqXfIKZlE+lCZovV95S95kIU HtZaq7ZfpGIlw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 4/6] mptcp: add TCP_SYNCNT setsockopt/getsockopt Date: Mon, 17 Aug 2026 11:57:11 +0800 Message-ID: <30ec9ef5f850dfb4e34b9546a856592e65d97b3e.1786938892.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang This patch adds TCP_SYNCNT support on the MPTCP socket. The setsockopt() path stores the value in inet_csk(sk)->icsk_syn_retries on the msk and all subflow sockets. The getsockopt() path reads the same field back from the master socket. A newly created subflow picks up the master socket's syn_retries through sync_socket_options(), so the setting takes effect for outgoing SYNs without further plumbing. Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index d79139eb5b8a..50420d332b44 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -974,6 +974,13 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock = *msk, int optname, &tcp_sock_set_maxseg, &msk->maxseg, val); break; + case TCP_SYNCNT: + ret =3D tcp_sock_set_syncnt(sk, val); + if (ret =3D=3D 0) + ret =3D __mptcp_setsockopt_set_val(msk, MAX_TCP_SYNCNT, + &tcp_sock_set_syncnt, + &val, val); + break; default: ret =3D -ENOPROTOOPT; } @@ -1526,6 +1533,10 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_soc= k *msk, int optname, return mptcp_put_int_option(msk, optval, optlen, msk->notsent_lowat); case TCP_IS_MPTCP: return mptcp_put_int_option(msk, optval, optlen, 1); + case TCP_SYNCNT: + return mptcp_put_int_option(msk, optval, optlen, + READ_ONCE(inet_csk(sk)->icsk_syn_retries) ? : + READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_syn_retries)); } return -EOPNOTSUPP; } @@ -1646,6 +1657,7 @@ static void sync_socket_options(struct mptcp_sock *ms= k, struct sock *ssk) struct sock *sk =3D (struct sock *)msk; unsigned long src; bool keep_open; + int syncnt; int b; =20 keep_open =3D sock_flag(sk, SOCK_KEEPOPEN); @@ -1709,6 +1721,9 @@ static void sync_socket_options(struct mptcp_sock *ms= k, struct sock *ssk) =20 ssk->sk_reuse =3D sk->sk_reuse; ssk->sk_reuseport =3D sk->sk_reuseport; + syncnt =3D READ_ONCE(inet_csk(sk)->icsk_syn_retries); + if (syncnt > 0 && tcp_sock_set_syncnt(ssk, syncnt)) + pr_warn("Failed to sync TCP_SYNCNT=3D%u to subflow\n", syncnt); } =20 void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk) --=20 2.53.0 From nobody Mon Aug 24 01:42:03 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4D6F52472AF for ; Mon, 17 Aug 2026 03:57:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939050; cv=none; b=W8x9zbVSB+DrgGz342/hcMpFIhST1Vc66A9qyOoqow2fr/v1iGXr4JEEHbwx+9Rq0oB/vP1bCpjHcOwmZFMkQnXE2k29spjHWSTf1SRLAJ6gkgqmXkwrSy06VeYtt0g1Ix1W0zvgTu1UPgXWlnNj4FVl5GqrG3ooHszXJOgcPfs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939050; c=relaxed/simple; bh=vqKQr8PEqIoA90fYHHiufNIcfMO4KmObUS/hUIaj6OY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kkDEVDdGzb9bIszEJnEP55pFrAWYp0m4vbJ0Uc84Z1fCa1X8sl5OCuVONXgRmKb4c0R2sb6Z1rLL+Ao9PuiljFkhMEu7gIaMn+BAc3OdVOYzC4CdDfBbln8ADOVUcd/MSpdB8imw2Z6xSk155nQJb7pdV4e9GKNpMPd3iUOWzfE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NOyTueAH; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NOyTueAH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9E1EA1F000E9; Mon, 17 Aug 2026 03:57:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786939049; bh=i9jKNQitH+4q4f8FwLYrLzR3zO5dBVEppfSo29wYgX4=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=NOyTueAHPfg4r1UB2EGJq0tjpy2e4kwGTdb2XlgpBymtVrprBHfwqZqp3tCYzThVc CvenJXn0IGE/qAf9YgRj3f3j/4+IiD3+/2mtLohUPyqnAZ0GeEADkASxRvpDizmFbW Gm0XUDH+oVFDqZBDL8Sy6T/eo04CVxhr//UV1CL/K+T2Bc9m04Qh+BzULgRKfENxHf OXrIfNPGnVKNRymaDXNmnYQiyQWdAXyxnn5jDpmVuVJ1ZqXGLTCG/6cNCMTzAIGPDp cqFvHaFduSpCS/yvs8cxweju/Qpq/btkeLrCnNHcsAFDcjOFgngHlUakdobu7TMjGt YiUauYoxsjhKA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: David 'equinox' Lamparter , Mat Martineau , Matthieu Baerts , Geliang Tang Subject: [PATCH mptcp-next v6 5/6] mptcp: sockopt: implement IPV6_TCLASS Date: Mon, 17 Aug 2026 11:57:12 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David 'equinox' Lamparter The IPV6_TCLASS setsockopt just needs to be forwarded to the individual TCP sockets, like IP_TOS is already handled for IPv4. Coincidentally, ssh uses this sockopt and prints an error in the middle of your ongoing SSH session when it doesn't work (very annoying when doing SCP/SFTP on a multiplexed session.) IPV6_TCLASS handling in do_ipv6_setsockopt() inlines the same ECN mask logic and inet6_sk(sk)->tclass write that callers need when propagating a tclass value onto a newly created socket. Pull this into a small helper __ip6_sock_set_tclass() exported via , so MPTCP can apply IPV6_TCLASS without duplicating the ECN handling. For setsockopt, the value is first applied to the MPTCP socket itself via ipv6_setsockopt(), then propagated to all existing subflows using __ip6_sock_set_tclass(). The setsockopt_seq is bumped to ensure that subflows created later will pick up the setting through sync_socket_options(). For getsockopt, the value is read directly from the MPTCP socket. Also add sync_socket_options() support for IPV6_TCLASS, so that new subflows created after the option is set inherit the correct tclass value. Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/568 Cc: Mat Martineau Cc: Matthieu Baerts Co-developed-by: Geliang Tang Signed-off-by: Geliang Tang Signed-off-by: David 'equinox' Lamparter --- include/net/ipv6.h | 2 ++ net/ipv6/ipv6_sockglue.c | 23 +++++++++++------- net/mptcp/sockopt.c | 52 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 8 deletions(-) diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 3de07e738538..30fcae5ae054 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -1252,6 +1252,8 @@ static inline void ip6_sock_set_recverr(struct sock *= sk) inet6_set_bit(RECVERR6, sk); } =20 +void __ip6_sock_set_tclass(struct sock *sk, int val); + #define IPV6_PREFER_SRC_MASK (IPV6_PREFER_SRC_TMP | IPV6_PREFER_SRC_PUBLIC= | \ IPV6_PREFER_SRC_COA) =20 diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index b4c977434c2e..3bc87f3e266e 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c @@ -373,6 +373,20 @@ static int ipv6_set_opt_hdr(struct sock *sk, int optna= me, sockptr_t optval, return err; } =20 +void __ip6_sock_set_tclass(struct sock *sk, int val) +{ + u8 old_tclass =3D inet6_sk(sk)->tclass; + + if (sk->sk_type =3D=3D SOCK_STREAM) { + val &=3D ~INET_ECN_MASK; + val |=3D old_tclass & INET_ECN_MASK; + } + if (old_tclass !=3D val) { + WRITE_ONCE(inet6_sk(sk)->tclass, val); + sk_dst_reset(sk); + } +} + int do_ipv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval, unsigned int optlen) { @@ -713,14 +727,7 @@ int do_ipv6_setsockopt(struct sock *sk, int level, int= optname, /* RFC 3542, 6.5: default traffic class of 0x0 */ if (val =3D=3D -1) val =3D 0; - if (sk->sk_type =3D=3D SOCK_STREAM) { - val &=3D ~INET_ECN_MASK; - val |=3D np->tclass & INET_ECN_MASK; - } - if (np->tclass !=3D val) { - np->tclass =3D val; - sk_dst_reset(sk); - } + __ip6_sock_set_tclass(sk, val); retv =3D 0; break; =20 diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 50420d332b44..442167e66c48 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -485,6 +485,42 @@ static int mptcp_setsockopt_recverr(struct mptcp_sock = *msk, int level, return ret; } =20 +#if IS_ENABLED(CONFIG_IPV6) +static int mptcp_setsockopt_v6_set_tclass(struct mptcp_sock *msk, int optn= ame, + sockptr_t optval, unsigned int optlen) +{ + struct mptcp_subflow_context *subflow; + struct sock *sk =3D (struct sock *)msk; + int err, val; + + if (sk->sk_family !=3D AF_INET6) + return -EOPNOTSUPP; + + err =3D ipv6_setsockopt(sk, SOL_IPV6, optname, optval, optlen); + + if (err !=3D 0) + return err; + + lock_sock(sk); + sockopt_seq_inc(msk); + val =3D READ_ONCE(inet6_sk(sk)->tclass); + mptcp_for_each_subflow(msk, subflow) { + struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); + bool slow; + + if (ssk->sk_family !=3D AF_INET6) + continue; + + slow =3D lock_sock_fast(ssk); + __ip6_sock_set_tclass(ssk, val); + unlock_sock_fast(ssk, slow); + } + release_sock(sk); + + return 0; +} +#endif + static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname, sockptr_t optval, unsigned int optlen) { @@ -532,6 +568,11 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk,= int optname, ret =3D mptcp_setsockopt_recverr(msk, SOL_IPV6, optname, optval, optlen); break; +#if IS_ENABLED(CONFIG_IPV6) + case IPV6_TCLASS: + return mptcp_setsockopt_v6_set_tclass(msk, optname, optval, + optlen); +#endif } =20 return ret; @@ -1597,6 +1638,13 @@ static int mptcp_getsockopt_v6(struct mptcp_sock *ms= k, int optname, return -ENOPROTOOPT; return mptcp_put_int_option(msk, optval, optlen, inet6_test_bit(RECVERR6_RFC4884, sk)); +#if IS_ENABLED(CONFIG_IPV6) + case IPV6_TCLASS: + if (sk->sk_family !=3D AF_INET6) + return -EOPNOTSUPP; + return mptcp_put_int_option(msk, optval, optlen, + READ_ONCE(inet6_sk(sk)->tclass)); +#endif } =20 return -EOPNOTSUPP; @@ -1724,6 +1772,10 @@ static void sync_socket_options(struct mptcp_sock *m= sk, struct sock *ssk) syncnt =3D READ_ONCE(inet_csk(sk)->icsk_syn_retries); if (syncnt > 0 && tcp_sock_set_syncnt(ssk, syncnt)) pr_warn("Failed to sync TCP_SYNCNT=3D%u to subflow\n", syncnt); +#if IS_ENABLED(CONFIG_IPV6) + if (sk->sk_family =3D=3D AF_INET6 && ssk->sk_family =3D=3D AF_INET6) + __ip6_sock_set_tclass(ssk, READ_ONCE(inet6_sk(sk)->tclass)); +#endif } =20 void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk) --=20 2.53.0 From nobody Mon Aug 24 01:42:03 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C944330C143 for ; Mon, 17 Aug 2026 03:57:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939052; cv=none; b=HYMfL+rRIJg6s3BhWnx8WW9YdN5V8MxALa0dDxtkZZntdqlMUAGMXa1RsydY/vAwVKk48E7UqE9tRmMK2eXj7gkAdNgeqYKVvwGPxS1JAtzOMYZBtAbSubN4CZVdTDwY3gY+K5QSwIXCadPPHoSqjjsP0ccpT2B9gB9IaNX+E74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786939052; c=relaxed/simple; bh=RcA4ET0WURNa3DxKzaK1SsuKLm0cLwCR4pqv9U2ndRg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=h3d3h9ZvakX56EZ0vwr/F3LYjUCEbfiTpg2zyWochdCElSV1QrcVl/roeMZpsDbFJBhWyIhf3nSNRXL+WXP/Gshczq5LzaaB9J7wBDmDhfRH7Gl+rSLd7A+LxDVbtFzS1tXU56quC8zPkKHsBUFBy+tDey08XlixeP1shyWVtY8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZW1iI+FS; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZW1iI+FS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A578D1F00A3A; Mon, 17 Aug 2026 03:57:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786939050; bh=8C4HAYjLcPN57L64JKI3QjIt7htAu7/bHtTqRLzZ90c=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ZW1iI+FSeOg3WhD1/NC8aYZmhemt3rGUHu9Rxu8qyTmtBS5YnQwo9HGpPaAiGXxOp GiuPwEyL4AluODoPs1SoFOZ68fWgbDwZzHpZTq0zryqQn8ktWorQylyCQLDbMEBlDh N7cFsp0wKc5cUKbjIZWwUFgqGo88VQFU8zrqJl8ya8z21M/Tpnwp6h7wXvU/k/iJZ2 ezkTJtUBMnJxz9IbpnidDyit9bhdDWAp8F+xidPfA9IcqWT6qsvjRbUfp9DP9yPxLX 7rRJf4RlxQVSVpZ8eor7TKRo4h7beC/9nr0E8dBzvzFM3SXk+6VfuC25P0RApfwbWz gJCjjnSZVzEmA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 6/6] mptcp: copy subflow's tos/tclass to msk on accept Date: Mon, 17 Aug 2026 11:57:13 +0800 Message-ID: <0ae5cedc96502c3a89a573b386ce21c017c9bd6c.1786938892.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang When a new MPTCP socket is accepted, copy the tos (and rcv_tos for IPv4) or tclass (and rcv_flowinfo for IPv6) from the first subflow to the newly-created msk. This mirrors what plain TCP does in tcp_v4_syn_recv_sock() and tcp_v6_syn_recv_sock(), where these values are copied from the incoming skb to the accepted socket. Without this, MP_JOIN subflows created later would inherit tos/tclass=3D0 from the msk and lose the peer's reflected value, causing inconsistent traffic class behavior. Signed-off-by: Geliang Tang --- net/mptcp/protocol.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index c2762d74f29d..f18af725e8e2 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3756,6 +3756,22 @@ struct sock *mptcp_sk_clone_init(const struct sock *= sk, #endif mptcp_copy_ip_options(nsk, sk); =20 + if (ssk->sk_family =3D=3D AF_INET) { + inet_sk(nsk)->rcv_tos =3D inet_sk(ssk)->rcv_tos; + __ip_sock_set_tos(nsk, inet_sk(ssk)->tos); + } +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + else if (ssk->sk_family =3D=3D AF_INET6 && + ipv6_addr_v4mapped(&ssk->sk_v6_daddr)) { + inet_sk(nsk)->rcv_tos =3D inet_sk(ssk)->rcv_tos; + __ip_sock_set_tos(nsk, inet_sk(ssk)->tos); + inet6_sk(nsk)->rcv_flowinfo =3D 0; + } else if (ssk->sk_family =3D=3D AF_INET6) { + inet6_sk(nsk)->rcv_flowinfo =3D inet6_sk(ssk)->rcv_flowinfo; + __ip6_sock_set_tclass(nsk, inet6_sk(ssk)->tclass); + } +#endif + msk =3D mptcp_sk(nsk); WRITE_ONCE(msk->local_key, subflow_req->local_key); WRITE_ONCE(msk->token, subflow_req->token); --=20 2.53.0