51 lines · c
1// SPDX-License-Identifier: GPL-2.02#include <test_progs.h>3#include <network_helpers.h>4 5static void sigalrm_handler(int s) {}6static struct sigaction sigalrm_action = {7 .sa_handler = sigalrm_handler,8};9 10static void test_signal_pending_by_type(enum bpf_prog_type prog_type)11{12 struct bpf_insn prog[4096];13 struct itimerval timeo = {14 .it_value.tv_usec = 100000, /* 100ms */15 };16 int prog_fd;17 int err;18 int i;19 LIBBPF_OPTS(bpf_test_run_opts, topts,20 .data_in = &pkt_v4,21 .data_size_in = sizeof(pkt_v4),22 .repeat = 0xffffffff,23 );24 25 for (i = 0; i < ARRAY_SIZE(prog); i++)26 prog[i] = BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0);27 prog[ARRAY_SIZE(prog) - 1] = BPF_EXIT_INSN();28 29 prog_fd = bpf_test_load_program(prog_type, prog, ARRAY_SIZE(prog),30 "GPL", 0, NULL, 0);31 ASSERT_GE(prog_fd, 0, "test-run load");32 33 err = sigaction(SIGALRM, &sigalrm_action, NULL);34 ASSERT_OK(err, "test-run-signal-sigaction");35 36 err = setitimer(ITIMER_REAL, &timeo, NULL);37 ASSERT_OK(err, "test-run-signal-timer");38 39 err = bpf_prog_test_run_opts(prog_fd, &topts);40 ASSERT_LE(topts.duration, 500000000 /* 500ms */,41 "test-run-signal-duration");42 43 signal(SIGALRM, SIG_DFL);44}45 46void test_signal_pending(void)47{48 test_signal_pending_by_type(BPF_PROG_TYPE_SOCKET_FILTER);49 test_signal_pending_by_type(BPF_PROG_TYPE_FLOW_DISSECTOR);50}51