From nobody Sat Aug 15 20:32: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 31507280331; Sat, 8 Aug 2026 06:56:07 +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=1786172169; cv=none; b=dLEQojh4oISrAVhGFbGRDXUmHn1MOOCiNHf4fA+C6md+jJNVhOUDcHeAHwxkrFpxD/h10dhvCyg1pq+fnC863y5pXtKSV9NT9TfBQIbFIS1s5xg7U9mf/kskq1fN8cHJEBMP+ZaV7pwtdoQKkT+kEoMtSV7R2fi5G/7iWjy9pHc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786172169; c=relaxed/simple; bh=tjcQmC9X13vLV5s0rAOUH68SS0QKMQfhUttvxWBvD6Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WVuYvekZ+S1rWisbNUCN36JD8HnvjoEuHA1MM7A0eMR70h73v22ytpTgMwY/vhs9EDbhlNcxBIWWQyd/Y6YAc631I0V1qqlyDVIrer8BH6AhTHLR4xpB495BiyIwwevDL8AnnZJ6S1ksuQZ4hhrYfbsJMw6bZZI3ExX/0CL/rcA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OxWbENzL; 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="OxWbENzL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 18CD61F00A3A; Sat, 8 Aug 2026 06:56:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786172167; bh=ypOrDttMwRDVN4cZ8OF0F/KPJUSC5NDL+vN1YYTZczA=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=OxWbENzL8/t9ROL4iAURrGZ19ZdvtDa7J7tgtYzrNKosOEPh9KbfUpFJM/M2fPOJZ axkqvX8FFnoEHZlUOoWPiDnJwoWU0Q0dMmsqO6Dskj+PBWH9KYgsx6KjCJZPzmN4cR e1bA/PK5/YXvX9eQQIivitm9Vcts2yFOlf4Khm8KzNQh/cRcOF8Fv3iB+a6YStKXnO UwgQakDrCWnGIDIhcFJvUrnYf362GDHjMwjzBWQViOlc462ac+57xLOx880AByRxL+ ajERHf6oa0o+TNuO7ASE6l5kGFY4WbSx4N7GBoSbS0UGAAE0N72ZT3Ai2JHFZN0S9S yx5hVAiHVKVVA== From: Geliang Tang To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni , David Ahern , Ido Schimmel , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Hannes Reinecke Cc: Geliang Tang , linux-nvme@lists.infradead.org, netdev@vger.kernel.org, mptcp@lists.linux.dev Subject: [PATCH v2 1/3] ipv6: extract and export ip6_sock_set_tclass helpers Date: Sat, 8 Aug 2026 14:54:59 +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 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 small helpers __ip6_sock_set_tclass()/ip6_sock_set_tclass() exported via , so external modules can apply IPV6_TCLASS without duplicating the ECN handling. __ip6_sock_set_tclass() will be used by MPTCP's sockopt implementation (similar to __ip_sock_set_tos), while ip6_sock_set_tclass() will be used by nvme-tcp (similar to ip_sock_set_tos). Signed-off-by: Geliang Tang --- include/net/ipv6.h | 3 +++ net/ipv6/ipv6_sockglue.c | 31 +++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 3de07e738538..82e57b34ba57 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -1252,6 +1252,9 @@ 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); +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..c59f25fbb336 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 +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 Sat Aug 15 20:32: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 3681F280331; Sat, 8 Aug 2026 06:56:13 +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=1786172175; cv=none; b=D2phcELK0z+zuHTr4Tib+LdX+yuEZKRwPneL7TMsh1wCPm7F1aCvdHRIfOBotjANPi5r/bAivUx4A0skHEXx3kY0r++OGHjZAJ4L9awvR2sGVURvfx+7wqHO7SjIfo01wHGz3uSNmZeAQqB/+g5seQCMswayUkNojQmDvWx5UAc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786172175; c=relaxed/simple; bh=wnU18rO59vYny4m1dksZRR9Uym7qPigyN1s5mB7eEMA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XVQ7juSmjjhNEuAL2p9pX/cfQmgpMssEcGb69E4Zvu0CKFZg6f5VnCEqmnGF7sMMPPW5Nic2FO4JAHRccWG9IQqL35RVecoBxOsUnFHXHpJQ65QWuBfPfbVwGfDUInKQlk/JZWywaS73pANDsqHMqpLrufKmrtAMcdjp9xE3BDk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hdzpqnUI; 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="hdzpqnUI" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7A2571F000E9; Sat, 8 Aug 2026 06:56:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786172173; bh=Yul4QY+Tdr6oGd1fEwZXgGg1iq9NHlfdi5APnyMx7cc=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=hdzpqnUIA/C/M8bsYHrsDeHIsH/rh7hNEomSXsr1M38DcuONF4A2LErtIDNEim9pj rYkahJjlw8wxxplm+Pyy/W10LQ5a4QvbHx98YNlgOS1dOWsXcBSBY6PgfSbbasrBn1 UVYpNVmNT26KXEEBBMBTtDoT2AjCa5CuyLHTo/uh9ooq70LYeeLk7px7lrbgPBcPzB FHcxvt2AjvLpahVtdtcvX/hVLNLHNlw8FRjOojrVIxhkfkqvjOedV2fqafqSEBdISK vdmXwCj54/R3Fk3MzvbetM0j0DOpF8RkOzbPClbdOmuGsXYx3qv0p9mbhnPQO7f2M0 +RCI0VXF2K8wQ== From: Geliang Tang To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni , David Ahern , Ido Schimmel , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Hannes Reinecke Cc: Geliang Tang , linux-nvme@lists.infradead.org, netdev@vger.kernel.org, mptcp@lists.linux.dev Subject: [PATCH v2 2/3] nvme-tcp: support IPv6 traffic class Date: Sat, 8 Aug 2026 14:55:00 +0800 Message-ID: <3f5e4c84d3fe41601b29468fa4128d4639d56685.1786171863.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 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. 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 via ip6_sock_set_tclass() when a traffic class is specified, keeping the existing IPv4 TOS handling unchanged. Signed-off-by: Geliang Tang --- drivers/nvme/host/fabrics.c | 18 ++++++++++++++++++ drivers/nvme/host/fabrics.h | 3 +++ drivers/nvme/host/tcp.c | 8 +++++++- 3 files changed, 28 insertions(+), 1 deletion(-) 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 diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index ba5c7b3e2a7c..cabbf67d24f8 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1837,6 +1837,11 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nc= trl, int qid, /* Set socket type of service */ if (nctrl->opts->tos >=3D 0) ip_sock_set_tos(queue->sock->sk, nctrl->opts->tos); +#if IS_ENABLED(CONFIG_IPV6) + if (nctrl->opts->tclass >=3D 0 && + queue->sock->sk->sk_family =3D=3D AF_INET6) + ip6_sock_set_tclass(queue->sock->sk, nctrl->opts->tclass); +#endif =20 /* Set 10 seconds timeout for icresp recvmsg */ queue->sock->sk->sk_rcvtimeo =3D 10 * HZ; @@ -3041,7 +3046,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 Sat Aug 15 20:32: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 9812D376A19; Sat, 8 Aug 2026 06:56: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=1786172180; cv=none; b=rb18Lhknni/rOtsdQ2SuUPOsj8G9F3NshrHyxjuB4rECYu7YLoJwrvHV9Jgvvn+rnGNIxHF0h1ZOVnylvV1pT0pFFBSksqj+VrUnqCRl07tinBS0w25yPh5dk4W+xj/73GfIC6bTgzuHSPYrbRVHp8rLYPuzsVVhJ2JzTsDZo6M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786172180; c=relaxed/simple; bh=iKNubltje/DbF0zoiCKsalbe/R4Kp81SgSbhJzRz+tY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vnd3WvQfSFcoBQiR68pY2OoA/5QbGlmeot44bwtX8TaMJd/cCkUbOLkUbsyqxeD1WonNayvV8U1MX80bv8V4lOdpiSbVBauHFmGdffcVLjPHxFJrgYjfOX+iqpUuABs65MunwWy0DN0FedXTnd1Hz+U27OQN18FnM1cZiJWqP0M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SH5FOaiU; 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="SH5FOaiU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2063E1F00A3A; Sat, 8 Aug 2026 06:56:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786172179; bh=eOli6oQDuvK/j5yjuVJfio8ypK3vDCmN1PA1hPchLUs=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=SH5FOaiUpsypafEkbFKZt/ckxoPTspIen1L9PpnyuZ+1JGdbzIlToLyq8j5gmA+LA uB0Vs/NdC2YBfvenqs+tlajOzBRwjMnrz0DT5om1zNNu4haEW0TpXmwFTnJka4SgBe EBEvUQIsxMqQpjOnM4XjYJZk6kTvxgZTi/bicxiqi5tOpew1dk22k57fvaEOULQVHz QdXHs/jC8f/Y3RHCogjUe2vB6kToSj5LXMH5j2gd5RYviMutF6pdjY77ePBGaE0Q6p nQM0Az1BmI6/LIiiFWCbuuqvScMlMz5OL3pexZmyQcUdm1bDBpGm/frw/zGcT3PbqQ vaCZeOjDPzm2Q== From: Geliang Tang To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni , David Ahern , Ido Schimmel , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Hannes Reinecke Cc: Geliang Tang , linux-nvme@lists.infradead.org, netdev@vger.kernel.org, mptcp@lists.linux.dev Subject: [PATCH v2 3/3] nvmet-tcp: support IPv6 traffic class Date: Sat, 8 Aug 2026 14:55:01 +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's rcv_flowinfo and apply it through ip6_sock_set_tclass(). Keep the existing IPv4 TOS handling unchanged. Signed-off-by: Geliang Tang --- drivers/nvme/target/tcp.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 75a276d73be3..1d65519ebc0f 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -1725,6 +1725,14 @@ static int nvmet_tcp_set_queue_sock(struct nvmet_tcp= _queue *queue) /* Set socket type of service */ if (inet->rcv_tos > 0) ip_sock_set_tos(sock->sk, inet->rcv_tos); +#if IS_ENABLED(CONFIG_IPV6) + if (sock->sk->sk_family =3D=3D AF_INET6) { + u8 rcv_tclass =3D ip6_tclass(inet6_sk(sock->sk)->rcv_flowinfo); + + if (rcv_tclass > 0) + ip6_sock_set_tclass(sock->sk, rcv_tclass); + } +#endif =20 ret =3D 0; write_lock_bh(&sock->sk->sk_callback_lock); --=20 2.53.0