From nobody Mon Aug 24 20:41:39 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 709D03AD512 for ; Tue, 28 Jul 2026 11:40:14 +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=1785238815; cv=none; b=b6oNiUw3X7w+cdczXvriuaUlTl7VOYMkLW+K2Du9b8TVqYLyW1lokP7yq/nfYRtvCpubiMOToPE8RJP8M37MT1c3IUsUTDhpqjggAj///my16awb2PVTHiBS9iJ9Kx+Sah4EIEf9KooS+rJD5XFtl2HF3TjeD90UbNN4Ypjturs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785238815; c=relaxed/simple; bh=hnRdmd3i4pMqRlq2KAW5JlOwu1gHDhXakz3I13cZSUM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=egqL9rEhEwY40x9aBwkAMYgRofcrnMDn4H7gKZaqGyIFtS2VzMnBFVcbxRGOX/RVv/gnnnRtoD2XGUZvVEzg0Ye3OKPOftnFT4D4bVA8b8H6EEorwJHXFffqT3IYggtsxR7AzbpVlrAzjf/N8nt0QvMwP5kN2Q0/vwT5kBuUQYc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BzmIKVEa; 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="BzmIKVEa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7BE081F00A3A; Tue, 28 Jul 2026 11:40:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785238814; bh=YV0JXnpiXszaXfnHGLGoqUaEj8Uho1EeAyo0R88VJLo=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=BzmIKVEafDkytWbbCKjcmD3S9WUsJr3jRkRlrR/1778Ihi6E6Z+/Mb1kRpkeeoNmP CqckBQQuGP0lPkHNmg8lw5bivC3pbTQy0ECTQNC4g258hybCMHHYPL1b06pw9+l1Ip juTKfo+NsJ1JEfO8OTxukeJo0J5QYKwMmVPro/zaueVJzTSFrm1PaX9rSNtZrJBtTF loVJJH1yvg/sfyC9eiaKELKy2oRGogT9OWrKar6hCEbocLgmbnKtfF+Z8soXooU/LO rpitqF+QJFkKeUnC4ywHo6P7ztiXyZdz/Yzh9L1K90ZrIjWqqszrbgvimlOrhAtb8w lrXXqzbFKmZYA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 1/9] mptcp: inherit sk_reuse/sk_reuseport on subflow creation Date: Tue, 28 Jul 2026 19:39:34 +0800 Message-ID: <2fed2c35a415e9513bc79ecc3b050ade7e9c2b90.1785238723.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 Propagate sk_reuse and sk_reuseport from the master socket to newly-created subflows. Without this, subflows created after the master toggles SO_REUSEADDR/SO_REUSEPORT would not inherit the setting. Also bump setsockopt_seq in the SO_REUSEPORT/SO_REUSEADDR path so that subflows created later (e.g. via MP_JOIN) trigger sync_socket_options() instead of skipping it. Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index fcf6feb2a9eb..37e65923f544 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -326,6 +326,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; @@ -1601,6 +1603,9 @@ static void sync_socket_options(struct mptcp_sock *ms= k, struct sock *ssk) inet_assign_bit(FREEBIND, ssk, inet_test_bit(FREEBIND, sk)); inet_assign_bit(BIND_ADDRESS_NO_PORT, ssk, inet_test_bit(BIND_ADDRESS_NO_= PORT, sk)); 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) --=20 2.53.0 From nobody Mon Aug 24 20:41:39 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 EF3BD3AD512 for ; Tue, 28 Jul 2026 11:40:15 +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=1785238817; cv=none; b=aS7xOwHLxHandY/GiXiC2eLz935VDg6RL2n1pACWnuu0lxUFUT8Tn/MRA+QNiYR3yYP3uQEQVz/g3OOrspYGeQIqbqpxR1xlSbcSi1TzZ85N9aFZ5lrXYoscwJlXstsM7rjALjWLIJxRFolzh+XN8Q94b7LtIRFcpmZQv1EIi70= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785238817; c=relaxed/simple; bh=kk0D3Cu9w0/3UuowOtQsb7momeqoPNl2h1YDokcuBlo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Fcdv9r9NpS391VMl9xeEbDsfFA8ZikeCT5g4FBiL6jnoiThD2tzDUuir9EQnFpsxm3wxNvqVTx9fLn9myzZmLOVQsHD67hSOV+aRKHRd01wZkxbx92wSUvcqfPKY1zQg3m+NADgTbKW2+O7ovfiumU42Q0MIwSiIY2PErw86GaQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QaFg4tJU; 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="QaFg4tJU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AE90E1F000E9; Tue, 28 Jul 2026 11:40:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785238815; bh=E1ea4hOszjWN+JFqnbAEFVGA8MgKCluidESeC82tVFo=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=QaFg4tJUS32FhWmaImfVdM6Vf7yT2tESb67kaK2sg5BopejUxS9EChXMb7pZFnojq Cs98RexVuwLFmoNinkdyway/XDUtvfhtE1nhuojH19sLEeFKgwBQCdEO2I6/PJoeLu brxcLRyB075OsCRB5gmmoCGqjRRYeGaZ0l7ULyp/9ZtmQxQue9X0/OfiSREhZD4Xsq OyFQ0CJ4c0p6tuJWoCf9Hy0W6Nw7iWb64jC9E20NjmB06YnLbHmC2LZ/nxOA01R9/W UsotBlmYLZQljP5gu53c3mgPg2/EUdQj/u+wWrVl2BL6j6ABnK6MCQJNBdpNSwXUBw cU3R77ywuJOdw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 2/9] mptcp: handle TCP_MAXSEG getsockopt in common case Date: Tue, 28 Jul 2026 19:39:35 +0800 Message-ID: <7de71aa6c2a057b05a5d3e7f30dc73177af0592a.1785238723.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 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 37e65923f544..34f6cd9c7967 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -1425,6 +1425,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: @@ -1449,9 +1450,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 20:41:39 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 050973A7F48 for ; Tue, 28 Jul 2026 11:40:17 +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=1785238819; cv=none; b=DhSLqC+hGQR/mqgkwBbaQVkhtTXEp38bNfm5iLUmUb85I6LZ9mBCvmGoE+MI1TSgBJJlUahJ+MZ0o7dgNoriGYU/u5nWWGRKkJdQ5ryUs9/LiaWyfgQsFgvYprxYWrB0VKhwcOWr7EA9bmOIZRlYU1FtQOB/9fyCGGVvZ32mve0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785238819; c=relaxed/simple; bh=I/0vubeE2HrX2ECAE/GU4FDUuSWbA7qingLtTsYGrW4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=M0DuzOSYhQC49xq2VUe/nJAk6wxFIgE4Zt7NyTPFTodxAiyFRfqJbWdZp2Hq2wOI69NiKT/x4F0jFghp9pGwONYWagc7+pU6I6v311o8Z+bFlqM4tSStZZhX/YuBE62jW8W/ZzPaa1wyx+HmlRlLxdAQdmCmcB/Nl1rhCjGrLmo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DVt4/dpX; 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="DVt4/dpX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6FFF61F00A3A; Tue, 28 Jul 2026 11:40:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785238817; bh=69BG0JqQaPbbXDTdxHpX8V2YRTLLlGpOkzXIpdKhaS8=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=DVt4/dpXq11byya23GrcDMgBMeQuxQSdQq1oZc6IwBYT3+2PQPMSNPE+5m7CE8Szf nh/s4JqIagrA1tuzUNAxmcUWiEdb1Buvx9LbQegwck7bYNfn0EOrko4cbEp+0CXmCG Pbwe2n2royPzYB7ttlEm8hRJrgBhSiu+T5mwepZMjXAYFMcs9hJo7le/aMxOoq/21t nzVKZr88ihgXg6y8MqWywupswOj9c8mND45bWAnY8ZfbG4ErWIjMs32//aNKAArgEs eKf7XjcxsxWdVtQ18QQUsB3K7F8Snsl5luS6TFvernWs6B/c9lsKD5OYzPlpjmfb/d EVuUbGXD7R09g== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 3/9] mptcp: add TCP_SYNCNT setsockopt/getsockopt Date: Tue, 28 Jul 2026 19:39:36 +0800 Message-ID: <771e3596a04c47fb824823dc194332bea72faf41.1785238723.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 34f6cd9c7967..dbfae244a731 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -898,6 +898,13 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock = *msk, int optname, ret =3D mptcp_setsockopt_all_sf(msk, SOL_TCP, optname, optval, optlen); break; + case TCP_SYNCNT: + ret =3D __mptcp_setsockopt_set_val(msk, MAX_TCP_SYNCNT, + &tcp_sock_set_syncnt, + &val, val); + if (ret =3D=3D 0) + tcp_sock_set_syncnt(sk, val); + break; default: ret =3D -ENOPROTOOPT; } @@ -1450,6 +1457,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; } @@ -1552,6 +1563,7 @@ static void sync_socket_options(struct mptcp_sock *ms= k, struct sock *ssk) static const unsigned int tx_rx_locks =3D SOCK_RCVBUF_LOCK | SOCK_SNDBUF_= LOCK; struct sock *sk =3D (struct sock *)msk; bool keep_open; + int syncnt; =20 keep_open =3D sock_flag(sk, SOCK_KEEPOPEN); if (ssk->sk_prot->keepalive) @@ -1604,6 +1616,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 20:41:39 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 90AE53A7F48 for ; Tue, 28 Jul 2026 11:40:19 +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=1785238820; cv=none; b=E3c3AqUl43JUy8CpJqpF7DQtuf/ou2nqntQKJKMMNQlfa9W531YYmRmN184fXZAndXDuIDkVrOWS6MYUak1jFm0Npz4cPYJquomGT8pJnyMWLOZsdb7giKbaMPmJqIaqUWUBODcNvVj70f/ns5rGWI0hsExQcWuvgm9NC8CwRoU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785238820; c=relaxed/simple; bh=+3ZNqam3OgUK37tg0PLIbX89PhrMlhLhapjyCXRT0Yc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Mr6thVRLSF6ZTRXYI2yeWuhfnw63rS7MKcthwhp2STbkdGIMycp0peTzIOeUoHbZY+ef95pnLzvhVNTxHnFTS9s6lNuVsuQBeuJWI5Mjbo+4Y2ydEEOEsQxhSWixRhcIinv89I2KQFM3S0Cw3dVMtUkIWTyeSoJ1f+F0OiDEmfM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LJ8ufj6C; 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="LJ8ufj6C" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 49B6C1F000E9; Tue, 28 Jul 2026 11:40:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785238819; bh=z4kGRJVHSIpKTzNFTx6fMaPZ2H4yswBG6fbwV1OtduE=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=LJ8ufj6Cd34Dcy1hMVPjmu6r7f7y+6dc88gyonW/otMkyjwqnW23zBAa+Ddv296gT 5l5zesvzKI53kmJMvfKa4HKJUE7rbFOeJaTxOjzFkVzzODewP90PmpszJgLQQoDEnl qKgiG9UdjLbGmSzduvRvGmohzFIGbeph0ZcScD8L590EDjMZajJLxxDWXlBRnALiqG KOOaTrlYtMo2EmTh8btJILhcj0rH/q2Yp3uJgcyC5/HWdQTDIVGkONCMu7GcRuyJY0 7tUZAXtp3cYUb7pJvZg0juEhRiFCfzoCDiMHMhCWM0HsFNM/oh36ykV6Lz679yDOT8 bpQRDjnXzx10Q== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 4/9] ipv6: extract and export ip6_sock_set_tclass helper Date: Tue, 28 Jul 2026 19:39:37 +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 The IPV6_TCLASS case in do_ipv6_setsockopt() inlined the same ECN mask handling and inet6_sk(sk)->tclass write that callers need to do when propagating a tclass value onto a freshly created socket. Pull this into a small helper exported via , so external modules (e.g. nvme-tcp, nvmet-tcp) can apply IPV6_TCLASS without duplicating the ECN handling. Signed-off-by: Geliang Tang --- include/net/ipv6.h | 2 ++ net/ipv6/ipv6_sockglue.c | 31 +++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 3de07e738538..d61ccb48b5a5 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..34a25583942f 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c @@ -373,6 +373,28 @@ static int ipv6_set_opt_hdr(struct sock *sk, int optna= me, sockptr_t optval, return err; } =20 +static 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); + } +} + +void ip6_sock_set_tclass(struct sock *sk, int val) +{ + sockopt_lock_sock(sk); + __ip6_sock_set_tclass(sk, val); + sockopt_release_sock(sk); +} +EXPORT_SYMBOL(ip6_sock_set_tclass); + int do_ipv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval, unsigned int optlen) { @@ -713,14 +735,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 --=20 2.53.0 From nobody Mon Aug 24 20:41:39 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 B78273A7F48 for ; Tue, 28 Jul 2026 11:40: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=1785238822; cv=none; b=iSpl4fC1oqUY0wH9e2rYFEeQ3F/OKqlA4KO7ILMwB2cp+aRtxQx43GQJoPFYqrnCICg60uaOi4S1TDFPA9dSQrXhW0Gto/+TSCrHhNkj72V7Hz2YnJqhrL8oIu45ocq2TZLxf53d4QGyeMfvLZZmYtZXpmnwA3juMDXNaL9/G5s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785238822; c=relaxed/simple; bh=z+MT6iHR90MH7fR8Zl/cDG8NUYSXrnAPDc9MrmBqMnc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YRkrgCvk3u8MyXdrXg5ooUlvQGzgrXhnEBaepqf2plxg1q3OXHMwaKYvDZQRYl4gLjHtrR7/63IhG9Xlt5MxoEcCOQ12ZsI6CR9gJvP+hnRdFS4JBrqNB9++e7nRQCuJ4TuAPbYUwg8JJqBvKQO6jn2hWlwwhnn90cQGfTMf3E8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eLiBVrxm; 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="eLiBVrxm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 22A781F00A3A; Tue, 28 Jul 2026 11:40:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785238821; bh=xwgSsv+t31v8M0nIbsj0ejN/HhnKtVUxm/+T4c2rE4M=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=eLiBVrxmhJfeyYR60Hk5Zg/2JDJuilVzQ/0fqONRJzrMfRb91H0KeS78UokSDuyO4 gdagj+TcWF6d8n5upYf9//EvC8U3GpZKZf+bCBsta/1/thL41CncmhMBJ9WpNdMnnQ vmKC7/0L75pV1oQzsXgXvYEkfSEWvUrwDIRbg2I5Kabsgzs5/4FN1mVv6DPfUHvkq+ qRWW1NZMDUrzy+Sf6o/gBxGrtoTt00n1vdpegzVZmGvxoadPMQS/35tvFJ3Cc9wiaU Lc7c349xwbGEG9fEJKCAOqOeIXlQqeWxgV/qKz+MXAELd4FYusa13Oo55U9eSI2cvD 1+nl2NRRAeiDQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 5/9] nvme-fabrics: add IPv6 traffic class option Date: Tue, 28 Jul 2026 19:39:38 +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 The NVMe/TCP transport needs to configure the IPv6 traffic class on its queue sockets, but the fabrics option parser currently has no corresponding option. Add the tclass option to the fabrics parser and store the validated value in struct nvmf_ctrl_options. Negative values are rejected, while values greater than 255 are clamped to 255, matching the valid range of the IPv6 traffic class field. Keep -1 as the default value to let the transport use its default traffic class. Signed-off-by: Geliang Tang --- drivers/nvme/host/fabrics.c | 18 ++++++++++++++++++ drivers/nvme/host/fabrics.h | 3 +++ 2 files changed, 21 insertions(+) diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c index ac3d4f400601..643c03dc7bcb 100644 --- a/drivers/nvme/host/fabrics.c +++ b/drivers/nvme/host/fabrics.c @@ -695,6 +695,7 @@ static const match_table_t opt_tokens =3D { { NVMF_OPT_NR_WRITE_QUEUES, "nr_write_queues=3D%d" }, { NVMF_OPT_NR_POLL_QUEUES, "nr_poll_queues=3D%d" }, { NVMF_OPT_TOS, "tos=3D%d" }, + { NVMF_OPT_TCLASS, "tclass=3D%d" }, #ifdef CONFIG_NVME_TCP_TLS { NVMF_OPT_KEYRING, "keyring=3D%d" }, { NVMF_OPT_TLS_KEY, "tls_key=3D%d" }, @@ -734,6 +735,7 @@ static int nvmf_parse_options(struct nvmf_ctrl_options = *opts, opts->hdr_digest =3D false; opts->data_digest =3D false; opts->tos =3D -1; /* < 0 =3D=3D use transport default */ + opts->tclass =3D -1; /* < 0 =3D=3D use transport default */ opts->tls =3D false; opts->tls_key =3D NULL; opts->keyring =3D NULL; @@ -991,6 +993,22 @@ static int nvmf_parse_options(struct nvmf_ctrl_options= *opts, } opts->tos =3D token; break; + case NVMF_OPT_TCLASS: + if (match_int(args, &token)) { + ret =3D -EINVAL; + goto out; + } + if (token < 0) { + pr_err("Invalid traffic class %d\n", token); + ret =3D -EINVAL; + goto out; + } + if (token > 255) { + pr_warn("Clamping traffic class to 255\n"); + token =3D 255; + } + opts->tclass =3D token; + break; case NVMF_OPT_KEYRING: if (match_int(args, &key_id) || key_id <=3D 0) { ret =3D -EINVAL; diff --git a/drivers/nvme/host/fabrics.h b/drivers/nvme/host/fabrics.h index caf5503d0833..3dfd40bd8960 100644 --- a/drivers/nvme/host/fabrics.h +++ b/drivers/nvme/host/fabrics.h @@ -67,6 +67,7 @@ enum { NVMF_OPT_KEYRING =3D 1 << 26, NVMF_OPT_TLS_KEY =3D 1 << 27, NVMF_OPT_CONCAT =3D 1 << 28, + NVMF_OPT_TCLASS =3D 1 << 29, }; =20 /** @@ -109,6 +110,7 @@ enum { * @nr_write_queues: number of queues for write I/O * @nr_poll_queues: number of queues for polling I/O * @tos: type of service + * @tclass: IPv6 traffic class * @fast_io_fail_tmo: Fast I/O fail timeout in seconds */ struct nvmf_ctrl_options { @@ -139,6 +141,7 @@ struct nvmf_ctrl_options { unsigned int nr_write_queues; unsigned int nr_poll_queues; int tos; + int tclass; int fast_io_fail_tmo; }; =20 --=20 2.53.0 From nobody Mon Aug 24 20:41:39 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 986723A7F48 for ; Tue, 28 Jul 2026 11:40: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=1785238824; cv=none; b=hW/xD5h5bPqn4hWdUA6KM9f/VY4Ellk6N3yMq+2JCrbkQ/zR8HeQfcPbLHGKHpTWYRengwAnonX3Ow6U3Zlwe4Do6yxo+FDlbS4HsDix2+xP+Ai9iPls0yYU2b3fKGBNQNAlTyjZ28LtOahe334KF0WFawTrMYkMVpKKrKM9nWU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785238824; c=relaxed/simple; bh=AjZ1WSulHSmj89YlRW2OgkXlmqRlw11HjQRD4f4M34Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=poDXrz9ig69BPzzLe2NX6DKsETbVra30hjpYRJc1UfXaVc0v1iZJ0Jb3G9mlGGP14y5yvv0c8RLywSdP3rsCp4cslL/Sz1o/zGqUt463cRNUtzerDGrXP8dnkREZLQkB4d2D1yqUd+vJD7GZ3UziAlOpl8/oy17QsHNDevMeC+I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aMTbs44O; 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="aMTbs44O" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 156FB1F000E9; Tue, 28 Jul 2026 11:40:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785238823; bh=tIcG6b3HvL/2LQLJf2cMCuROBvCrA274D5Z+Qrjw5Ws=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=aMTbs44OVaTvPAFL+J+6KFigLcWAT8AJ61ipFh9kYVAXHwbsYTZMjzZGW4S4vhikz jgy58hPAjhHMw4gSlHp2oECX0TftRJHHVP5lzQzkeKlT5cpowlEUPsQnFPe0mE+FAf gjKGLS3o9wAlpzj3osJEkqO2jbFq1Z5D9LPqNDU3LutMQKhCA0BBzfqmWflwM+E/x3 TGDLzWqSKoCSEYsHAh1tjbBukhA8d1MjAfQiUtvsQ1PBziUvx5f6ZIIBNCWqnJ66NK rJAuyK4h/Qbl90KH3lBw2Ba0tGpqpVj1deLpsuBnngqf3msuK3qNXKbc2aNrCYlNeS FfBvrXd9IhwnQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 6/9] nvme-tcp: support IPv6 traffic class Date: Tue, 28 Jul 2026 19:39:39 +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 The fabrics layer now supports parsing the tclass option, but the NVMe/TCP transport does not currently advertise or apply it. Allow NVMe/TCP to use NVMF_OPT_TCLASS and set IPV6_TCLASS on each queue socket when a traffic class is specified. Keep the existing IPv4 TOS handling unchanged. Signed-off-by: Geliang Tang --- drivers/nvme/host/tcp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index ba5c7b3e2a7c..a9bb1568d929 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1837,6 +1837,8 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nct= rl, int qid, /* Set socket type of service */ if (nctrl->opts->tos >=3D 0) ip_sock_set_tos(queue->sock->sk, nctrl->opts->tos); + if (nctrl->opts->tclass >=3D 0) + ip6_sock_set_tclass(queue->sock->sk, nctrl->opts->tclass); =20 /* Set 10 seconds timeout for icresp recvmsg */ queue->sock->sk->sk_rcvtimeo =3D 10 * HZ; @@ -3041,7 +3043,8 @@ static struct nvmf_transport_ops nvme_tcp_transport = =3D { NVMF_OPT_HOST_TRADDR | NVMF_OPT_CTRL_LOSS_TMO | NVMF_OPT_HDR_DIGEST | NVMF_OPT_DATA_DIGEST | NVMF_OPT_NR_WRITE_QUEUES | NVMF_OPT_NR_POLL_QUEUES | - NVMF_OPT_TOS | NVMF_OPT_HOST_IFACE | NVMF_OPT_TLS | + NVMF_OPT_TOS | NVMF_OPT_TCLASS | + NVMF_OPT_HOST_IFACE | NVMF_OPT_TLS | NVMF_OPT_KEYRING | NVMF_OPT_TLS_KEY | NVMF_OPT_CONCAT, .create_ctrl =3D nvme_tcp_create_ctrl, }; --=20 2.53.0 From nobody Mon Aug 24 20:41:39 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 1CD093A7F48 for ; Tue, 28 Jul 2026 11:40: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=1785238826; cv=none; b=PvVJQiYQ28C8WYJzZ2DXI9DDKGWcvUkJ5qWIkRlNamy9+JZpiBL7lyvf8fzZR7V8l6AvF92pLYygcU7omOuk9nwFic2XpnV6zJQpKPjfyEGZCNHyBBJnw6Y0vr3UVeXpUbrIJ4bY5EZyI+LPxT1hLJRfdz3l0GmVPqHwZnyeYas= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785238826; c=relaxed/simple; bh=jrmEqBcW+YfyX0GDfc5NSOoAfZUxpVbWWG3TGa3Vl80=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XLWc1pPIBrWFjNwqkIZ4TcHt9VzpD4PDdQK87o4k9LXs16rpwW6zKmLwuTuMUd32Jy7dUMBUMnQoObxPkM9LBsA/lWsB1eE7WVvt1j+LWdCSNNcG/JIPHddabBAgRsaZU2NimETS2VbRtp+lKpnXcvlewAY+b9eTPfZRncmDLmw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=buz4uBbn; 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="buz4uBbn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CA2851F00A3A; Tue, 28 Jul 2026 11:40:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785238825; bh=pcL0niRVO2GkZX45imZtqOuw/NWgsuyAotnDCGLuWfM=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=buz4uBbnRLEDsfyNDVz+0GQYRh94ceeuRaO07giGUDTtA5Z/bCe37DlYd8H7OKARy PGo+rPcusMY5QEwZ9hjTw3yXkGxxoA0MPGmbMtPslS/MaaW3y9HqY3P5P7BY4vSYtJ 4/o7bR1sBbCMxpBNzOdcbaN9NNjIM0ESjKq0HrV93x9v2ZkZvhq2Vmiq67W2fK4P90 VuKJIgarpmC9LCoeVBk8dw7nz1F1thnmbL4ozm7kIVNVbzmHuhXa9GOIbPFVZxb5+L ChbMfFOFJ2Rfv4fuK5MohW9Onmu8fxL7/EG/4x3qL4D8vBb/+m7vkcKOWMVYc9t1fU HkHhWka4G9Tlg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 7/9] nvmet-tcp: support IPv6 traffic class Date: Tue, 28 Jul 2026 19:39:40 +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 nvmet-tcp currently applies the received IPv4 TOS value when setting up a queue socket, but does not handle the IPv6 traffic class. Extend the queue socket setup to handle AF_INET6 sockets. Obtain the traffic class from the IPv6 socket and apply it through IPV6_TCLASS. Keep the existing IPv4 TOS handling unchanged. Signed-off-by: Geliang Tang --- drivers/nvme/target/tcp.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 75a276d73be3..95cd57196973 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -1699,7 +1699,6 @@ static void nvmet_tcp_state_change(struct sock *sk) static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_queue *queue) { struct socket *sock =3D queue->sock; - struct inet_sock *inet =3D inet_sk(sock->sk); int ret; =20 ret =3D kernel_getsockname(sock, @@ -1723,8 +1722,17 @@ static int nvmet_tcp_set_queue_sock(struct nvmet_tcp= _queue *queue) sock_set_priority(sock->sk, so_priority); =20 /* Set socket type of service */ - if (inet->rcv_tos > 0) - ip_sock_set_tos(sock->sk, inet->rcv_tos); + if (sock->sk->sk_family =3D=3D AF_INET) { + struct inet_sock *inet =3D inet_sk(sock->sk); + + if (inet->rcv_tos > 0) + ip_sock_set_tos(sock->sk, inet->rcv_tos); + } else if (sock->sk->sk_family =3D=3D AF_INET6) { + struct ipv6_pinfo *np =3D inet6_sk(sock->sk); + + if (np->tclass > 0) + ip6_sock_set_tclass(sock->sk, np->tclass); + } =20 ret =3D 0; write_lock_bh(&sock->sk->sk_callback_lock); --=20 2.53.0 From nobody Mon Aug 24 20:41:39 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 E89724248B1 for ; Tue, 28 Jul 2026 11:40: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=1785238830; cv=none; b=V6PkU6ox24HP+S9XRA5yTs/9IYoLnUdZ/xqfGmR31DEqUOgdWWZ8Yd5jeLGDHd48OMneJfI9Eec7/9kxC1Tibpd/NXtpbyrkLH9B5XGb/E0pPe6PZyujEod0ExRY59yhh9zbx1y809TL6DxFjNyvzGvzHhxRAvqMxb1CuLEb9gU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785238830; c=relaxed/simple; bh=Fd6JYCHxVTeGccxrws8f8opkIAjjrxbL9efbOMplhBk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GvMiX2aIdw2P1p8uLZ/oCUkcevxE/sdtRiIisFkTCQxieDe2J5m5acY8aRN//D7bFrmYdDMA7erZEQkyCtcJxKWMLQLWMqjSgOKL+DT/nW143Lg9eZR5ehYXWh+i8hSSOoq9KCPLrWZl1J6tkQxess1mISTgXFMzkjpYylNoPiE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=X3XasJrX; 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="X3XasJrX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A3E081F000E9; Tue, 28 Jul 2026 11:40:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785238827; bh=gEv34C4Ft6ujnBwBMcpAgnfM4HGEYX5QCGRky+RjKsw=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=X3XasJrXSozANTAPJKn6nP6KPFWAGiMgDnhTxUsgexqF5bxWHBcPhV5TLLnNCP0oK IVKNmpjvv4wu0l6SZad2++RZkq2W6vELcECO6kiIkoij6tjnuKCOAirq0rNEKWPRoh vuwex3fXfVZTjfuGorgfall4nH28PNkFuZqSuDO++fCnFTEO9rLcrq/3+3L2CTJFXM Q1XefKPizPrcXtBak97MLL3cS1t9y3MaiHrphy3h/SbWH4ghuUSkuTY2SXj7VWwyn1 TdTKwjzhSXhO+XgB80O3SorBKmT4tK5zCpO0EcOhPitqMxsHeDaBNL9BFI864WLBv7 W2+KRufKANhfw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: David 'equinox' Lamparter , Mat Martineau , Matthieu Baerts , Geliang Tang Subject: [PATCH mptcp-next v3 8/9] mptcp: sockopt: implement IPV6_TCLASS Date: Tue, 28 Jul 2026 19:39:41 +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.) 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. Cc: Mat Martineau Cc: Matthieu Baerts Co-developed-by: Geliang Tang Signed-off-by: Geliang Tang Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/568 Signed-off-by: David 'equinox' Lamparter --- include/net/ipv6.h | 1 + net/ipv6/ipv6_sockglue.c | 2 +- net/mptcp/sockopt.c | 44 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/include/net/ipv6.h b/include/net/ipv6.h index d61ccb48b5a5..03b87a818c51 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -1253,6 +1253,7 @@ static inline void ip6_sock_set_recverr(struct sock *= sk) } =20 void ip6_sock_set_tclass(struct sock *sk, int val); +void __ip6_sock_set_tclass(struct sock *sk, int val); =20 #define IPV6_PREFER_SRC_MASK (IPV6_PREFER_SRC_TMP | IPV6_PREFER_SRC_PUBLIC= | \ IPV6_PREFER_SRC_COA) diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 34a25583942f..c59f25fbb336 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c @@ -373,7 +373,7 @@ static int ipv6_set_opt_hdr(struct sock *sk, int optnam= e, sockptr_t optval, return err; } =20 -static void __ip6_sock_set_tclass(struct sock *sk, int val) +void __ip6_sock_set_tclass(struct sock *sk, int val) { u8 old_tclass =3D inet6_sk(sk)->tclass; =20 diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index dbfae244a731..c3af056a8080 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -396,6 +396,36 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_so= ck *msk, int optname, return -EOPNOTSUPP; } =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; + + 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; + + 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) { @@ -438,6 +468,11 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk,= int optname, =20 release_sock(sk); break; +#if IS_ENABLED(CONFIG_IPV6) + case IPV6_TCLASS: + return mptcp_setsockopt_v6_set_tclass(msk, optname, optval, + optlen); +#endif } =20 return ret; @@ -1505,6 +1540,11 @@ static int mptcp_getsockopt_v6(struct mptcp_sock *ms= k, int optname, case IPV6_FREEBIND: return mptcp_put_int_option(msk, optval, optlen, inet_test_bit(FREEBIND, sk)); +#if IS_ENABLED(CONFIG_IPV6) + case IPV6_TCLASS: + return mptcp_put_int_option(msk, optval, optlen, + READ_ONCE(inet6_sk(sk)->tclass)); +#endif } =20 return -EOPNOTSUPP; @@ -1619,6 +1659,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 20:41:39 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 418073D0930 for ; Tue, 28 Jul 2026 11:40: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=1785238831; cv=none; b=hvilmKyWmFqmf4cYMYtkcI/BK0dVv8BdiCNQ/LEDyEq4gSbI8VeyssmFanWdBGgNqS8jhaDW1tJNnHQCcd1oGIDYm6TzBa1YhA/ugIxzz4lNXfGRstGpOq1GSl5QaxXaz7nAyz934WjqlzpPP2p89CjT6LCMrJUfcTTgTil6BqU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785238831; c=relaxed/simple; bh=+7CRiwnxuHoLwr7WcT/rInVjdEOX0bFMa5dd7l4MLLk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Oog+y20PnK5jHkF0Ejt6SMNnuD2s07FsDMZSlE7x8of7AvtXi12vaWQSxF+O0TCKvjCeYNPUvpsjLM4mzGhVjnjSiZ+Qb/42MzBQgS9pdz3CaorpNc9ZeWyY63o7mJ8nM9JVF5hJJ7DTj5tnlhQ/OFVZwEPz6B1T8MSCfYpngxQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dLJnkTK2; 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="dLJnkTK2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CE7701F00A3D; Tue, 28 Jul 2026 11:40:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785238829; bh=Hj5gKs7hvWneVEMpjZqbbE7be+btTBdPn9D/aUYhVK4=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=dLJnkTK29WNM6fOllDkRgLSbzRXJ3rItqbguUsM9nGlxsurgFrP3t55OWlXV+m9PG 1m5W5YHAJSHe1tl98VEfeQUpgbXweZwRLrHlg1pF46JdGNTGlB1Ay6c8kF4xHuOXuZ oXE3aIbTTv6dBjqJGylThMTZDSiIWPi4QUNk+PRIWo/iK8gL/9Obg4wxvkWj4R2y3B nHUTcxKds6FrCGfUUwTzH8JZ7cB2HrTCpfJDevHSZTBevuSrMwl+QuKwq9USIJozpl IGb/73T8OUxH30fKNDcu54B1yyWM64gAeJiiHAGhLFx8n4LpkhCYNJ6TLWNHaha2HW 6O34L6qlYT/nQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 9/9] mptcp: copy the subflow's tos/tclass to the msk on accept Date: Tue, 28 Jul 2026 19:39:42 +0800 Message-ID: <1154f727f96c3edd101c27eb4a68b100b8d69b2b.1785238723.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 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 954e20bb27de..749abfc28987 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3699,6 +3699,17 @@ 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) { + 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