153632e11SMartin KaFai Lau // SPDX-License-Identifier: GPL-2.0
253632e11SMartin KaFai Lau /* Copyright (c) 2020 Facebook */
353632e11SMartin KaFai Lau 
453632e11SMartin KaFai Lau #include <sys/types.h>
553632e11SMartin KaFai Lau #include <bpf/bpf.h>
653632e11SMartin KaFai Lau #include <bpf/libbpf.h>
753632e11SMartin KaFai Lau #include "test_progs.h"
853632e11SMartin KaFai Lau #include "network_helpers.h"
953632e11SMartin KaFai Lau #include "test_sk_storage_trace_itself.skel.h"
1053632e11SMartin KaFai Lau #include "test_sk_storage_tracing.skel.h"
1153632e11SMartin KaFai Lau 
1253632e11SMartin KaFai Lau #define LO_ADDR6 "::1"
1353632e11SMartin KaFai Lau #define TEST_COMM "test_progs"
1453632e11SMartin KaFai Lau 
1553632e11SMartin KaFai Lau struct sk_stg {
1653632e11SMartin KaFai Lau 	__u32 pid;
1753632e11SMartin KaFai Lau 	__u32 last_notclose_state;
1853632e11SMartin KaFai Lau 	char comm[16];
1953632e11SMartin KaFai Lau };
2053632e11SMartin KaFai Lau 
2153632e11SMartin KaFai Lau static struct test_sk_storage_tracing *skel;
2253632e11SMartin KaFai Lau static __u32 duration;
2353632e11SMartin KaFai Lau static pid_t my_pid;
2453632e11SMartin KaFai Lau 
check_sk_stg(int sk_fd,__u32 expected_state)2553632e11SMartin KaFai Lau static int check_sk_stg(int sk_fd, __u32 expected_state)
2653632e11SMartin KaFai Lau {
2753632e11SMartin KaFai Lau 	struct sk_stg sk_stg;
2853632e11SMartin KaFai Lau 	int err;
2953632e11SMartin KaFai Lau 
3053632e11SMartin KaFai Lau 	err = bpf_map_lookup_elem(bpf_map__fd(skel->maps.sk_stg_map), &sk_fd,
3153632e11SMartin KaFai Lau 				  &sk_stg);
3253632e11SMartin KaFai Lau 	if (!ASSERT_OK(err, "map_lookup(sk_stg_map)"))
3353632e11SMartin KaFai Lau 		return -1;
3453632e11SMartin KaFai Lau 
3553632e11SMartin KaFai Lau 	if (!ASSERT_EQ(sk_stg.last_notclose_state, expected_state,
3653632e11SMartin KaFai Lau 		       "last_notclose_state"))
3753632e11SMartin KaFai Lau 		return -1;
3853632e11SMartin KaFai Lau 
3953632e11SMartin KaFai Lau 	if (!ASSERT_EQ(sk_stg.pid, my_pid, "pid"))
4053632e11SMartin KaFai Lau 		return -1;
4153632e11SMartin KaFai Lau 
4253632e11SMartin KaFai Lau 	if (!ASSERT_STREQ(sk_stg.comm, skel->bss->task_comm, "task_comm"))
4353632e11SMartin KaFai Lau 		return -1;
4453632e11SMartin KaFai Lau 
4553632e11SMartin KaFai Lau 	return 0;
4653632e11SMartin KaFai Lau }
4753632e11SMartin KaFai Lau 
do_test(void)4853632e11SMartin KaFai Lau static void do_test(void)
4953632e11SMartin KaFai Lau {
5053632e11SMartin KaFai Lau 	int listen_fd = -1, passive_fd = -1, active_fd = -1, value = 1, err;
5153632e11SMartin KaFai Lau 	char abyte;
5253632e11SMartin KaFai Lau 
5353632e11SMartin KaFai Lau 	listen_fd = start_server(AF_INET6, SOCK_STREAM, LO_ADDR6, 0, 0);
5453632e11SMartin KaFai Lau 	if (CHECK(listen_fd == -1, "start_server",
5553632e11SMartin KaFai Lau 		  "listen_fd:%d errno:%d\n", listen_fd, errno))
5653632e11SMartin KaFai Lau 		return;
5753632e11SMartin KaFai Lau 
5853632e11SMartin KaFai Lau 	active_fd = connect_to_fd(listen_fd, 0);
5953632e11SMartin KaFai Lau 	if (CHECK(active_fd == -1, "connect_to_fd", "active_fd:%d errno:%d\n",
6053632e11SMartin KaFai Lau 		  active_fd, errno))
6153632e11SMartin KaFai Lau 		goto out;
6253632e11SMartin KaFai Lau 
6353632e11SMartin KaFai Lau 	err = bpf_map_update_elem(bpf_map__fd(skel->maps.del_sk_stg_map),
6453632e11SMartin KaFai Lau 				  &active_fd, &value, 0);
6553632e11SMartin KaFai Lau 	if (!ASSERT_OK(err, "map_update(del_sk_stg_map)"))
6653632e11SMartin KaFai Lau 		goto out;
6753632e11SMartin KaFai Lau 
6853632e11SMartin KaFai Lau 	passive_fd = accept(listen_fd, NULL, 0);
6953632e11SMartin KaFai Lau 	if (CHECK(passive_fd == -1, "accept", "passive_fd:%d errno:%d\n",
7053632e11SMartin KaFai Lau 		  passive_fd, errno))
7153632e11SMartin KaFai Lau 		goto out;
7253632e11SMartin KaFai Lau 
7353632e11SMartin KaFai Lau 	shutdown(active_fd, SHUT_WR);
7453632e11SMartin KaFai Lau 	err = read(passive_fd, &abyte, 1);
7553632e11SMartin KaFai Lau 	if (!ASSERT_OK(err, "read(passive_fd)"))
7653632e11SMartin KaFai Lau 		goto out;
7753632e11SMartin KaFai Lau 
7853632e11SMartin KaFai Lau 	shutdown(passive_fd, SHUT_WR);
7953632e11SMartin KaFai Lau 	err = read(active_fd, &abyte, 1);
8053632e11SMartin KaFai Lau 	if (!ASSERT_OK(err, "read(active_fd)"))
8153632e11SMartin KaFai Lau 		goto out;
8253632e11SMartin KaFai Lau 
8353632e11SMartin KaFai Lau 	err = bpf_map_lookup_elem(bpf_map__fd(skel->maps.del_sk_stg_map),
8453632e11SMartin KaFai Lau 				  &active_fd, &value);
8553632e11SMartin KaFai Lau 	if (!ASSERT_ERR(err, "map_lookup(del_sk_stg_map)"))
8653632e11SMartin KaFai Lau 		goto out;
8753632e11SMartin KaFai Lau 
8853632e11SMartin KaFai Lau 	err = check_sk_stg(listen_fd, BPF_TCP_LISTEN);
8953632e11SMartin KaFai Lau 	if (!ASSERT_OK(err, "listen_fd sk_stg"))
9053632e11SMartin KaFai Lau 		goto out;
9153632e11SMartin KaFai Lau 
9253632e11SMartin KaFai Lau 	err = check_sk_stg(active_fd, BPF_TCP_FIN_WAIT2);
9353632e11SMartin KaFai Lau 	if (!ASSERT_OK(err, "active_fd sk_stg"))
9453632e11SMartin KaFai Lau 		goto out;
9553632e11SMartin KaFai Lau 
9653632e11SMartin KaFai Lau 	err = check_sk_stg(passive_fd, BPF_TCP_LAST_ACK);
9753632e11SMartin KaFai Lau 	ASSERT_OK(err, "passive_fd sk_stg");
9853632e11SMartin KaFai Lau 
9953632e11SMartin KaFai Lau out:
10053632e11SMartin KaFai Lau 	if (active_fd != -1)
10153632e11SMartin KaFai Lau 		close(active_fd);
10253632e11SMartin KaFai Lau 	if (passive_fd != -1)
10353632e11SMartin KaFai Lau 		close(passive_fd);
10453632e11SMartin KaFai Lau 	if (listen_fd != -1)
10553632e11SMartin KaFai Lau 		close(listen_fd);
10653632e11SMartin KaFai Lau }
10753632e11SMartin KaFai Lau 
serial_test_sk_storage_tracing(void)108*d3f7b166SYucong Sun void serial_test_sk_storage_tracing(void)
10953632e11SMartin KaFai Lau {
11053632e11SMartin KaFai Lau 	struct test_sk_storage_trace_itself *skel_itself;
11153632e11SMartin KaFai Lau 	int err;
11253632e11SMartin KaFai Lau 
11353632e11SMartin KaFai Lau 	my_pid = getpid();
11453632e11SMartin KaFai Lau 
11553632e11SMartin KaFai Lau 	skel_itself = test_sk_storage_trace_itself__open_and_load();
11653632e11SMartin KaFai Lau 
11753632e11SMartin KaFai Lau 	if (!ASSERT_NULL(skel_itself, "test_sk_storage_trace_itself")) {
11853632e11SMartin KaFai Lau 		test_sk_storage_trace_itself__destroy(skel_itself);
11953632e11SMartin KaFai Lau 		return;
12053632e11SMartin KaFai Lau 	}
12153632e11SMartin KaFai Lau 
12253632e11SMartin KaFai Lau 	skel = test_sk_storage_tracing__open_and_load();
12353632e11SMartin KaFai Lau 	if (!ASSERT_OK_PTR(skel, "test_sk_storage_tracing"))
12453632e11SMartin KaFai Lau 		return;
12553632e11SMartin KaFai Lau 
12653632e11SMartin KaFai Lau 	err = test_sk_storage_tracing__attach(skel);
12753632e11SMartin KaFai Lau 	if (!ASSERT_OK(err, "test_sk_storage_tracing__attach")) {
12853632e11SMartin KaFai Lau 		test_sk_storage_tracing__destroy(skel);
12953632e11SMartin KaFai Lau 		return;
13053632e11SMartin KaFai Lau 	}
13153632e11SMartin KaFai Lau 
13253632e11SMartin KaFai Lau 	do_test();
13353632e11SMartin KaFai Lau 
13453632e11SMartin KaFai Lau 	test_sk_storage_tracing__destroy(skel);
13553632e11SMartin KaFai Lau }
136