From nobody Sat Jul 25 07:28:24 2026 Received: from eidolon.nox.tf (eidolon.nox.tf [185.142.180.128]) (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 923193B1032; Mon, 13 Jul 2026 08:12:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.142.180.128 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783930335; cv=none; b=DCXIelrclab8/k+JdOsrLUS6QfW8aNQxtNwRnPswSap6oBEtHkyv+EydUUSy4coNnI4WkkRZItSuavtDfOGZ1M4OpWGYwQldp/XkprIF/TjQTU5ZFlNtMsBgo/wmCgVTR7Hhn1KPzJg4GS4qi2YC5k+syIspOzpKEDCQWEocfoU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783930335; c=relaxed/simple; bh=3ajd/nAcGp77st83VI1YpV+CMBbB7AcCAMs7VZKKiqE=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=igS/+vtTUGWV9+4qYdjBxfu4hLMYQzuaiSRQxPbMnIl6FJ+ufrtufyDPy/+CJ45cVhejnNXhBioKWp0ppYrNh8ie2tmC5VS+91IWBDnDRriB1MBuJQRPjHE1u0Rx4ao3ZQsVCmA5WfwR2Mjoga/mHQ6eYr+NHLZO8ZW6YIFlapY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=diac24.net; spf=pass smtp.mailfrom=diac24.net; arc=none smtp.client-ip=185.142.180.128 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=diac24.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=diac24.net Received: from nat-wifi0.uniroma3.it ([193.204.167.180] helo=alea) by eidolon.nox.tf with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wjBh1-00000001NmY-1iGv; Mon, 13 Jul 2026 10:07:11 +0200 Received: from equinox by alea with local (Exim 4.99.2) (envelope-from ) id 1wjBgd-00000001FAn-2Qy8; Mon, 13 Jul 2026 10:06:47 +0200 From: David 'equinox' Lamparter To: Matthieu Baerts , Mat Martineau , Geliang Tang Cc: netdev@vger.kernel.org, mptcp@lists.linux.dev, David 'equinox' Lamparter Subject: [PATCH net-next] mptcp: sockopt: implement IPV6_TCLASS Date: Mon, 13 Jul 2026 10:04:37 +0200 Message-ID: <20260713080634.296011-1-equinox@diac24.net> X-Mailer: git-send-email 2.53.0 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" The IPV6_TCLASS setsockopt just needs to be forwarded to the individual TCP sockets, like IP_TOS is already handled for IPv4. The code here is pretty much identical, except there's no helper for IPv6 like IPv4's __ip_sock_set_tos(). 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.) Signed-off-by: David 'equinox' Lamparter Cc: Matthieu Baerts Cc: Mat Martineau Cc: Geliang Tang --- note: I wasn't entirely sure what tree this should be on top of, with the mptcp trees on github & kernel.org; this is on top of net-next. It shouldn't really matter though. --- net/mptcp/sockopt.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index fcf6feb2a9eb..edddafebb8de 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -394,6 +394,35 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_so= ck *msk, int optname, return -EOPNOTSUPP; } =20 +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); + inet6_sk(ssk)->tclass =3D val; + sk_dst_reset(ssk); + unlock_sock_fast(ssk, slow); + } + release_sock(sk); + + return 0; +} + static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname, sockptr_t optval, unsigned int optlen) { @@ -436,6 +465,8 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, = int optname, =20 release_sock(sk); break; + case IPV6_TCLASS: + return mptcp_setsockopt_v6_set_tclass(msk, optname, optval, optlen); } =20 return ret; @@ -1485,6 +1516,9 @@ static int mptcp_getsockopt_v6(struct mptcp_sock *msk= , int optname, struct sock *sk =3D (void *)msk; =20 switch (optname) { + case IPV6_TCLASS: + return mptcp_put_int_option(msk, optval, optlen, + READ_ONCE(inet6_sk(sk)->tclass)); case IPV6_V6ONLY: return mptcp_put_int_option(msk, optval, optlen, sk->sk_ipv6only); --=20 2.53.0