Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
  1// SPDX-License-Identifier: GPL-2.0
  2/* Copyright (c) 2020 Facebook */
  3
  4#include <sys/types.h>
  5#include <bpf/bpf.h>
  6#include <bpf/libbpf.h>
  7#include "test_progs.h"
  8#include "network_helpers.h"
  9#include "test_sk_storage_trace_itself.skel.h"
 10#include "test_sk_storage_tracing.skel.h"
 11
 12#define LO_ADDR6 "::1"
 13#define TEST_COMM "test_progs"
 14
 15struct sk_stg {
 16	__u32 pid;
 17	__u32 last_notclose_state;
 18	char comm[16];
 19};
 20
 21static struct test_sk_storage_tracing *skel;
 22static __u32 duration;
 23static pid_t my_pid;
 24
 25static int check_sk_stg(int sk_fd, __u32 expected_state)
 26{
 27	struct sk_stg sk_stg;
 28	int err;
 29
 30	err = bpf_map_lookup_elem(bpf_map__fd(skel->maps.sk_stg_map), &sk_fd,
 31				  &sk_stg);
 32	if (!ASSERT_OK(err, "map_lookup(sk_stg_map)"))
 33		return -1;
 34
 35	if (!ASSERT_EQ(sk_stg.last_notclose_state, expected_state,
 36		       "last_notclose_state"))
 37		return -1;
 38
 39	if (!ASSERT_EQ(sk_stg.pid, my_pid, "pid"))
 40		return -1;
 41
 42	if (!ASSERT_STREQ(sk_stg.comm, skel->bss->task_comm, "task_comm"))
 43		return -1;
 44
 45	return 0;
 46}
 47
 48static void do_test(void)
 49{
 50	int listen_fd = -1, passive_fd = -1, active_fd = -1, value = 1, err;
 51	char abyte;
 52
 53	listen_fd = start_server(AF_INET6, SOCK_STREAM, LO_ADDR6, 0, 0);
 54	if (CHECK(listen_fd == -1, "start_server",
 55		  "listen_fd:%d errno:%d\n", listen_fd, errno))
 56		return;
 57
 58	active_fd = connect_to_fd(listen_fd, 0);
 59	if (CHECK(active_fd == -1, "connect_to_fd", "active_fd:%d errno:%d\n",
 60		  active_fd, errno))
 61		goto out;
 62
 63	err = bpf_map_update_elem(bpf_map__fd(skel->maps.del_sk_stg_map),
 64				  &active_fd, &value, 0);
 65	if (!ASSERT_OK(err, "map_update(del_sk_stg_map)"))
 66		goto out;
 67
 68	passive_fd = accept(listen_fd, NULL, 0);
 69	if (CHECK(passive_fd == -1, "accept", "passive_fd:%d errno:%d\n",
 70		  passive_fd, errno))
 71		goto out;
 72
 73	shutdown(active_fd, SHUT_WR);
 74	err = read(passive_fd, &abyte, 1);
 75	if (!ASSERT_OK(err, "read(passive_fd)"))
 76		goto out;
 77
 78	shutdown(passive_fd, SHUT_WR);
 79	err = read(active_fd, &abyte, 1);
 80	if (!ASSERT_OK(err, "read(active_fd)"))
 81		goto out;
 82
 83	err = bpf_map_lookup_elem(bpf_map__fd(skel->maps.del_sk_stg_map),
 84				  &active_fd, &value);
 85	if (!ASSERT_ERR(err, "map_lookup(del_sk_stg_map)"))
 86		goto out;
 87
 88	err = check_sk_stg(listen_fd, BPF_TCP_LISTEN);
 89	if (!ASSERT_OK(err, "listen_fd sk_stg"))
 90		goto out;
 91
 92	err = check_sk_stg(active_fd, BPF_TCP_FIN_WAIT2);
 93	if (!ASSERT_OK(err, "active_fd sk_stg"))
 94		goto out;
 95
 96	err = check_sk_stg(passive_fd, BPF_TCP_LAST_ACK);
 97	ASSERT_OK(err, "passive_fd sk_stg");
 98
 99out:
100	if (active_fd != -1)
101		close(active_fd);
102	if (passive_fd != -1)
103		close(passive_fd);
104	if (listen_fd != -1)
105		close(listen_fd);
106}
107
108void serial_test_sk_storage_tracing(void)
109{
110	struct test_sk_storage_trace_itself *skel_itself;
111	int err;
112
113	my_pid = getpid();
114
115	skel_itself = test_sk_storage_trace_itself__open_and_load();
116
117	if (!ASSERT_NULL(skel_itself, "test_sk_storage_trace_itself")) {
118		test_sk_storage_trace_itself__destroy(skel_itself);
119		return;
120	}
121
122	skel = test_sk_storage_tracing__open_and_load();
123	if (!ASSERT_OK_PTR(skel, "test_sk_storage_tracing"))
124		return;
125
126	err = test_sk_storage_tracing__attach(skel);
127	if (!ASSERT_OK(err, "test_sk_storage_tracing__attach")) {
128		test_sk_storage_tracing__destroy(skel);
129		return;
130	}
131
132	do_test();
133
134	test_sk_storage_tracing__destroy(skel);
135}