[PATCH mptcp-next 2/3] selftests: bpf: verify ca_name of struct mptcp_sock

Geliang Tang posted 3 patches 3 years, 11 months ago
There is a newer version of this series
[PATCH mptcp-next 2/3] selftests: bpf: verify ca_name of struct mptcp_sock
Posted by Geliang Tang 3 years, 11 months ago
This patch verified another member of struct mptcp_sock, ca_name. Added a
new function get_msk_ca_name() to read the sysctl tcp_congestion_control
and verified it in verify_msk().

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 tools/testing/selftests/bpf/bpf_tcp_helpers.h |  3 ++
 .../testing/selftests/bpf/prog_tests/mptcp.c  | 33 +++++++++++++++++++
 tools/testing/selftests/bpf/progs/mptcp.c     |  8 +++--
 3 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
index 9ea6687c8f4d..57de5ca5ed50 100644
--- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h
+++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
@@ -16,6 +16,8 @@ BPF_PROG(name, args)
 #define SOL_TCP 6
 #endif
 
+#define TCP_CA_NAME_MAX	16
+
 #define tcp_jiffies32 ((__u32)bpf_jiffies64())
 
 struct sock_common {
@@ -87,6 +89,7 @@ struct mptcp_sock {
 	struct inet_connection_sock	sk;
 
 	__u32		token;
+	char		ca_name[TCP_CA_NAME_MAX];
 } __attribute__((preserve_access_index));
 
 static __always_inline struct inet_connection_sock *inet_csk(const struct sock *sk)
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index 80ae5a9777bf..aff35ab33379 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -3,12 +3,16 @@
 #include "cgroup_helpers.h"
 #include "network_helpers.h"
 
+#define TCP_CA_SYSCTL	"/proc/sys/net/ipv4/tcp_congestion_control"
+#define TCP_CA_NAME_MAX	16
+
 char monitor_log_path[64];
 
 struct mptcp_storage {
 	__u32 invoked;
 	__u32 is_mptcp;
 	__u32 token;
+	char ca_name[TCP_CA_NAME_MAX];
 };
 
 static int verify_tsk(int map_fd, int client_fd)
@@ -77,14 +81,37 @@ static __u32 get_msk_token(void)
 	return token;
 }
 
+void get_msk_ca_name(char ca_name[])
+{
+	ssize_t len;
+	int fd;
+
+	fd = open(TCP_CA_SYSCTL, O_RDONLY);
+	if (CHECK_FAIL(fd < 0)) {
+		log_err("Failed to open %s", TCP_CA_SYSCTL);
+		return;
+	}
+
+	len = read(fd, ca_name, TCP_CA_NAME_MAX);
+	if (CHECK_FAIL(len < 0)) {
+		log_err("Failed to read %s", TCP_CA_SYSCTL);
+		goto err;
+	}
+
+err:
+	close(fd);
+}
+
 static int verify_msk(int map_fd, int client_fd)
 {
 	char *msg = "MPTCP subflow socket";
 	int err = 0, cfd = client_fd;
 	struct mptcp_storage val;
+	char ca_name[TCP_CA_NAME_MAX];
 	__u32 token;
 
 	token = get_msk_token();
+	get_msk_ca_name(ca_name);
 	if (token <= 0) {
 		log_err("Unexpected token %x", token);
 		return -1;
@@ -113,6 +140,12 @@ static int verify_msk(int map_fd, int client_fd)
 		err++;
 	}
 
+	if (strncmp(val.ca_name, ca_name, strlen(val.ca_name))) {
+		log_err("Unexpected mptcp_sock.ca_name %s != %s",
+			val.ca_name, ca_name);
+		err++;
+	}
+
 	return err;
 }
 
diff --git a/tools/testing/selftests/bpf/progs/mptcp.c b/tools/testing/selftests/bpf/progs/mptcp.c
index 928111f56f69..61adc4396abf 100644
--- a/tools/testing/selftests/bpf/progs/mptcp.c
+++ b/tools/testing/selftests/bpf/progs/mptcp.c
@@ -1,4 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
+#include <string.h>
 #include <linux/bpf.h>
 #include <bpf/bpf_helpers.h>
 #include "bpf_tcp_helpers.h"
@@ -10,6 +11,7 @@ struct mptcp_storage {
 	__u32 invoked;
 	__u32 is_mptcp;
 	__u32 token;
+	char ca_name[TCP_CA_NAME_MAX];
 };
 
 struct {
@@ -23,7 +25,7 @@ SEC("sockops")
 int _sockops(struct bpf_sock_ops *ctx)
 {
 	char fmt1[] = "invoked=%u is_mptcp=%u";
-	char fmt2[] = "token=%x";
+	char fmt2[] = "token=%x ca_name=%s";
 	struct mptcp_storage *storage;
 	struct bpf_tcp_sock *tcp_sk;
 	struct mptcp_sock *msk;
@@ -48,6 +50,7 @@ int _sockops(struct bpf_sock_ops *ctx)
 			return 1;
 
 		storage->token = 0;
+		bzero(storage->ca_name, TCP_CA_NAME_MAX);
 	} else {
 		msk = bpf_skc_to_mptcp_sock(sk);
 		if (!msk)
@@ -59,13 +62,14 @@ int _sockops(struct bpf_sock_ops *ctx)
 			return 1;
 
 		storage->token = msk->token;
+		memcpy(storage->ca_name, msk->ca_name, TCP_CA_NAME_MAX);
 	}
 	storage->invoked++;
 	storage->is_mptcp = tcp_sk->is_mptcp;
 	bpf_trace_printk(fmt1, sizeof(fmt1),
 			 storage->invoked, storage->is_mptcp);
 	bpf_trace_printk(fmt2, sizeof(fmt2),
-			 storage->token);
+			 storage->token, storage->ca_name);
 
 	return 1;
 }
-- 
2.34.1