MPTCP Linux Development
 help / color / mirror / Atom feed
* [PATCH mptcp-next v6 0/7] mptcp: TCP_MD5SIG support
@ 2025-11-05  9:29 Geliang Tang
  2025-11-05  9:29 ` [PATCH mptcp-next v6 1/7] tcp: md5: remove redundant l3flag variable Geliang Tang
                   ` (7 more replies)
  0 siblings, 8 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>

v6:
 - update selftests.
 - move "tcp: md5: remove redundant l3flag variable" into this set.

v5:
 - new selftests for MD5.
Link: https://patchwork.kernel.org/project/mptcp/cover/cover.1754837808.git.tanggeliang@kylinos.cn/

v4:
 - drop CONFIG_TCP_MD5SIG check.
 - drop sk_state check.
 - use WARN_ON_ONCE for __mptcp_try_fallback().

v3:
 - limit the use of these options for listened and closed state.
 - check the return value of __mptcp_try_fallback().

v2:
 - trigger fallback to TCP.
 - check CONFIG_TCP_MD5SIG.
 - update MD5 comment.
 - drop selftests, packetdrill tests will be added later.

This series introduces support for TCP_MD5SIG socket options in MPTCP along
with code improvements:

Patch 1: Refactors TCP_MAXSEG getsockopt handling to improve code
consistency
Patch 2: Adds setsockopt support for TCP_MD5SIG/TCP_MD5SIG_EXT (first
subflow only)

Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/575

Geliang Tang (7):
  tcp: md5: remove redundant l3flag variable
  mptcp: handle TCP_MAXSEG getsockopt in common case
  mptcp: setsockopt support for TCP_MD5SIG
  selftests: mptcp: sockopt: add md5 argument
  selftests: mptcp: sockopt: implement TCP_MD5SIG support
  selftests: mptcp: sockopt: skip getsockopt for MD5 tests
  selftests: mptcp: sockopt: add TCP_MD5SIG test cases

 net/ipv4/tcp_ipv4.c                           |  7 +-
 net/ipv6/tcp_ipv6.c                           |  9 +-
 net/mptcp/sockopt.c                           | 18 ++--
 net/mptcp/subflow.c                           |  3 +
 tools/testing/selftests/net/mptcp/config      |  3 +
 .../selftests/net/mptcp/mptcp_sockopt.c       | 86 ++++++++++++++++---
 .../selftests/net/mptcp/mptcp_sockopt.sh      | 51 +++++++++++
 7 files changed, 147 insertions(+), 30 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [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

end of thread, other threads:[~2025-11-05 11:37 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [PATCH mptcp-next v6 3/7] mptcp: setsockopt support for TCP_MD5SIG Geliang Tang
2025-11-05  9:29 ` [PATCH mptcp-next v6 4/7] selftests: mptcp: sockopt: add md5 argument Geliang Tang
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 ` [PATCH mptcp-next v6 6/7] selftests: mptcp: sockopt: skip getsockopt for MD5 tests 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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox