From nobody Wed Sep 17 18:16:52 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 AFB562DECC6 for ; Tue, 12 Aug 2025 08:26:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754987184; cv=none; b=T2bfn7Zb0jJMMVKcvz830DNSknOMxhoIcCL8MRaZOqxbHi8D4eZvwht3ba0qDsLWh9BcCyUsGE1DTtg2aAzhU+faLLWdKiDWt83jkqKUr7yu7YpkyC2SPmgbFo39q31bbDX0LbdNADgmL8MsvU2Vxx0LMnFx2KsjytT7027ve20= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754987184; c=relaxed/simple; bh=fOSL+P7SXaMOUYWaJ2bZSr5gFszy4n5wCsvvBKv11Z8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MuhMQvdd742B3h9PjYpSbSaxuN3v9yD1Av3m1xUOsQyHvEObR1X32I3Daqa3fGDgHxoJ8DzFmYThc71qejDgC8woQP1ceMUOVfbbxbY4dJOwSucE+L89rMfrn+W2LN66MBfRrMKm0wpGXFgJV/3qUfzx1avQdXGO0S7khqpakx0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ifBcJfCk; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ifBcJfCk" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F2DD1C4CEF0; Tue, 12 Aug 2025 08:26:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754987184; bh=fOSL+P7SXaMOUYWaJ2bZSr5gFszy4n5wCsvvBKv11Z8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ifBcJfCkXadMBwiOgVcONw1YeD+nzZdtdy54Xwc6f8v3bAwGjIpBFvlHaMI7cm7AN 7aPTcIaMxJdK2klP9bVpim/hpIWre4qTfJKp3/ww4JbFremXtesAkWMWVQ0/B+Zc0h eEy+b4uBaYeKQCUDIyge9XNhjRyWqkYxBzpQpVO3MG6GozgDboZa9dAieObQSr7Hsu 7eDmZHwQSJE5gJd0ocyQzUeR+pMpUbLYHo21wyRsqm57h7W4lAVJscPxkG164bPBgD 8wcLiUHeYDbOKkzpIE9KDlVO2x/mU2wUHgjUKcXfISc6nljksWvODRa3eJLSpGYcX8 oLOllEhVDJk8A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang , kernel test robot Subject: [PATCH mptcp-next v2 1/3] mptcp: add IPV6_TCLASS socket option support Date: Tue, 12 Aug 2025 16:26:12 +0800 Message-ID: <2617b8684039574734b8622936ef126d6a7cd519.1754986785.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 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 Implement support for IPV6_TCLASS socket option in MPTCP: 1. setsockopt(IPV6_TCLASS): - Sets traffic class on main MPTCP socket - Propagates value to all IPv6 subflows 2. getsockopt(IPV6_TCLASS): - Returns current value from inet6_sk(sk)->tclass 3. Syncs traffic class to new subflows Mirrors existing IPv4 TOS handling and ensures consistent QoS across subflows. Fixes reported issues with traffic class propagation in MPTCP. Reported-by: kernel test robot Closes: https://lore.kernel.org/oe-kbuild-all/202508021003.tEAjvv2S-lkp@int= el.com/ Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/568 Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 5b0648ab663e..bb296813c578 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -458,6 +458,9 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, = int optname, case IPV6_FREEBIND: return mptcp_setsockopt_first_sf_only(msk, SOL_IPV6, optname, optval, optlen); + case IPV6_TCLASS: + return mptcp_setsockopt_all_sf(msk, SOL_IPV6, optname, + optval, optlen); } =20 return -EOPNOTSUPP; @@ -765,7 +768,7 @@ static int mptcp_setsockopt_sol_ip_first_sf_only(struct= mptcp_sock *msk, int opt return 0; } =20 -static int mptcp_setsockopt_sol_ip_all_sf(struct mptcp_sock *msk, +static int mptcp_setsockopt_sol_ip_all_sf(struct mptcp_sock *msk, int leve= l, int optname, sockptr_t optval, unsigned int optlen) { @@ -773,10 +776,16 @@ static int mptcp_setsockopt_sol_ip_all_sf(struct mptc= p_sock *msk, struct sock *sk =3D (struct sock *)msk; int err, val; =20 - if (optname !=3D IP_TOS) + if (optname !=3D IP_TOS && + optname !=3D IPV6_TCLASS) return -EOPNOTSUPP; =20 - err =3D ip_setsockopt(sk, SOL_IP, optname, optval, optlen); + if (level =3D=3D SOL_IP) + err =3D ip_setsockopt(sk, level, optname, optval, optlen); +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + else + err =3D ipv6_setsockopt(sk, level, optname, optval, optlen); +#endif =20 if (err !=3D 0) return err; @@ -785,6 +794,8 @@ static int mptcp_setsockopt_sol_ip_all_sf(struct mptcp_= sock *msk, sockopt_seq_inc(msk); if (optname =3D=3D IP_TOS) val =3D READ_ONCE(inet_sk(sk)->tos); + else if (optname =3D=3D IPV6_TCLASS) + 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; @@ -792,6 +803,8 @@ static int mptcp_setsockopt_sol_ip_all_sf(struct mptcp_= sock *msk, slow =3D lock_sock_fast(ssk); if (optname =3D=3D IP_TOS) __ip_sock_set_tos(ssk, val); + else if (optname =3D=3D IPV6_TCLASS) + WRITE_ONCE(inet6_sk(ssk)->tclass, val); unlock_sock_fast(ssk, slow); } release_sock(sk); @@ -885,7 +898,8 @@ static int mptcp_setsockopt_all_sf(struct mptcp_sock *m= sk, int level, return mptcp_setsockopt_sol_tcp_all_sf(msk, optname, optval, optlen); case SOL_IP: - return mptcp_setsockopt_sol_ip_all_sf(msk, optname, + case SOL_IPV6: + return mptcp_setsockopt_sol_ip_all_sf(msk, level, optname, optval, optlen); } =20 @@ -1569,6 +1583,9 @@ static int mptcp_getsockopt_v6(struct mptcp_sock *msk= , int optname, case IPV6_FREEBIND: return mptcp_put_int_option(msk, optval, optlen, inet_test_bit(FREEBIND, sk)); + case IPV6_TCLASS: + return mptcp_put_int_option(msk, optval, optlen, + inet6_sk(sk)->tclass); } =20 return -EOPNOTSUPP; @@ -1677,6 +1694,8 @@ 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)); + if (ssk->sk_family =3D=3D AF_INET6) + WRITE_ONCE(inet6_sk(ssk)->tclass, READ_ONCE(inet6_sk(sk)->tclass)); } =20 void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk) --=20 2.48.1 From nobody Wed Sep 17 18:16:52 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 6ED572E1C7E for ; Tue, 12 Aug 2025 08:26:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754987186; cv=none; b=BU5PD3X8xFkGlKe9gepJWUZJ9WDKBmiPW3qXEgoy7sYSsTMbA1zPUEVyof7/srqjbvzB7wYfdpcg+nnPr2pck6QGl8TTiXhqN7I3Tz3KZl17ZgZp/J3CJXhwaMjyKzzGG5XjarxIPLZfNupuoa5XhUMgIxgoFznzZL5VAWxS7dE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754987186; c=relaxed/simple; bh=I5RtSXRacqiZpjDFnrA6ZmMGGoidkmPXje6AQM8fHWs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Dktj3LT35kzzCZHQxdEgBVIorSwrzEhqGVxg9rKVJ2D1nM3s4T6JjHW+HDRxDA1F36SWV+p90eoD7EmVgSGfajkSChEcIAxKWsZHfNDS9R/dcUs0gDTRWEG6n8gXN3LTuYh8xq5hFTgFJRgrdvivaolWY8yD+mN1oVOON++LxA8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iHp2Oexw; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iHp2Oexw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E5F9AC4CEF0; Tue, 12 Aug 2025 08:26:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754987185; bh=I5RtSXRacqiZpjDFnrA6ZmMGGoidkmPXje6AQM8fHWs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iHp2OexwB3T94iqai6dx7kX/x/5HMlKSEKzulNLkdCSjWKvMoN4tktSEBWk889MLf 9EKQgZW71o/qNp8+WpO+2QewMaRxDNN4KNpSGk9dqaWGTswntBHkZGHi8G/+CXtan6 MDjQeji0VKFJXEz6hEAbszVst/RAakh5F17I9+jswOZvhm4qTq7nWYmJFKInQ7DYBL i+SiwyeMY+wO0+m1KpEeHm4NwHsPbjfKPUAEJSARPyjdndzZmyjBBUlSrxNzfJeMJm YlYt17qsOcqmzoJMnyLz8f2shN6964kP9ND9KVaMoxTOjb0Inji5z8UuvDm+ybhKuf dbcjGemVVwPxQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v2 2/3] mptcp: add IP_TTL socket option support Date: Tue, 12 Aug 2025 16:26:13 +0800 Message-ID: <80bc3cad279b6fadef53fd399301194ea41c13bd.1754986785.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 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 Implement setsockopt/getsockopt for IP_TTL in MPTCP: 1. setsockopt(IP_TTL): - Applies TTL to MPTCP socket - Propagates TTL to all subflows 2. getsockopt(IP_TTL): - Returns current TTL from inet_sk(sk)->uc_ttl - Falls back to sysctl_ip_default_ttl when unset 3. Syncs TTL to new subflows 4. Maintains option sequence counters Enables applications to control IPv4 TTL settings consistently across all subflows. Resolves outstanding requests for TTL support in MPTCP. Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/296 Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index bb296813c578..ae9b376071c9 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -776,7 +776,7 @@ static int mptcp_setsockopt_sol_ip_all_sf(struct mptcp_= sock *msk, int level, struct sock *sk =3D (struct sock *)msk; int err, val; =20 - if (optname !=3D IP_TOS && + if (optname !=3D IP_TOS && optname !=3D IP_TTL && optname !=3D IPV6_TCLASS) return -EOPNOTSUPP; =20 @@ -794,6 +794,8 @@ static int mptcp_setsockopt_sol_ip_all_sf(struct mptcp_= sock *msk, int level, sockopt_seq_inc(msk); if (optname =3D=3D IP_TOS) val =3D READ_ONCE(inet_sk(sk)->tos); + else if (optname =3D=3D IP_TTL) + val =3D READ_ONCE(inet_sk(sk)->uc_ttl); else if (optname =3D=3D IPV6_TCLASS) val =3D READ_ONCE(inet6_sk(sk)->tclass); mptcp_for_each_subflow(msk, subflow) { @@ -803,6 +805,8 @@ static int mptcp_setsockopt_sol_ip_all_sf(struct mptcp_= sock *msk, int level, slow =3D lock_sock_fast(ssk); if (optname =3D=3D IP_TOS) __ip_sock_set_tos(ssk, val); + else if (optname =3D=3D IP_TTL) + WRITE_ONCE(inet_sk(ssk)->uc_ttl, val); else if (optname =3D=3D IPV6_TCLASS) WRITE_ONCE(inet6_sk(ssk)->tclass, val); unlock_sock_fast(ssk, slow); @@ -822,6 +826,7 @@ static int mptcp_setsockopt_v4(struct mptcp_sock *msk, = int optname, case IP_LOCAL_PORT_RANGE: return mptcp_setsockopt_first_sf_only(msk, SOL_IP, optname, optval, optl= en); case IP_TOS: + case IP_TTL: return mptcp_setsockopt_all_sf(msk, SOL_IP, optname, optval, optlen); } =20 @@ -1547,6 +1552,7 @@ static int mptcp_getsockopt_v4(struct mptcp_sock *msk= , int optname, char __user *optval, int __user *optlen) { struct sock *sk =3D (void *)msk; + int val; =20 switch (optname) { case IP_TOS: @@ -1563,6 +1569,11 @@ static int mptcp_getsockopt_v4(struct mptcp_sock *ms= k, int optname, case IP_LOCAL_PORT_RANGE: return mptcp_put_int_option(msk, optval, optlen, READ_ONCE(inet_sk(sk)->local_port_range)); + case IP_TTL: + val =3D READ_ONCE(inet_sk(sk)->uc_ttl); + if (val < 0) + val =3D READ_ONCE(sock_net(sk)->ipv4.sysctl_ip_default_ttl); + return mptcp_put_int_option(msk, optval, optlen, val); } =20 return -EOPNOTSUPP; @@ -1694,6 +1705,7 @@ 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)); + WRITE_ONCE(inet_sk(ssk)->uc_ttl, READ_ONCE(inet_sk(sk)->uc_ttl)); if (ssk->sk_family =3D=3D AF_INET6) WRITE_ONCE(inet6_sk(ssk)->tclass, READ_ONCE(inet6_sk(sk)->tclass)); } --=20 2.48.1 From nobody Wed Sep 17 18:16:52 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 E34812E282C for ; Tue, 12 Aug 2025 08:26:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754987188; cv=none; b=dt0tazaUSFq/IDzj5dsmk8qR1h/ApqOdJvNIoHdWHnNZtJavdHUU0bkaIm2wtnoei8vSt2p3ZTnX3cKzD+bcXwKiyV9IKxAL06cChveBBJeQRktp5mv8MOnAOoGmts06DJcY7r81HSh6/tm0ULgYNxTXesyjkPRsB8PLLdBWS9g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754987188; c=relaxed/simple; bh=x2jA7LsQq3fILl4EDA8dyzbgFdc4nPks5Vd9ehBiBbs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=J3ZJ1TaImurePHZyG73biKg4rrnbxJmXlWMKgXtDSiAMdw9Vfx5oPa2NNcuxGwLm4tfSYYun9q318cTDhcaa4dsvHsVazMZYDTPvL+0nvSEHFevI580OYneGJqWf0PhYrClrSs3hITx8MAoXGq6P4aI+Phk5yvaYarUUCOpCwQc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hIZDWEtL; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hIZDWEtL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 73D90C4CEF4; Tue, 12 Aug 2025 08:26:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754987187; bh=x2jA7LsQq3fILl4EDA8dyzbgFdc4nPks5Vd9ehBiBbs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hIZDWEtLM+4pHfhgBKgaPVdjQBQfPrElZURbZt0/i4lMCHG8tlLQmEjM2G7J9LeWi MUujq9DhO/CcFKzkttVd6oWBZpGx5T1VrL9Dy25vexhllfMFaBo48BfM/PT0OroVoI yWMywpPiV7CL+JYaOxP/S1ybXYb80CzsG3ZqNiiU1FsGnnTtBX+u6zneab1Z3GwGWH uFn/e2y4iiBAVLnTTpa2UCoh1VTRL0iinquM+PkNmbJ1UwCR3sGpE3XD0Vl6qK8ss3 Hw2E+SE73kTMqA6RfYrHrbPEL4WWHNYP5M/COiyoTTFQHPpNoQNUy1DxDsibiFk6Xy hfRLKBWSdO0ig== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v2 3/3] mptcp: add IPV6_UNICAST_HOPS socket option support Date: Tue, 12 Aug 2025 16:26:14 +0800 Message-ID: <51c833ad712205283262d980e5049d10280b697d.1754986785.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 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 Implement setsockopt/getsockopt for IPV6_UNICAST_HOPS in MPTCP: 1. setsockopt(IPV6_UNICAST_HOPS): - Sets hop limit on MPTCP socket - Propagates value to all IPv6 subflows 2. getsockopt(IPV6_UNICAST_HOPS): - Returns current hop limit (from inet6_sk or system default) 3. Syncs hop limit to new subflows 4. Uses conditional compilation for IPv6 support Provides standard IPv6 hop limit control for MPTCP connections with consistent behavior across subflows. Completes IPv6 socket option parity. Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/296 Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index ae9b376071c9..83071e5c608d 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -459,6 +459,7 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, = int optname, return mptcp_setsockopt_first_sf_only(msk, SOL_IPV6, optname, optval, optlen); case IPV6_TCLASS: + case IPV6_UNICAST_HOPS: return mptcp_setsockopt_all_sf(msk, SOL_IPV6, optname, optval, optlen); } @@ -777,7 +778,7 @@ static int mptcp_setsockopt_sol_ip_all_sf(struct mptcp_= sock *msk, int level, int err, val; =20 if (optname !=3D IP_TOS && optname !=3D IP_TTL && - optname !=3D IPV6_TCLASS) + optname !=3D IPV6_TCLASS && optname !=3D IPV6_UNICAST_HOPS) return -EOPNOTSUPP; =20 if (level =3D=3D SOL_IP) @@ -798,6 +799,8 @@ static int mptcp_setsockopt_sol_ip_all_sf(struct mptcp_= sock *msk, int level, val =3D READ_ONCE(inet_sk(sk)->uc_ttl); else if (optname =3D=3D IPV6_TCLASS) val =3D READ_ONCE(inet6_sk(sk)->tclass); + else if (optname =3D=3D IPV6_UNICAST_HOPS) + val =3D READ_ONCE(inet6_sk(sk)->hop_limit); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); bool slow; @@ -809,6 +812,8 @@ static int mptcp_setsockopt_sol_ip_all_sf(struct mptcp_= sock *msk, int level, WRITE_ONCE(inet_sk(ssk)->uc_ttl, val); else if (optname =3D=3D IPV6_TCLASS) WRITE_ONCE(inet6_sk(ssk)->tclass, val); + else if (optname =3D=3D IPV6_UNICAST_HOPS) + WRITE_ONCE(inet6_sk(ssk)->hop_limit, val); unlock_sock_fast(ssk, slow); } release_sock(sk); @@ -1583,6 +1588,7 @@ static int mptcp_getsockopt_v6(struct mptcp_sock *msk= , int optname, char __user *optval, int __user *optlen) { struct sock *sk =3D (void *)msk; + int val; =20 switch (optname) { case IPV6_V6ONLY: @@ -1597,6 +1603,13 @@ static int mptcp_getsockopt_v6(struct mptcp_sock *ms= k, int optname, case IPV6_TCLASS: return mptcp_put_int_option(msk, optval, optlen, inet6_sk(sk)->tclass); + case IPV6_UNICAST_HOPS: + val =3D READ_ONCE(inet6_sk(sk)->hop_limit); +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + if (val < 0) + val =3D READ_ONCE(sock_net(sk)->ipv6.devconf_all->hop_limit); +#endif + return mptcp_put_int_option(msk, optval, optlen, val); } =20 return -EOPNOTSUPP; @@ -1706,8 +1719,10 @@ static void sync_socket_options(struct mptcp_sock *m= sk, struct sock *ssk) 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)); WRITE_ONCE(inet_sk(ssk)->uc_ttl, READ_ONCE(inet_sk(sk)->uc_ttl)); - if (ssk->sk_family =3D=3D AF_INET6) + if (ssk->sk_family =3D=3D AF_INET6) { WRITE_ONCE(inet6_sk(ssk)->tclass, READ_ONCE(inet6_sk(sk)->tclass)); + WRITE_ONCE(inet6_sk(ssk)->hop_limit, READ_ONCE(inet6_sk(sk)->hop_limit)); + } } =20 void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk) --=20 2.48.1