* [PATCH mptcp-next 0/3] mptcp: add more sockopts
@ 2025-08-02 9:19 Geliang Tang
2025-08-02 9:19 ` [PATCH mptcp-next 1/3] mptcp: add IPV6_TCLASS sockopt support Geliang Tang
` (5 more replies)
0 siblings, 6 replies; 8+ messages in thread
From: Geliang Tang @ 2025-08-02 9:19 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Add sockopt support for IPV6_TCLASS, IP_TTL and IPV6_UNICAST_HOPS.
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/568
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/296
Geliang Tang (3):
mptcp: add IPV6_TCLASS sockopt support
mptcp: add IP_TTL sockopt support
mptcp: add IPV6_UNICAST_HOPS sockopt support
net/mptcp/sockopt.c | 108 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 108 insertions(+)
--
2.48.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH mptcp-next 1/3] mptcp: add IPV6_TCLASS sockopt support
2025-08-02 9:19 [PATCH mptcp-next 0/3] mptcp: add more sockopts Geliang Tang
@ 2025-08-02 9:19 ` Geliang Tang
2025-08-02 9:19 ` [PATCH mptcp-next 2/3] mptcp: add IP_TTL " Geliang Tang
` (4 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Geliang Tang @ 2025-08-02 9:19 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang, kernel test robot
From: Geliang Tang <tanggeliang@kylinos.cn>
This patch adds full support for the IPV6_TCLASS socket option in MPTCP,
ensuring consistent traffic class handling across all subflows.
Key changes:
1. setsockopt(IPV6_TCLASS):
- First sets the traffic class value on the main MPTCP socket
- Propagates the new value to all existing subflows
- Uses lock synchronization to ensure atomic updates
2. getsockopt(IPV6_TCLASS):
- Returns the current traffic class value stored in the main socket's
inet6_sk structure
This implementation mirrors the existing IPv4 TOS handling (IP_TOS) and
ensures QoS settings are consistently applied to all underlying TCP
connections in the MPTCP session.
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202508021003.tEAjvv2S-lkp@intel.com/
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/568
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/sockopt.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c
index 2c267aff95be..b4ccc0acadae 100644
--- a/net/mptcp/sockopt.c
+++ b/net/mptcp/sockopt.c
@@ -384,6 +384,35 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname,
return -EOPNOTSUPP;
}
+static int mptcp_setsockopt_v6_set_tclass(struct mptcp_sock *msk, int optname,
+ sockptr_t optval, unsigned int optlen)
+{
+#if IS_ENABLED(CONFIG_MPTCP_IPV6)
+ struct mptcp_subflow_context *subflow;
+ struct sock *sk = (struct sock *)msk;
+ int err, val;
+
+ err = ipv6_setsockopt(sk, SOL_IPV6, optname, optval, optlen);
+ if (err)
+ return err;
+
+ lock_sock(sk);
+ sockopt_seq_inc(msk);
+ val = READ_ONCE(inet6_sk(sk)->tclass);
+ mptcp_for_each_subflow(msk, subflow) {
+ struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
+ bool slow;
+
+ slow = lock_sock_fast(ssk);
+ WRITE_ONCE(inet6_sk(ssk)->tclass, val);
+ unlock_sock_fast(ssk, slow);
+ }
+ release_sock(sk);
+#endif
+
+ return 0;
+}
+
static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname,
sockptr_t optval, unsigned int optlen)
{
@@ -426,6 +455,8 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname,
release_sock(sk);
break;
+ case IPV6_TCLASS:
+ return mptcp_setsockopt_v6_set_tclass(msk, optname, optval, optlen);
}
return ret;
@@ -1475,6 +1506,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);
}
return -EOPNOTSUPP;
@@ -1545,6 +1579,7 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
ssk->sk_incoming_cpu = sk->sk_incoming_cpu;
ssk->sk_ipv6only = sk->sk_ipv6only;
__ip_sock_set_tos(ssk, inet_sk(sk)->tos);
+ WRITE_ONCE(inet6_sk(ssk)->tclass, inet6_sk(sk)->tclass);
if (sk->sk_userlocks & tx_rx_locks) {
ssk->sk_userlocks |= sk->sk_userlocks & tx_rx_locks;
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH mptcp-next 2/3] mptcp: add IP_TTL sockopt support
2025-08-02 9:19 [PATCH mptcp-next 0/3] mptcp: add more sockopts Geliang Tang
2025-08-02 9:19 ` [PATCH mptcp-next 1/3] mptcp: add IPV6_TCLASS sockopt support Geliang Tang
@ 2025-08-02 9:19 ` Geliang Tang
2025-08-02 9:19 ` [PATCH mptcp-next 3/3] mptcp: add IPV6_UNICAST_HOPS " Geliang Tang
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Geliang Tang @ 2025-08-02 9:19 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Implement setsockopt/getsockopt support for IP_TTL in MPTCP. This change:
1. Adds mptcp_setsockopt_v4_set_ttl() to handle IP_TTL setsockopt:
- Applies TTL value to the MPTCP socket itself
- Propagates the TTL value to all subflows
- Uses lock_sock_fast() for safe subflow updates
2. Adds getsockopt handler for IP_TTL:
- Retrieves TTL from inet_sk(sk)->uc_ttl
- Falls back to sysctl_ip_default_ttl when not set
3. Syncs TTL to new subflows in sync_socket_options()
4. Maintains option sequence counter for consistency
This allows applications to control TTL settings in MPTCP connections
with standard IPv4 socket options, ensuring consistent behavior across
all subflows.
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/296
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/sockopt.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c
index b4ccc0acadae..cc13006b5dc9 100644
--- a/net/mptcp/sockopt.c
+++ b/net/mptcp/sockopt.c
@@ -791,6 +791,33 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_sock *msk, int optname,
return 0;
}
+static int mptcp_setsockopt_v4_set_ttl(struct mptcp_sock *msk, int optname,
+ sockptr_t optval, unsigned int optlen)
+{
+ struct mptcp_subflow_context *subflow;
+ struct sock *sk = (struct sock *)msk;
+ int err, val;
+
+ err = ip_setsockopt(sk, SOL_IP, optname, optval, optlen);
+ if (err)
+ return err;
+
+ lock_sock(sk);
+ sockopt_seq_inc(msk);
+ val = READ_ONCE(inet_sk(sk)->uc_ttl);
+ mptcp_for_each_subflow(msk, subflow) {
+ struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
+ bool slow;
+
+ slow = lock_sock_fast(ssk);
+ WRITE_ONCE(inet_sk(ssk)->uc_ttl, val);
+ unlock_sock_fast(ssk, slow);
+ }
+ release_sock(sk);
+
+ return 0;
+}
+
static int mptcp_setsockopt_v4(struct mptcp_sock *msk, int optname,
sockptr_t optval, unsigned int optlen)
{
@@ -802,6 +829,8 @@ static int mptcp_setsockopt_v4(struct mptcp_sock *msk, int optname,
return mptcp_setsockopt_sol_ip_set(msk, optname, optval, optlen);
case IP_TOS:
return mptcp_setsockopt_v4_set_tos(msk, optname, optval, optlen);
+ case IP_TTL:
+ return mptcp_setsockopt_v4_set_ttl(msk, optname, optval, optlen);
}
return -EOPNOTSUPP;
@@ -1470,6 +1499,7 @@ static int mptcp_getsockopt_v4(struct mptcp_sock *msk, int optname,
char __user *optval, int __user *optlen)
{
struct sock *sk = (void *)msk;
+ int val;
switch (optname) {
case IP_TOS:
@@ -1486,6 +1516,11 @@ static int mptcp_getsockopt_v4(struct mptcp_sock *msk, 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 = READ_ONCE(inet_sk(sk)->uc_ttl);
+ if (val < 0)
+ val = READ_ONCE(sock_net(sk)->ipv4.sysctl_ip_default_ttl);
+ return mptcp_put_int_option(msk, optval, optlen, val);
}
return -EOPNOTSUPP;
@@ -1580,6 +1615,7 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
ssk->sk_ipv6only = sk->sk_ipv6only;
__ip_sock_set_tos(ssk, inet_sk(sk)->tos);
WRITE_ONCE(inet6_sk(ssk)->tclass, inet6_sk(sk)->tclass);
+ WRITE_ONCE(inet_sk(ssk)->uc_ttl, inet_sk(sk)->uc_ttl);
if (sk->sk_userlocks & tx_rx_locks) {
ssk->sk_userlocks |= sk->sk_userlocks & tx_rx_locks;
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH mptcp-next 3/3] mptcp: add IPV6_UNICAST_HOPS sockopt support
2025-08-02 9:19 [PATCH mptcp-next 0/3] mptcp: add more sockopts Geliang Tang
2025-08-02 9:19 ` [PATCH mptcp-next 1/3] mptcp: add IPV6_TCLASS sockopt support Geliang Tang
2025-08-02 9:19 ` [PATCH mptcp-next 2/3] mptcp: add IP_TTL " Geliang Tang
@ 2025-08-02 9:19 ` Geliang Tang
2025-08-03 2:20 ` kernel test robot
2025-08-03 7:35 ` [PATCH mptcp-next 0/3] mptcp: add more sockopts MPTCP CI
` (2 subsequent siblings)
5 siblings, 1 reply; 8+ messages in thread
From: Geliang Tang @ 2025-08-02 9:19 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Implement setsockopt/getsockopt support for IPV6_UNICAST_HOPS in MPTCP:
1. Adds mptcp_setsockopt_v6_set_hops() to handle IPV6_UNICAST_HOPS:
- Applies hop limit to the MPTCP socket
- Propagates hop limit to all IPv6 subflows
- Uses conditional compilation for CONFIG_MPTCP_IPV6
2. Adds getsockopt handler for IPV6_UNICAST_HOPS:
- Retrieves hop limit from inet6_sk(sk)->hop_limit
- Falls back to net->ipv6.devconf_all->hop_limit when not set
3. Syncs hop limit to new subflows in sync_socket_options()
4. Maintains option sequence counter for consistency
This enables applications to control IPv6 hop limits in MPTCP connections
using standard IPv6 socket options, ensuring consistent behavior across
all subflows.
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/296
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/sockopt.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c
index cc13006b5dc9..11663250bade 100644
--- a/net/mptcp/sockopt.c
+++ b/net/mptcp/sockopt.c
@@ -413,6 +413,34 @@ static int mptcp_setsockopt_v6_set_tclass(struct mptcp_sock *msk, int optname,
return 0;
}
+static int mptcp_setsockopt_v6_set_hops(struct mptcp_sock *msk, int optname,
+ sockptr_t optval, unsigned int optlen)
+{
+#if IS_ENABLED(CONFIG_MPTCP_IPV6)
+ struct mptcp_subflow_context *subflow;
+ struct sock *sk = (struct sock *)msk;
+ int err, val;
+
+ err = ipv6_setsockopt(sk, SOL_IPV6, optname, optval, optlen);
+ if (err)
+ return err;
+
+ lock_sock(sk);
+ sockopt_seq_inc(msk);
+ val = READ_ONCE(inet6_sk(sk)->hop_limit);
+ mptcp_for_each_subflow(msk, subflow) {
+ struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
+ bool slow;
+
+ slow = lock_sock_fast(ssk);
+ WRITE_ONCE(inet6_sk(ssk)->hop_limit, val);
+ unlock_sock_fast(ssk, slow);
+ }
+ release_sock(sk);
+#endif
+
+ return 0;
+}
static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname,
sockptr_t optval, unsigned int optlen)
{
@@ -457,6 +485,8 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname,
break;
case IPV6_TCLASS:
return mptcp_setsockopt_v6_set_tclass(msk, optname, optval, optlen);
+ case IPV6_UNICAST_HOPS:
+ return mptcp_setsockopt_v6_set_hops(msk, optname, optval, optlen);
}
return ret;
@@ -1530,6 +1560,7 @@ static int mptcp_getsockopt_v6(struct mptcp_sock *msk, int optname,
char __user *optval, int __user *optlen)
{
struct sock *sk = (void *)msk;
+ int val;
switch (optname) {
case IPV6_V6ONLY:
@@ -1544,6 +1575,11 @@ static int mptcp_getsockopt_v6(struct mptcp_sock *msk, int optname,
case IPV6_TCLASS:
return mptcp_put_int_option(msk, optval, optlen,
inet6_sk(sk)->tclass);
+ case IPV6_UNICAST_HOPS:
+ val = READ_ONCE(inet6_sk(sk)->hop_limit);
+ if (val < 0)
+ val = READ_ONCE(sock_net(sk)->ipv6.devconf_all->hop_limit);
+ return mptcp_put_int_option(msk, optval, optlen, val);
}
return -EOPNOTSUPP;
@@ -1616,6 +1652,7 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
__ip_sock_set_tos(ssk, inet_sk(sk)->tos);
WRITE_ONCE(inet6_sk(ssk)->tclass, inet6_sk(sk)->tclass);
WRITE_ONCE(inet_sk(ssk)->uc_ttl, inet_sk(sk)->uc_ttl);
+ WRITE_ONCE(inet6_sk(ssk)->hop_limit, inet6_sk(sk)->hop_limit);
if (sk->sk_userlocks & tx_rx_locks) {
ssk->sk_userlocks |= sk->sk_userlocks & tx_rx_locks;
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH mptcp-next 3/3] mptcp: add IPV6_UNICAST_HOPS sockopt support
2025-08-02 9:19 ` [PATCH mptcp-next 3/3] mptcp: add IPV6_UNICAST_HOPS " Geliang Tang
@ 2025-08-03 2:20 ` kernel test robot
0 siblings, 0 replies; 8+ messages in thread
From: kernel test robot @ 2025-08-03 2:20 UTC (permalink / raw)
To: Geliang Tang, mptcp; +Cc: llvm, oe-kbuild-all, Geliang Tang
Hi Geliang,
kernel test robot noticed the following build errors:
[auto build test ERROR on mptcp/export]
[also build test ERROR on mptcp/export-net linus/master v6.16 next-20250801]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Geliang-Tang/mptcp-add-IPV6_TCLASS-sockopt-support/20250802-212226
base: https://github.com/multipath-tcp/mptcp_net-next.git export
patch link: https://lore.kernel.org/r/0fd13a7bb3ca420a1e68f49fe93e7baada72890b.1754126092.git.tanggeliang%40kylinos.cn
patch subject: [PATCH mptcp-next 3/3] mptcp: add IPV6_UNICAST_HOPS sockopt support
config: x86_64-buildonly-randconfig-006-20250803 (https://download.01.org/0day-ci/archive/20250803/202508030946.WcaovHBw-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250803/202508030946.WcaovHBw-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202508030946.WcaovHBw-lkp@intel.com/
All errors (new ones prefixed by >>):
>> net/mptcp/sockopt.c:1581:34: error: no member named 'ipv6' in 'struct net'
1581 | val = READ_ONCE(sock_net(sk)->ipv6.devconf_all->hop_limit);
| ~~~~~~~~~~~~ ^
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
49 | compiletime_assert_rwonce_type(x); \
| ^
include/asm-generic/rwonce.h:36:35: note: expanded from macro 'compiletime_assert_rwonce_type'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^
include/linux/compiler_types.h:533:10: note: expanded from macro '__native_word'
533 | (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
| ^
include/linux/compiler_types.h:572:22: note: expanded from macro 'compiletime_assert'
572 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~
include/linux/compiler_types.h:560:23: note: expanded from macro '_compiletime_assert'
560 | __compiletime_assert(condition, msg, prefix, suffix)
| ^~~~~~~~~
include/linux/compiler_types.h:552:9: note: expanded from macro '__compiletime_assert'
552 | if (!(condition)) \
| ^~~~~~~~~
>> net/mptcp/sockopt.c:1581:34: error: no member named 'ipv6' in 'struct net'
1581 | val = READ_ONCE(sock_net(sk)->ipv6.devconf_all->hop_limit);
| ~~~~~~~~~~~~ ^
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
49 | compiletime_assert_rwonce_type(x); \
| ^
include/asm-generic/rwonce.h:36:35: note: expanded from macro 'compiletime_assert_rwonce_type'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^
include/linux/compiler_types.h:533:39: note: expanded from macro '__native_word'
533 | (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
| ^
include/linux/compiler_types.h:572:22: note: expanded from macro 'compiletime_assert'
572 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~
include/linux/compiler_types.h:560:23: note: expanded from macro '_compiletime_assert'
560 | __compiletime_assert(condition, msg, prefix, suffix)
| ^~~~~~~~~
include/linux/compiler_types.h:552:9: note: expanded from macro '__compiletime_assert'
552 | if (!(condition)) \
| ^~~~~~~~~
>> net/mptcp/sockopt.c:1581:34: error: no member named 'ipv6' in 'struct net'
1581 | val = READ_ONCE(sock_net(sk)->ipv6.devconf_all->hop_limit);
| ~~~~~~~~~~~~ ^
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
49 | compiletime_assert_rwonce_type(x); \
| ^
include/asm-generic/rwonce.h:36:35: note: expanded from macro 'compiletime_assert_rwonce_type'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^
include/linux/compiler_types.h:534:10: note: expanded from macro '__native_word'
534 | sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
| ^
include/linux/compiler_types.h:572:22: note: expanded from macro 'compiletime_assert'
572 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~
include/linux/compiler_types.h:560:23: note: expanded from macro '_compiletime_assert'
560 | __compiletime_assert(condition, msg, prefix, suffix)
| ^~~~~~~~~
include/linux/compiler_types.h:552:9: note: expanded from macro '__compiletime_assert'
552 | if (!(condition)) \
| ^~~~~~~~~
>> net/mptcp/sockopt.c:1581:34: error: no member named 'ipv6' in 'struct net'
1581 | val = READ_ONCE(sock_net(sk)->ipv6.devconf_all->hop_limit);
| ~~~~~~~~~~~~ ^
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
49 | compiletime_assert_rwonce_type(x); \
| ^
include/asm-generic/rwonce.h:36:35: note: expanded from macro 'compiletime_assert_rwonce_type'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^
include/linux/compiler_types.h:534:38: note: expanded from macro '__native_word'
534 | sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
| ^
include/linux/compiler_types.h:572:22: note: expanded from macro 'compiletime_assert'
572 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~
include/linux/compiler_types.h:560:23: note: expanded from macro '_compiletime_assert'
560 | __compiletime_assert(condition, msg, prefix, suffix)
| ^~~~~~~~~
include/linux/compiler_types.h:552:9: note: expanded from macro '__compiletime_assert'
552 | if (!(condition)) \
| ^~~~~~~~~
>> net/mptcp/sockopt.c:1581:34: error: no member named 'ipv6' in 'struct net'
1581 | val = READ_ONCE(sock_net(sk)->ipv6.devconf_all->hop_limit);
| ~~~~~~~~~~~~ ^
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
49 | compiletime_assert_rwonce_type(x); \
| ^
include/asm-generic/rwonce.h:36:48: note: expanded from macro 'compiletime_assert_rwonce_type'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
| ^
include/linux/compiler_types.h:572:22: note: expanded from macro 'compiletime_assert'
572 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~
include/linux/compiler_types.h:560:23: note: expanded from macro '_compiletime_assert'
560 | __compiletime_assert(condition, msg, prefix, suffix)
| ^~~~~~~~~
include/linux/compiler_types.h:552:9: note: expanded from macro '__compiletime_assert'
552 | if (!(condition)) \
| ^~~~~~~~~
>> net/mptcp/sockopt.c:1581:34: error: no member named 'ipv6' in 'struct net'
1581 | val = READ_ONCE(sock_net(sk)->ipv6.devconf_all->hop_limit);
| ~~~~~~~~~~~~ ^
include/asm-generic/rwonce.h:50:14: note: expanded from macro 'READ_ONCE'
50 | __READ_ONCE(x); \
| ^
include/asm-generic/rwonce.h:44:65: note: expanded from macro '__READ_ONCE'
44 | #define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x))
| ^
include/linux/compiler_types.h:522:13: note: expanded from macro '__unqual_scalar_typeof'
522 | _Generic((x), \
| ^
>> net/mptcp/sockopt.c:1581:34: error: no member named 'ipv6' in 'struct net'
1581 | val = READ_ONCE(sock_net(sk)->ipv6.devconf_all->hop_limit);
| ~~~~~~~~~~~~ ^
include/asm-generic/rwonce.h:50:14: note: expanded from macro 'READ_ONCE'
50 | __READ_ONCE(x); \
| ^
include/asm-generic/rwonce.h:44:72: note: expanded from macro '__READ_ONCE'
44 | #define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x))
| ^
7 errors generated.
vim +1581 net/mptcp/sockopt.c
1558
1559 static int mptcp_getsockopt_v6(struct mptcp_sock *msk, int optname,
1560 char __user *optval, int __user *optlen)
1561 {
1562 struct sock *sk = (void *)msk;
1563 int val;
1564
1565 switch (optname) {
1566 case IPV6_V6ONLY:
1567 return mptcp_put_int_option(msk, optval, optlen,
1568 sk->sk_ipv6only);
1569 case IPV6_TRANSPARENT:
1570 return mptcp_put_int_option(msk, optval, optlen,
1571 inet_test_bit(TRANSPARENT, sk));
1572 case IPV6_FREEBIND:
1573 return mptcp_put_int_option(msk, optval, optlen,
1574 inet_test_bit(FREEBIND, sk));
1575 case IPV6_TCLASS:
1576 return mptcp_put_int_option(msk, optval, optlen,
1577 inet6_sk(sk)->tclass);
1578 case IPV6_UNICAST_HOPS:
1579 val = READ_ONCE(inet6_sk(sk)->hop_limit);
1580 if (val < 0)
> 1581 val = READ_ONCE(sock_net(sk)->ipv6.devconf_all->hop_limit);
1582 return mptcp_put_int_option(msk, optval, optlen, val);
1583 }
1584
1585 return -EOPNOTSUPP;
1586 }
1587
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH mptcp-next 0/3] mptcp: add more sockopts
2025-08-02 9:19 [PATCH mptcp-next 0/3] mptcp: add more sockopts Geliang Tang
` (2 preceding siblings ...)
2025-08-02 9:19 ` [PATCH mptcp-next 3/3] mptcp: add IPV6_UNICAST_HOPS " Geliang Tang
@ 2025-08-03 7:35 ` MPTCP CI
2025-08-03 9:20 ` MPTCP CI
2025-08-03 11:34 ` Matthieu Baerts
5 siblings, 0 replies; 8+ messages in thread
From: MPTCP CI @ 2025-08-03 7:35 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
Hi Geliang,
Thank you for your modifications, that's great!
But sadly, our CI spotted some issues with it when trying to build it.
You can find more details there:
https://github.com/multipath-tcp/mptcp_net-next/actions/runs/16702556215
Status: failure
Initiator: Matthieu Baerts (NGI0)
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/acf2cf2e5caf
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=987858
Feel free to reply to this email if you cannot access logs, if you need
some support to fix the error, if this doesn't seem to be caused by your
modifications or if the error is a false positive one.
Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH mptcp-next 0/3] mptcp: add more sockopts
2025-08-02 9:19 [PATCH mptcp-next 0/3] mptcp: add more sockopts Geliang Tang
` (3 preceding siblings ...)
2025-08-03 7:35 ` [PATCH mptcp-next 0/3] mptcp: add more sockopts MPTCP CI
@ 2025-08-03 9:20 ` MPTCP CI
2025-08-03 11:34 ` Matthieu Baerts
5 siblings, 0 replies; 8+ messages in thread
From: MPTCP CI @ 2025-08-03 9:20 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
Hi Geliang,
Thank you for your modifications, that's great!
Our CI did some validations and here is its report:
- KVM Validation: normal: Critical: 1 Call Trace(s) - Critical: Global Timeout ❌
- KVM Validation: debug: Critical: 1 Call Trace(s) - Critical: Global Timeout ❌
- KVM Validation: btf-normal (only bpftest_all): Success! ✅
- KVM Validation: btf-debug (only bpftest_all): Unstable: 1 failed test(s): bpftest_test_progs_mptcp 🔴
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/16702556221
Initiator: Matthieu Baerts (NGI0)
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/acf2cf2e5caf
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=987858
If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:
$ cd [kernel source code]
$ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
--pull always mptcp/mptcp-upstream-virtme-docker:latest \
auto-normal
For more details:
https://github.com/multipath-tcp/mptcp-upstream-virtme-docker
Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)
Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH mptcp-next 0/3] mptcp: add more sockopts
2025-08-02 9:19 [PATCH mptcp-next 0/3] mptcp: add more sockopts Geliang Tang
` (4 preceding siblings ...)
2025-08-03 9:20 ` MPTCP CI
@ 2025-08-03 11:34 ` Matthieu Baerts
5 siblings, 0 replies; 8+ messages in thread
From: Matthieu Baerts @ 2025-08-03 11:34 UTC (permalink / raw)
To: Geliang Tang, mptcp; +Cc: Geliang Tang
Hi Geliang,
On 02/08/2025 11:19, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> Add sockopt support for IPV6_TCLASS, IP_TTL and IPV6_UNICAST_HOPS.
>
> Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/568
> Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/296
>
> Geliang Tang (3):
> mptcp: add IPV6_TCLASS sockopt support
> mptcp: add IP_TTL sockopt support
> mptcp: add IPV6_UNICAST_HOPS sockopt support
Each of these patches are adding a new dedicated helper, doing almost
the same.
Maybe we can do better. I proposed something like that a few years ago:
https://patchwork.kernel.org/project/mptcp/list/?series=763505&state=*
I can eventually look at updating it.
But before, please add the packetdrill tests: that's the most important
part. The modifications in the kernel look simple, but without the
tests, we cannot do the validation. Because each off these socket
options changes something in the packet sent to the wire, I think it
would be better to use Packetdrill for the tests.
Cheers,
Matt
--
Sponsored by the NGI0 Core fund.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-08-03 11:34 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-02 9:19 [PATCH mptcp-next 0/3] mptcp: add more sockopts Geliang Tang
2025-08-02 9:19 ` [PATCH mptcp-next 1/3] mptcp: add IPV6_TCLASS sockopt support Geliang Tang
2025-08-02 9:19 ` [PATCH mptcp-next 2/3] mptcp: add IP_TTL " Geliang Tang
2025-08-02 9:19 ` [PATCH mptcp-next 3/3] mptcp: add IPV6_UNICAST_HOPS " Geliang Tang
2025-08-03 2:20 ` kernel test robot
2025-08-03 7:35 ` [PATCH mptcp-next 0/3] mptcp: add more sockopts MPTCP CI
2025-08-03 9:20 ` MPTCP CI
2025-08-03 11:34 ` Matthieu Baerts
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.