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