1886225bbSStanislav Fomichev // SPDX-License-Identifier: GPL-2.0 2886225bbSStanislav Fomichev #include <test_progs.h> 3488a23b8SStanislav Fomichev #include <network_helpers.h> 4886225bbSStanislav Fomichev 5886225bbSStanislav Fomichev static void sigalrm_handler(int s) {} 6886225bbSStanislav Fomichev static struct sigaction sigalrm_action = { 7886225bbSStanislav Fomichev .sa_handler = sigalrm_handler, 8886225bbSStanislav Fomichev }; 9886225bbSStanislav Fomichev 10886225bbSStanislav Fomichev static void test_signal_pending_by_type(enum bpf_prog_type prog_type) 11886225bbSStanislav Fomichev { 12886225bbSStanislav Fomichev struct bpf_insn prog[4096]; 13886225bbSStanislav Fomichev struct itimerval timeo = { 14886225bbSStanislav Fomichev .it_value.tv_usec = 100000, /* 100ms */ 15886225bbSStanislav Fomichev }; 1669b09175SStanislav Fomichev __u32 duration = 0, retval; 17886225bbSStanislav Fomichev int prog_fd; 18886225bbSStanislav Fomichev int err; 19886225bbSStanislav Fomichev int i; 20886225bbSStanislav Fomichev 21886225bbSStanislav Fomichev for (i = 0; i < ARRAY_SIZE(prog); i++) 22886225bbSStanislav Fomichev prog[i] = BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0); 23886225bbSStanislav Fomichev prog[ARRAY_SIZE(prog) - 1] = BPF_EXIT_INSN(); 24886225bbSStanislav Fomichev 25886225bbSStanislav Fomichev prog_fd = bpf_load_program(prog_type, prog, ARRAY_SIZE(prog), 26886225bbSStanislav Fomichev "GPL", 0, NULL, 0); 27886225bbSStanislav Fomichev CHECK(prog_fd < 0, "test-run", "errno %d\n", errno); 28886225bbSStanislav Fomichev 29886225bbSStanislav Fomichev err = sigaction(SIGALRM, &sigalrm_action, NULL); 30886225bbSStanislav Fomichev CHECK(err, "test-run-signal-sigaction", "errno %d\n", errno); 31886225bbSStanislav Fomichev 32886225bbSStanislav Fomichev err = setitimer(ITIMER_REAL, &timeo, NULL); 33886225bbSStanislav Fomichev CHECK(err, "test-run-signal-timer", "errno %d\n", errno); 34886225bbSStanislav Fomichev 35886225bbSStanislav Fomichev err = bpf_prog_test_run(prog_fd, 0xffffffff, &pkt_v4, sizeof(pkt_v4), 36886225bbSStanislav Fomichev NULL, NULL, &retval, &duration); 37886225bbSStanislav Fomichev CHECK(duration > 500000000, /* 500ms */ 38886225bbSStanislav Fomichev "test-run-signal-duration", 39886225bbSStanislav Fomichev "duration %dns > 500ms\n", 40886225bbSStanislav Fomichev duration); 41886225bbSStanislav Fomichev 42886225bbSStanislav Fomichev signal(SIGALRM, SIG_DFL); 43886225bbSStanislav Fomichev } 44886225bbSStanislav Fomichev 45886225bbSStanislav Fomichev void test_signal_pending(enum bpf_prog_type prog_type) 46886225bbSStanislav Fomichev { 47886225bbSStanislav Fomichev test_signal_pending_by_type(BPF_PROG_TYPE_SOCKET_FILTER); 48886225bbSStanislav Fomichev test_signal_pending_by_type(BPF_PROG_TYPE_FLOW_DISSECTOR); 49886225bbSStanislav Fomichev } 50