MPTCP Linux Development
 help / color / mirror / Atom feed
* [mptcp-next] selftests: mptcp: cover 'mptcp_diag_dump_one' in mptcp_sockopt
@ 2025-01-17  6:44 Gang Yan
  2025-01-17  7:55 ` MPTCP CI
  2025-01-17 16:35 ` Matthieu Baerts
  0 siblings, 2 replies; 3+ messages in thread
From: Gang Yan @ 2025-01-17  6:44 UTC (permalink / raw)
  To: Matthieu Baerts, Mat Martineau, Geliang Tang; +Cc: Gang Yan, mptcp

From: Gang Yan <yangang@kylinos.cn>

Through code coverage analysis, it has been identified that the
'mptcp_diag_dump_one' function lacks test coverage on the testing front.

This patch introduces a function in mptcp_sockopt.c, which is built upon
the 'inet_diag' module, and integrates it into the 'mptcp_sockopt.sh' to
execute the 'mptcp_diag_dump_one' function when server bound a socket.

Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/524
Signed-off-by: Gang Yan <yangang@kylinos.cn>
---
 .../selftests/net/mptcp/mptcp_sockopt.c       | 76 ++++++++++++++++++-
 .../selftests/net/mptcp/mptcp_sockopt.sh      |  6 ++
 2 files changed, 81 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index 926b0be87c99..caa0466d827f 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -25,6 +25,10 @@
 #include <netinet/in.h>
 
 #include <linux/tcp.h>
+#include <linux/netlink.h>
+#include <linux/inet_diag.h>
+#include <linux/rtnetlink.h>
+#include <linux/sock_diag.h>
 
 static int pf = AF_INET;
 
@@ -250,11 +254,77 @@ static int sock_connect_mptcp(const char * const remoteaddr,
 	return sock;
 }
 
+static void send_query(int fd)
+{
+	struct sockaddr_nl nladdr = {
+		.nl_family = AF_NETLINK
+	};
+	struct {
+		struct nlmsghdr nlh;
+		struct inet_diag_req_v2 r;
+	} req = {
+		.nlh = {
+			.nlmsg_len = sizeof(req),
+			.nlmsg_type = SOCK_DIAG_BY_FAMILY,
+			.nlmsg_flags = NLM_F_REQUEST | NLM_F_ATOMIC
+		},
+		.r = {
+			.sdiag_family = AF_INET,
+			.sdiag_protocol = IPPROTO_MPTCP,
+		}
+	};
+	struct rtattr rta_proto;
+	struct iovec iov[6];
+	int iovlen = 1;
+	__u32 proto;
+
+	proto = IPPROTO_MPTCP;
+	rta_proto.rta_type = INET_DIAG_REQ_PROTOCOL;
+	rta_proto.rta_len = RTA_LENGTH(sizeof(proto));
+
+	iov[0] = (struct iovec) {
+		.iov_base = &req,
+		.iov_len = sizeof(req)
+	};
+	iov[iovlen] = (struct iovec){ &rta_proto, sizeof(rta_proto)};
+	iov[iovlen+1] = (struct iovec){ &proto, sizeof(proto)};
+	req.nlh.nlmsg_len += RTA_LENGTH(sizeof(proto));
+	iovlen += 2;
+
+	struct msghdr msg = {
+		.msg_name = &nladdr,
+		.msg_namelen = sizeof(nladdr),
+		.msg_iov = iov,
+		.msg_iovlen = iovlen
+	};
+
+	for (;;) {
+		if (sendmsg(fd, &msg, 0) < 0) {
+			if (errno == EINTR)
+				continue;
+			die_perror("sendmsg");
+		}
+		return;
+	}
+}
+
+void diag(void)
+{
+	int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG);
+
+	if (fd < 0)
+		die_perror("Netlink socket");
+
+	send_query(fd);
+
+	close(fd);
+}
+
 static void parse_opts(int argc, char **argv)
 {
 	int c;
 
-	while ((c = getopt(argc, argv, "h6")) != -1) {
+	while ((c = getopt(argc, argv, "h6d")) != -1) {
 		switch (c) {
 		case 'h':
 			die_usage(0);
@@ -262,6 +332,10 @@ static void parse_opts(int argc, char **argv)
 		case '6':
 			pf = AF_INET6;
 			break;
+		case 'd':
+			diag();
+			exit(0);
+			break;
 		default:
 			die_usage(1);
 			break;
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
index 5e8d5b83e2d0..3f74100bc023 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -278,6 +278,11 @@ do_mptcp_sockopt_tests()
 	mptcp_lib_result_pass "sockopt v6"
 }
 
+do_diag_tests()
+{
+	ip netns exec "$ns_sbox" ./mptcp_sockopt -d
+}
+
 run_tests()
 {
 	local listener_ns="$1"
@@ -356,6 +361,7 @@ run_tests $ns1 $ns2 dead:beef:1::1
 
 do_mptcp_sockopt_tests
 do_tcpinq_tests
+do_diag_tests
 
 mptcp_lib_result_print_all_tap
 exit $ret
-- 
2.25.1


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

end of thread, other threads:[~2025-01-17 16:35 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-17  6:44 [mptcp-next] selftests: mptcp: cover 'mptcp_diag_dump_one' in mptcp_sockopt Gang Yan
2025-01-17  7:55 ` MPTCP CI
2025-01-17 16:35 ` Matthieu Baerts

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