hc
2024-10-09 05e59e5fb0064c97a1c10921ecd549f2d4a58565
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// SPDX-License-Identifier: GPL-2.0
#include <test_progs.h>
#include <network_helpers.h>
 
static void sigalrm_handler(int s) {}
static struct sigaction sigalrm_action = {
   .sa_handler = sigalrm_handler,
};
 
static void test_signal_pending_by_type(enum bpf_prog_type prog_type)
{
   struct bpf_insn prog[4096];
   struct itimerval timeo = {
       .it_value.tv_usec = 100000, /* 100ms */
   };
   __u32 duration = 0, retval;
   int prog_fd;
   int err;
   int i;
 
   for (i = 0; i < ARRAY_SIZE(prog); i++)
       prog[i] = BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0);
   prog[ARRAY_SIZE(prog) - 1] = BPF_EXIT_INSN();
 
   prog_fd = bpf_load_program(prog_type, prog, ARRAY_SIZE(prog),
                  "GPL", 0, NULL, 0);
   CHECK(prog_fd < 0, "test-run", "errno %d\n", errno);
 
   err = sigaction(SIGALRM, &sigalrm_action, NULL);
   CHECK(err, "test-run-signal-sigaction", "errno %d\n", errno);
 
   err = setitimer(ITIMER_REAL, &timeo, NULL);
   CHECK(err, "test-run-signal-timer", "errno %d\n", errno);
 
   err = bpf_prog_test_run(prog_fd, 0xffffffff, &pkt_v4, sizeof(pkt_v4),
               NULL, NULL, &retval, &duration);
   CHECK(duration > 500000000, /* 500ms */
         "test-run-signal-duration",
         "duration %dns > 500ms\n",
         duration);
 
   signal(SIGALRM, SIG_DFL);
}
 
void test_signal_pending(enum bpf_prog_type prog_type)
{
   test_signal_pending_by_type(BPF_PROG_TYPE_SOCKET_FILTER);
   test_signal_pending_by_type(BPF_PROG_TYPE_FLOW_DISSECTOR);
}