* [PATCH mptcp-next v6 1/7] tcp: md5: remove redundant l3flag variable
2025-11-05 9:29 [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support Geliang Tang
@ 2025-11-05 9:29 ` Geliang Tang
2025-11-05 9:29 ` [PATCH mptcp-next v6 2/7] mptcp: handle TCP_MAXSEG getsockopt in common case Geliang Tang
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Geliang Tang @ 2025-11-05 9:29 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
The l3flag variable duplicates the value of 'flags' which already
contains TCP_MD5SIG_FLAG_IFINDEX status. Remove it to simplify code.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/ipv4/tcp_ipv4.c | 7 ++-----
net/ipv6/tcp_ipv6.c | 9 +++------
2 files changed, 5 insertions(+), 11 deletions(-)
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index b7526a7888cb..2584ccae01e5 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1512,7 +1512,6 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, int optname,
const union tcp_md5_addr *addr;
u8 prefixlen = 32;
int l3index = 0;
- bool l3flag;
u8 flags;
if (optlen < sizeof(cmd))
@@ -1525,7 +1524,6 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, int optname,
return -EINVAL;
flags = cmd.tcpm_flags & TCP_MD5SIG_FLAG_IFINDEX;
- l3flag = cmd.tcpm_flags & TCP_MD5SIG_FLAG_IFINDEX;
if (optname == TCP_MD5SIG_EXT &&
cmd.tcpm_flags & TCP_MD5SIG_FLAG_PREFIX) {
@@ -1534,8 +1532,7 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, int optname,
return -EINVAL;
}
- if (optname == TCP_MD5SIG_EXT && cmd.tcpm_ifindex &&
- cmd.tcpm_flags & TCP_MD5SIG_FLAG_IFINDEX) {
+ if (optname == TCP_MD5SIG_EXT && cmd.tcpm_ifindex && flags) {
struct net_device *dev;
rcu_read_lock();
@@ -1563,7 +1560,7 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, int optname,
/* Don't allow keys for peers that have a matching TCP-AO key.
* See the comment in tcp_ao_add_cmd()
*/
- if (tcp_ao_required(sk, addr, AF_INET, l3flag ? l3index : -1, false))
+ if (tcp_ao_required(sk, addr, AF_INET, flags ? l3index : -1, false))
return -EKEYREJECTED;
return tcp_md5_do_add(sk, addr, AF_INET, prefixlen, l3index, flags,
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 7df21c1cba21..184b223fa0db 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -610,7 +610,6 @@ static int tcp_v6_parse_md5_keys(struct sock *sk, int optname,
union tcp_ao_addr *addr;
int l3index = 0;
u8 prefixlen;
- bool l3flag;
u8 flags;
if (optlen < sizeof(cmd))
@@ -623,7 +622,6 @@ static int tcp_v6_parse_md5_keys(struct sock *sk, int optname,
return -EINVAL;
flags = cmd.tcpm_flags & TCP_MD5SIG_FLAG_IFINDEX;
- l3flag = cmd.tcpm_flags & TCP_MD5SIG_FLAG_IFINDEX;
if (optname == TCP_MD5SIG_EXT &&
cmd.tcpm_flags & TCP_MD5SIG_FLAG_PREFIX) {
@@ -635,8 +633,7 @@ static int tcp_v6_parse_md5_keys(struct sock *sk, int optname,
prefixlen = ipv6_addr_v4mapped(&sin6->sin6_addr) ? 32 : 128;
}
- if (optname == TCP_MD5SIG_EXT && cmd.tcpm_ifindex &&
- cmd.tcpm_flags & TCP_MD5SIG_FLAG_IFINDEX) {
+ if (optname == TCP_MD5SIG_EXT && cmd.tcpm_ifindex && flags) {
struct net_device *dev;
rcu_read_lock();
@@ -671,7 +668,7 @@ static int tcp_v6_parse_md5_keys(struct sock *sk, int optname,
* See the comment in tcp_ao_add_cmd()
*/
if (tcp_ao_required(sk, addr, AF_INET,
- l3flag ? l3index : -1, false))
+ flags ? l3index : -1, false))
return -EKEYREJECTED;
return tcp_md5_do_add(sk, addr,
AF_INET, prefixlen, l3index, flags,
@@ -683,7 +680,7 @@ static int tcp_v6_parse_md5_keys(struct sock *sk, int optname,
/* Don't allow keys for peers that have a matching TCP-AO key.
* See the comment in tcp_ao_add_cmd()
*/
- if (tcp_ao_required(sk, addr, AF_INET6, l3flag ? l3index : -1, false))
+ if (tcp_ao_required(sk, addr, AF_INET6, flags ? l3index : -1, false))
return -EKEYREJECTED;
return tcp_md5_do_add(sk, addr, AF_INET6, prefixlen, l3index, flags,
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH mptcp-next v6 2/7] mptcp: handle TCP_MAXSEG getsockopt in common case
2025-11-05 9:29 [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support Geliang Tang
2025-11-05 9:29 ` [PATCH mptcp-next v6 1/7] tcp: md5: remove redundant l3flag variable Geliang Tang
@ 2025-11-05 9:29 ` Geliang Tang
2025-11-05 9:29 ` [PATCH mptcp-next v6 3/7] mptcp: setsockopt support for TCP_MD5SIG Geliang Tang
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Geliang Tang @ 2025-11-05 9:29 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Move TCP_MAXSEG getsockopt handling to the common switch statement
for consistency with other TCP options.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
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 de90a2897d2d..e2d1b4b6b3b2 100644
--- a/net/mptcp/sockopt.c
+++ b/net/mptcp/sockopt.c
@@ -1408,6 +1408,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:
@@ -1432,9 +1433,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;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH mptcp-next v6 3/7] mptcp: setsockopt support for TCP_MD5SIG
2025-11-05 9:29 [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support Geliang Tang
2025-11-05 9:29 ` [PATCH mptcp-next v6 1/7] tcp: md5: remove redundant l3flag variable Geliang Tang
2025-11-05 9:29 ` [PATCH mptcp-next v6 2/7] mptcp: handle TCP_MAXSEG getsockopt in common case Geliang Tang
@ 2025-11-05 9:29 ` Geliang Tang
2025-11-05 9:29 ` [PATCH mptcp-next v6 4/7] selftests: mptcp: sockopt: add md5 argument Geliang Tang
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Geliang Tang @ 2025-11-05 9:29 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Add setsockopt support for TCP_MD5SIG and TCP_MD5SIG_EXT. These options
force fallback to TCP to maintain MD5 compatibility. Apply them only to
the first subflow.
Note that getsockopt for these options remains unsupported, consistent
with TCP.
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/575
Fixes: d9e4c1291810 ("mptcp: only admit explicitly supported sockopt")
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/sockopt.c | 14 ++++++++++++--
net/mptcp/subflow.c | 3 +++
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c
index e2d1b4b6b3b2..a3efaf5db256 100644
--- a/net/mptcp/sockopt.c
+++ b/net/mptcp/sockopt.c
@@ -13,6 +13,7 @@
#include <net/tcp.h>
#include <net/mptcp.h>
#include "protocol.h"
+#include "mib.h"
#define MIN_INFO_OPTLEN_SIZE 16
#define MIN_FULL_INFO_OPTLEN_SIZE 40
@@ -567,11 +568,12 @@ static bool mptcp_supported_sockopt(int level, int optname)
case TCP_FASTOPEN_CONNECT:
case TCP_FASTOPEN_KEY:
case TCP_FASTOPEN_NO_COOKIE:
+ /* MD5 will force a fallback to TCP: OK to set while not connected */
+ case TCP_MD5SIG:
+ case TCP_MD5SIG_EXT:
return true;
}
- /* TCP_MD5SIG, TCP_MD5SIG_EXT are not supported, MD5 is not compatible with MPTCP */
-
/* TCP_REPAIR, TCP_REPAIR_QUEUE, TCP_QUEUE_SEQ, TCP_REPAIR_OPTIONS,
* TCP_REPAIR_WINDOW are not supported, better avoid this mess
*/
@@ -836,6 +838,14 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
case TCP_FASTOPEN_NO_COOKIE:
return mptcp_setsockopt_first_sf_only(msk, SOL_TCP, optname,
optval, optlen);
+ case TCP_MD5SIG:
+ case TCP_MD5SIG_EXT:
+ ret = mptcp_setsockopt_first_sf_only(msk, SOL_TCP, optname,
+ optval, optlen);
+ if (ret == 0)
+ WARN_ON_ONCE(!__mptcp_try_fallback(msk,
+ MPTCP_MIB_MD5SIGFALLBACK));
+ return ret;
}
ret = mptcp_get_int_option(msk, optval, optlen, &val);
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index 7eef4aaf78e2..5e29eee72656 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -155,6 +155,9 @@ static int subflow_check_req(struct request_sock *req,
pr_debug("subflow_req=%p, listener=%p\n", subflow_req, listener);
+ if (__mptcp_check_fallback(mptcp_sk(listener->conn)))
+ return 0;
+
#ifdef CONFIG_TCP_MD5SIG
/* no MPTCP if MD5SIG is enabled on this socket or we may run out of
* TCP option space.
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH mptcp-next v6 4/7] selftests: mptcp: sockopt: add md5 argument
2025-11-05 9:29 [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support Geliang Tang
` (2 preceding siblings ...)
2025-11-05 9:29 ` [PATCH mptcp-next v6 3/7] mptcp: setsockopt support for TCP_MD5SIG Geliang Tang
@ 2025-11-05 9:29 ` Geliang Tang
2025-11-05 9:29 ` [PATCH mptcp-next v6 5/7] selftests: mptcp: sockopt: implement TCP_MD5SIG support Geliang Tang
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Geliang Tang @ 2025-11-05 9:29 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Add '-m' option to support TCP_MD5SIG tests. Accepts MD5 keys in
'md5,key=<value>' or 'md5ext,prefixlen,ifindex,key' format.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../testing/selftests/net/mptcp/mptcp_sockopt.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index 286164f7246e..fcf1d7a195d1 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -27,6 +27,10 @@
#include <linux/tcp.h>
static int pf = AF_INET;
+static bool md5;
+static char key[TCP_MD5SIG_MAXKEYLEN];
+static int prefixlen;
+static int ifindex;
#ifndef IPPROTO_MPTCP
#define IPPROTO_MPTCP 262
@@ -135,7 +139,7 @@ static void die_perror(const char *msg)
static void die_usage(int r)
{
- fprintf(stderr, "Usage: mptcp_sockopt [-6]\n");
+ fprintf(stderr, "Usage: mptcp_sockopt [-6] [-m md5,key|md5ext,prefixlen,ifindex,key]\n");
exit(r);
}
@@ -263,7 +267,7 @@ static void parse_opts(int argc, char **argv)
{
int c;
- while ((c = getopt(argc, argv, "h6")) != -1) {
+ while ((c = getopt(argc, argv, "h6m:")) != -1) {
switch (c) {
case 'h':
die_usage(0);
@@ -271,6 +275,14 @@ static void parse_opts(int argc, char **argv)
case '6':
pf = AF_INET6;
break;
+ case 'm':
+ md5 = true;
+ if (!strncmp(optarg, "md5,", 4))
+ sscanf(optarg, "md5,key=%s", key);
+ else if (!strncmp(optarg, "md5ext,", 6))
+ sscanf(optarg, "md5ext,prefixlen=%u,ifindex=%u,key=%s",
+ &prefixlen, &ifindex, key);
+ break;
default:
die_usage(1);
break;
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH mptcp-next v6 5/7] selftests: mptcp: sockopt: implement TCP_MD5SIG support
2025-11-05 9:29 [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support Geliang Tang
` (3 preceding siblings ...)
2025-11-05 9:29 ` [PATCH mptcp-next v6 4/7] selftests: mptcp: sockopt: add md5 argument Geliang Tang
@ 2025-11-05 9:29 ` Geliang Tang
2025-11-05 9:29 ` [PATCH mptcp-next v6 6/7] selftests: mptcp: sockopt: skip getsockopt for MD5 tests Geliang Tang
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Geliang Tang @ 2025-11-05 9:29 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Add socket option handling for TCP_MD5SIG and TCP_MD5SIG_EXT.
Configure MD5 keys using the key provided via '-m' parameter.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/net/mptcp/mptcp_sockopt.c | 49 +++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index fcf1d7a195d1..e577fbec9373 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -25,6 +25,7 @@
#include <netinet/in.h>
#include <linux/tcp.h>
+#include <arpa/inet.h>
static int pf = AF_INET;
static bool md5;
@@ -186,6 +187,50 @@ static void xgetaddrinfo(const char *node, const char *service,
}
}
+static void do_setsockopt_md5sig(int fd)
+{
+ struct sockaddr_storage *addr;
+ size_t key_len = strlen(key);
+ struct tcp_md5sig md5sig;
+ int opt = TCP_MD5SIG;
+
+ memset(&md5sig, 0, sizeof(md5sig));
+ addr = (struct sockaddr_storage *)&md5sig.tcpm_addr;
+ addr->ss_family = pf;
+
+ if ((pf == AF_INET ? inet_pton(pf, "127.0.0.1", &((struct sockaddr_in *)addr)->sin_addr) :
+ inet_pton(pf, "::1", &((struct sockaddr_in6 *)addr)->sin6_addr)) != 1)
+ perror("inet_pton failed");
+
+ if (key_len > sizeof(md5sig.tcpm_key))
+ perror("Key too long\n");
+
+ memcpy(md5sig.tcpm_key, key, key_len);
+ md5sig.tcpm_keylen = key_len;
+
+ if (prefixlen || ifindex)
+ opt = TCP_MD5SIG_EXT;
+
+ if (prefixlen) {
+ md5sig.tcpm_flags |= TCP_MD5SIG_FLAG_PREFIX;
+ md5sig.tcpm_prefixlen = prefixlen;
+ }
+
+ if (ifindex) {
+ md5sig.tcpm_flags |= TCP_MD5SIG_FLAG_IFINDEX;
+ md5sig.tcpm_ifindex = (uint8_t)ifindex;
+ }
+
+ if (setsockopt(fd, IPPROTO_TCP, opt, &md5sig, sizeof(md5sig)))
+ perror("setsockopt(TCP_MD5SIG)");
+}
+
+static void do_setsockopts(int fd)
+{
+ if (md5)
+ do_setsockopt_md5sig(fd);
+}
+
static int sock_listen_mptcp(const char * const listenaddr,
const char * const port)
{
@@ -213,6 +258,8 @@ static int sock_listen_mptcp(const char * const listenaddr,
sizeof(one)))
perror("setsockopt");
+ do_setsockopts(sock);
+
if (bind(sock, a->ai_addr, a->ai_addrlen) == 0)
break; /* success */
@@ -250,6 +297,8 @@ static int sock_connect_mptcp(const char * const remoteaddr,
if (sock < 0)
continue;
+ do_setsockopts(sock);
+
if (connect(sock, a->ai_addr, a->ai_addrlen) == 0)
break; /* success */
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH mptcp-next v6 6/7] selftests: mptcp: sockopt: skip getsockopt for MD5 tests
2025-11-05 9:29 [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support Geliang Tang
` (4 preceding siblings ...)
2025-11-05 9:29 ` [PATCH mptcp-next v6 5/7] selftests: mptcp: sockopt: implement TCP_MD5SIG support Geliang Tang
@ 2025-11-05 9:29 ` Geliang Tang
2025-11-05 9:29 ` [PATCH mptcp-next v6 7/7] selftests: mptcp: sockopt: add TCP_MD5SIG test cases Geliang Tang
2025-11-05 11:37 ` [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support MPTCP CI
7 siblings, 0 replies; 9+ messages in thread
From: Geliang Tang @ 2025-11-05 9:29 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Skip getsockopt checks during MD5 tests since MD5 connections fallback
to TCP and MPTCP socket options are not available.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/net/mptcp/mptcp_sockopt.c | 21 ++++++++-----------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index e577fbec9373..9bac1494b238 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -426,7 +426,7 @@ static void do_getsockopt_mptcp_info(struct so_state *s, int fd, size_t w)
ret = getsockopt(fd, SOL_MPTCP, MPTCP_INFO, &i, &olen);
if (ret < 0)
- die_perror("getsockopt MPTCP_INFO");
+ return;
s->pkt_stats_avail = olen >= sizeof(i);
@@ -457,7 +457,7 @@ static void do_getsockopt_tcp_info(struct so_state *s, int fd, size_t r, size_t
ret = getsockopt(fd, SOL_MPTCP, MPTCP_TCPINFO, &ti, &olen);
if (ret < 0)
- xerror("getsockopt MPTCP_TCPINFO (tries %d, %m)");
+ return;
assert(olen <= sizeof(ti));
assert(ti.d.size_kernel > 0);
@@ -512,7 +512,7 @@ static void do_getsockopt_subflow_addrs(struct so_state *s, int fd)
ret = getsockopt(fd, SOL_MPTCP, MPTCP_SUBFLOW_ADDRS, &addrs, &olen);
if (ret < 0)
- die_perror("getsockopt MPTCP_SUBFLOW_ADDRS");
+ return;
assert(olen <= sizeof(addrs));
assert(addrs.d.size_kernel > 0);
@@ -582,13 +582,8 @@ static void do_getsockopt_mptcp_full_info(struct so_state *s, int fd)
olen = data_size;
ret = getsockopt(fd, SOL_MPTCP, MPTCP_FULL_INFO, &mfi, &olen);
- if (ret < 0) {
- if (errno == EOPNOTSUPP) {
- perror("MPTCP_FULL_INFO test skipped");
- return;
- }
- xerror("getsockopt MPTCP_FULL_INFO");
- }
+ if (ret < 0)
+ return;
assert(olen <= data_size);
assert(mfi.size_tcpinfo_kernel > 0);
@@ -692,7 +687,8 @@ static void connect_one_server(int fd, int pipefd)
if (eof)
total += 1; /* sequence advances due to FIN */
- assert(s.mptcpi_rcv_delta == (uint64_t)total);
+ if (s.mptcpi_rcv_delta)
+ assert(s.mptcpi_rcv_delta == (uint64_t)total);
close(fd);
}
@@ -727,7 +723,8 @@ static void process_one_client(int fd, int pipefd)
xerror("expected EOF, got %lu", ret3);
do_getsockopts(&s, fd, ret, ret2);
- if (s.mptcpi_rcv_delta != (uint64_t)ret + 1)
+ if (s.mptcpi_rcv_delta &&
+ s.mptcpi_rcv_delta != (uint64_t)ret + 1)
xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64,
s.mptcpi_rcv_delta, ret + 1, s.mptcpi_rcv_delta - (ret + 1));
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH mptcp-next v6 7/7] selftests: mptcp: sockopt: add TCP_MD5SIG test cases
2025-11-05 9:29 [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support Geliang Tang
` (5 preceding siblings ...)
2025-11-05 9:29 ` [PATCH mptcp-next v6 6/7] selftests: mptcp: sockopt: skip getsockopt for MD5 tests Geliang Tang
@ 2025-11-05 9:29 ` Geliang Tang
2025-11-05 11:37 ` [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support MPTCP CI
7 siblings, 0 replies; 9+ messages in thread
From: Geliang Tang @ 2025-11-05 9:29 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Add self tests for TCP_MD5SIG and TCP_MD5SIG_EXT:
- IPv4/IPv6 test cases
- VRF interface handling for extended MD5 tests
- Integration into existing test suite
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
tools/testing/selftests/net/mptcp/config | 3 ++
.../selftests/net/mptcp/mptcp_sockopt.sh | 51 +++++++++++++++++++
2 files changed, 54 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/config b/tools/testing/selftests/net/mptcp/config
index 59051ee2a986..44e3523bc8c3 100644
--- a/tools/testing/selftests/net/mptcp/config
+++ b/tools/testing/selftests/net/mptcp/config
@@ -34,3 +34,6 @@ CONFIG_NFT_SOCKET=m
CONFIG_NFT_TPROXY=m
CONFIG_SYN_COOKIES=y
CONFIG_VETH=y
+CONFIG_TCP_MD5SIG=y
+CONFIG_NET_L3_MASTER_DEV=y
+CONFIG_NET_VRF=y
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
index f01989be6e9b..dc58bfe88daa 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -348,6 +348,56 @@ do_tcpinq_tests()
return $?
}
+do_tcpmd5_test()
+{
+ print_title "TCP_MD5SIG $*" | head -c 53
+ ip netns exec "$ns_sbox" ./mptcp_sockopt "$@"
+ local lret=$?
+ if [ $lret -ne 0 ];then
+ ret=$lret
+ mptcp_lib_pr_fail
+ mptcp_lib_result_fail "TCP_MD5SIG: $*"
+ return $lret
+ fi
+
+ mptcp_lib_pr_ok
+ mptcp_lib_result_pass "TCP_MD5SIG: $*"
+ return $lret
+}
+
+do_tcpmd5_tests()
+{
+ local lret=0
+
+ mptcp_lib_print_info "sockopt TCP_MD5SIG"
+
+ do_tcpmd5_test -m "md5,key=0123456789"
+ lret=$?
+ if [ $lret -ne 0 ] ; then
+ return $lret
+ fi
+ do_tcpmd5_test -6 -m "md5,key=0123456789"
+ lret=$?
+ if [ $lret -ne 0 ] ; then
+ return $lret
+ fi
+
+ ip netns exec "$ns_sbox" ip link add vrf-test type vrf table 100
+ vrf=$(ip netns exec "$ns_sbox" ip link show vrf-test |
+ awk -F':' '{print $1; exit}')
+ do_tcpmd5_test -m "md5ext,prefixlen=1,ifindex=$vrf,key=0123456789"
+ lret=$?
+ if [ $lret -ne 0 ] ; then
+ ip netns exec "$ns_sbox" ip link del vrf-test
+ return $lret
+ fi
+ do_tcpmd5_test -6 -m "md5ext,prefixlen=1,ifindex=$vrf,key=0123456789"
+ lret=$?
+
+ ip netns exec "$ns_sbox" ip link del vrf-test
+ return $lret
+}
+
sin=$(mktemp)
sout=$(mktemp)
cin=$(mktemp)
@@ -363,6 +413,7 @@ run_tests $ns1 $ns2 dead:beef:1::1
do_mptcp_sockopt_tests
do_tcpinq_tests
+do_tcpmd5_tests
mptcp_lib_result_print_all_tap
exit $ret
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support
2025-11-05 9:29 [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support Geliang Tang
` (6 preceding siblings ...)
2025-11-05 9:29 ` [PATCH mptcp-next v6 7/7] selftests: mptcp: sockopt: add TCP_MD5SIG test cases Geliang Tang
@ 2025-11-05 11:37 ` MPTCP CI
7 siblings, 0 replies; 9+ messages in thread
From: MPTCP CI @ 2025-11-05 11:37 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 (except selftest_mptcp_join): Unstable: 1 failed test(s): packetdrill_sockopts 🔴
- KVM Validation: normal (only selftest_mptcp_join): Success! ✅
- KVM Validation: debug (except selftest_mptcp_join): Unstable: 3 failed test(s): packetdrill_mp_join packetdrill_sockopts selftest_mptcp_connect_mmap 🔴
- KVM Validation: debug (only selftest_mptcp_join): Success! ✅
- KVM Validation: btf-normal (only bpftest_all): Success! ✅
- KVM Validation: btf-debug (only bpftest_all): Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/19097849691
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/73158e211c60
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=1019796
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] 9+ messages in thread