cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sk_storage_tracing.c (3241B)


      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}