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