diff options
Diffstat (limited to 'tools/testing/selftests/bpf/test_tcpbpf_user.c')
| -rw-r--r-- | tools/testing/selftests/bpf/test_tcpbpf_user.c | 119 | 
1 files changed, 61 insertions, 58 deletions
| diff --git a/tools/testing/selftests/bpf/test_tcpbpf_user.c b/tools/testing/selftests/bpf/test_tcpbpf_user.c index 84ab5163c828..a275c2971376 100644 --- a/tools/testing/selftests/bpf/test_tcpbpf_user.c +++ b/tools/testing/selftests/bpf/test_tcpbpf_user.c @@ -1,27 +1,59 @@  // SPDX-License-Identifier: GPL-2.0 +#include <inttypes.h>  #include <stdio.h>  #include <stdlib.h> -#include <stdio.h>  #include <unistd.h>  #include <errno.h> -#include <signal.h>  #include <string.h> -#include <assert.h> -#include <linux/perf_event.h> -#include <linux/ptrace.h>  #include <linux/bpf.h> -#include <sys/ioctl.h> -#include <sys/time.h>  #include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h>  #include <bpf/bpf.h>  #include <bpf/libbpf.h> -#include "bpf_util.h" +  #include "bpf_rlimit.h" -#include <linux/perf_event.h> +#include "bpf_util.h" +#include "cgroup_helpers.h" +  #include "test_tcpbpf.h" +#define EXPECT_EQ(expected, actual, fmt)			\ +	do {							\ +		if ((expected) != (actual)) {			\ +			printf("  Value of: " #actual "\n"	\ +			       "    Actual: %" fmt "\n"		\ +			       "  Expected: %" fmt "\n",	\ +			       (actual), (expected));		\ +			goto err;				\ +		}						\ +	} while (0) + +int verify_result(const struct tcpbpf_globals *result) +{ +	__u32 expected_events; + +	expected_events = ((1 << BPF_SOCK_OPS_TIMEOUT_INIT) | +			   (1 << BPF_SOCK_OPS_RWND_INIT) | +			   (1 << BPF_SOCK_OPS_TCP_CONNECT_CB) | +			   (1 << BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB) | +			   (1 << BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB) | +			   (1 << BPF_SOCK_OPS_NEEDS_ECN) | +			   (1 << BPF_SOCK_OPS_STATE_CB) | +			   (1 << BPF_SOCK_OPS_TCP_LISTEN_CB)); + +	EXPECT_EQ(expected_events, result->event_map, "#" PRIx32); +	EXPECT_EQ(501ULL, result->bytes_received, "llu"); +	EXPECT_EQ(1002ULL, result->bytes_acked, "llu"); +	EXPECT_EQ(1, result->data_segs_in, PRIu32); +	EXPECT_EQ(1, result->data_segs_out, PRIu32); +	EXPECT_EQ(0x80, result->bad_cb_test_rv, PRIu32); +	EXPECT_EQ(0, result->good_cb_test_rv, PRIu32); +	EXPECT_EQ(1, result->num_listen, PRIu32); + +	return 0; +err: +	return -1; +} +  static int bpf_find_map(const char *test, struct bpf_object *obj,  			const char *name)  { @@ -35,42 +67,28 @@ static int bpf_find_map(const char *test, struct bpf_object *obj,  	return bpf_map__fd(map);  } -#define SYSTEM(CMD)						\ -	do {							\ -		if (system(CMD)) {				\ -			printf("system(%s) FAILS!\n", CMD);	\ -		}						\ -	} while (0) -  int main(int argc, char **argv)  {  	const char *file = "test_tcpbpf_kern.o";  	struct tcpbpf_globals g = {0}; -	int cg_fd, prog_fd, map_fd; -	bool debug_flag = false; +	const char *cg_path = "/foo";  	int error = EXIT_FAILURE;  	struct bpf_object *obj; -	char cmd[100], *dir; -	struct stat buffer; +	int prog_fd, map_fd; +	int cg_fd = -1;  	__u32 key = 0; -	int pid;  	int rv; -	if (argc > 1 && strcmp(argv[1], "-d") == 0) -		debug_flag = true; +	if (setup_cgroup_environment()) +		goto err; -	dir = "/tmp/cgroupv2/foo"; +	cg_fd = create_and_get_cgroup(cg_path); +	if (!cg_fd) +		goto err; -	if (stat(dir, &buffer) != 0) { -		SYSTEM("mkdir -p /tmp/cgroupv2"); -		SYSTEM("mount -t cgroup2 none /tmp/cgroupv2"); -		SYSTEM("mkdir -p /tmp/cgroupv2/foo"); -	} -	pid = (int) getpid(); -	sprintf(cmd, "echo %d >> /tmp/cgroupv2/foo/cgroup.procs", pid); -	SYSTEM(cmd); +	if (join_cgroup(cg_path)) +		goto err; -	cg_fd = open(dir, O_DIRECTORY, O_RDONLY);  	if (bpf_prog_load(file, BPF_PROG_TYPE_SOCK_OPS, &obj, &prog_fd)) {  		printf("FAILED: load_bpf_file failed for: %s\n", file);  		goto err; @@ -83,7 +101,10 @@ int main(int argc, char **argv)  		goto err;  	} -	SYSTEM("./tcp_server.py"); +	if (system("./tcp_server.py")) { +		printf("FAILED: TCP server\n"); +		goto err; +	}  	map_fd = bpf_find_map(__func__, obj, "global_map");  	if (map_fd < 0) @@ -95,34 +116,16 @@ int main(int argc, char **argv)  		goto err;  	} -	if (g.bytes_received != 501 || g.bytes_acked != 1002 || -	    g.data_segs_in != 1 || g.data_segs_out != 1 || -	    (g.event_map ^ 0x47e) != 0 || g.bad_cb_test_rv != 0x80 || -		g.good_cb_test_rv != 0) { +	if (verify_result(&g)) {  		printf("FAILED: Wrong stats\n"); -		if (debug_flag) { -			printf("\n"); -			printf("bytes_received: %d (expecting 501)\n", -			       (int)g.bytes_received); -			printf("bytes_acked:    %d (expecting 1002)\n", -			       (int)g.bytes_acked); -			printf("data_segs_in:   %d (expecting 1)\n", -			       g.data_segs_in); -			printf("data_segs_out:  %d (expecting 1)\n", -			       g.data_segs_out); -			printf("event_map:      0x%x (at least 0x47e)\n", -			       g.event_map); -			printf("bad_cb_test_rv: 0x%x (expecting 0x80)\n", -			       g.bad_cb_test_rv); -			printf("good_cb_test_rv:0x%x (expecting 0)\n", -			       g.good_cb_test_rv); -		}  		goto err;  	} +  	printf("PASSED!\n");  	error = 0;  err:  	bpf_prog_detach(cg_fd, BPF_CGROUP_SOCK_OPS); +	close(cg_fd); +	cleanup_cgroup_environment();  	return error; -  } |