0001
0002
0003 #include <test_progs.h>
0004 #include <linux/nbd.h>
0005
0006
0007 void serial_test_raw_tp_writable_test_run(void)
0008 {
0009 __u32 duration = 0;
0010 char error[4096];
0011
0012 const struct bpf_insn trace_program[] = {
0013 BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0),
0014 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 0),
0015 BPF_MOV64_IMM(BPF_REG_0, 42),
0016 BPF_STX_MEM(BPF_W, BPF_REG_6, BPF_REG_0, 0),
0017 BPF_EXIT_INSN(),
0018 };
0019
0020 LIBBPF_OPTS(bpf_prog_load_opts, trace_opts,
0021 .log_level = 2,
0022 .log_buf = error,
0023 .log_size = sizeof(error),
0024 );
0025
0026 int bpf_fd = bpf_prog_load(BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE, NULL, "GPL v2",
0027 trace_program, sizeof(trace_program) / sizeof(struct bpf_insn),
0028 &trace_opts);
0029 if (CHECK(bpf_fd < 0, "bpf_raw_tracepoint_writable loaded",
0030 "failed: %d errno %d\n", bpf_fd, errno))
0031 return;
0032
0033 const struct bpf_insn skb_program[] = {
0034 BPF_MOV64_IMM(BPF_REG_0, 0),
0035 BPF_EXIT_INSN(),
0036 };
0037
0038 LIBBPF_OPTS(bpf_prog_load_opts, skb_opts,
0039 .log_buf = error,
0040 .log_size = sizeof(error),
0041 );
0042
0043 int filter_fd = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL v2",
0044 skb_program, sizeof(skb_program) / sizeof(struct bpf_insn),
0045 &skb_opts);
0046 if (CHECK(filter_fd < 0, "test_program_loaded", "failed: %d errno %d\n",
0047 filter_fd, errno))
0048 goto out_bpffd;
0049
0050 int tp_fd = bpf_raw_tracepoint_open("bpf_test_finish", bpf_fd);
0051 if (CHECK(tp_fd < 0, "bpf_raw_tracepoint_writable opened",
0052 "failed: %d errno %d\n", tp_fd, errno))
0053 goto out_filterfd;
0054
0055 char test_skb[128] = {
0056 0,
0057 };
0058
0059 LIBBPF_OPTS(bpf_test_run_opts, topts,
0060 .data_in = test_skb,
0061 .data_size_in = sizeof(test_skb),
0062 .repeat = 1,
0063 );
0064 int err = bpf_prog_test_run_opts(filter_fd, &topts);
0065 CHECK(err != 42, "test_run",
0066 "tracepoint did not modify return value\n");
0067 CHECK(topts.retval != 0, "test_run_ret",
0068 "socket_filter did not return 0\n");
0069
0070 close(tp_fd);
0071
0072 err = bpf_prog_test_run_opts(filter_fd, &topts);
0073 CHECK(err != 0, "test_run_notrace",
0074 "test_run failed with %d errno %d\n", err, errno);
0075 CHECK(topts.retval != 0, "test_run_ret_notrace",
0076 "socket_filter did not return 0\n");
0077
0078 out_filterfd:
0079 close(filter_fd);
0080 out_bpffd:
0081 close(bpf_fd);
0082 }