brintos

brintos / linux-shallow public Read only

0
0
Text · 3.2 KiB · 547ae53 Raw
136 lines · c
1// SPDX-License-Identifier: GPL-2.02/* 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}136