0001
0002 #include <uapi/linux/bpf.h>
0003 #include <linux/if_link.h>
0004 #include <test_progs.h>
0005
0006 #include "test_xdp_with_cpumap_frags_helpers.skel.h"
0007 #include "test_xdp_with_cpumap_helpers.skel.h"
0008
0009 #define IFINDEX_LO 1
0010
0011 static void test_xdp_with_cpumap_helpers(void)
0012 {
0013 struct test_xdp_with_cpumap_helpers *skel;
0014 struct bpf_prog_info info = {};
0015 __u32 len = sizeof(info);
0016 struct bpf_cpumap_val val = {
0017 .qsize = 192,
0018 };
0019 int err, prog_fd, map_fd;
0020 __u32 idx = 0;
0021
0022 skel = test_xdp_with_cpumap_helpers__open_and_load();
0023 if (!ASSERT_OK_PTR(skel, "test_xdp_with_cpumap_helpers__open_and_load"))
0024 return;
0025
0026 prog_fd = bpf_program__fd(skel->progs.xdp_redir_prog);
0027 err = bpf_xdp_attach(IFINDEX_LO, prog_fd, XDP_FLAGS_SKB_MODE, NULL);
0028 if (!ASSERT_OK(err, "Generic attach of program with 8-byte CPUMAP"))
0029 goto out_close;
0030
0031 err = bpf_xdp_detach(IFINDEX_LO, XDP_FLAGS_SKB_MODE, NULL);
0032 ASSERT_OK(err, "XDP program detach");
0033
0034 prog_fd = bpf_program__fd(skel->progs.xdp_dummy_cm);
0035 map_fd = bpf_map__fd(skel->maps.cpu_map);
0036 err = bpf_obj_get_info_by_fd(prog_fd, &info, &len);
0037 if (!ASSERT_OK(err, "bpf_obj_get_info_by_fd"))
0038 goto out_close;
0039
0040 val.bpf_prog.fd = prog_fd;
0041 err = bpf_map_update_elem(map_fd, &idx, &val, 0);
0042 ASSERT_OK(err, "Add program to cpumap entry");
0043
0044 err = bpf_map_lookup_elem(map_fd, &idx, &val);
0045 ASSERT_OK(err, "Read cpumap entry");
0046 ASSERT_EQ(info.id, val.bpf_prog.id, "Match program id to cpumap entry prog_id");
0047
0048
0049 err = bpf_xdp_attach(IFINDEX_LO, prog_fd, XDP_FLAGS_SKB_MODE, NULL);
0050 if (!ASSERT_NEQ(err, 0, "Attach of BPF_XDP_CPUMAP program"))
0051 bpf_xdp_detach(IFINDEX_LO, XDP_FLAGS_SKB_MODE, NULL);
0052
0053 val.qsize = 192;
0054 val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_prog);
0055 err = bpf_map_update_elem(map_fd, &idx, &val, 0);
0056 ASSERT_NEQ(err, 0, "Add non-BPF_XDP_CPUMAP program to cpumap entry");
0057
0058
0059
0060
0061 idx = 1;
0062 val.qsize = 192;
0063 val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_cm_frags);
0064 err = bpf_map_update_elem(map_fd, &idx, &val, 0);
0065 ASSERT_NEQ(err, 0, "Add BPF_XDP program with frags to cpumap entry");
0066
0067 out_close:
0068 test_xdp_with_cpumap_helpers__destroy(skel);
0069 }
0070
0071 static void test_xdp_with_cpumap_frags_helpers(void)
0072 {
0073 struct test_xdp_with_cpumap_frags_helpers *skel;
0074 struct bpf_prog_info info = {};
0075 __u32 len = sizeof(info);
0076 struct bpf_cpumap_val val = {
0077 .qsize = 192,
0078 };
0079 int err, frags_prog_fd, map_fd;
0080 __u32 idx = 0;
0081
0082 skel = test_xdp_with_cpumap_frags_helpers__open_and_load();
0083 if (!ASSERT_OK_PTR(skel, "test_xdp_with_cpumap_helpers__open_and_load"))
0084 return;
0085
0086 frags_prog_fd = bpf_program__fd(skel->progs.xdp_dummy_cm_frags);
0087 map_fd = bpf_map__fd(skel->maps.cpu_map);
0088 err = bpf_obj_get_info_by_fd(frags_prog_fd, &info, &len);
0089 if (!ASSERT_OK(err, "bpf_obj_get_info_by_fd"))
0090 goto out_close;
0091
0092 val.bpf_prog.fd = frags_prog_fd;
0093 err = bpf_map_update_elem(map_fd, &idx, &val, 0);
0094 ASSERT_OK(err, "Add program to cpumap entry");
0095
0096 err = bpf_map_lookup_elem(map_fd, &idx, &val);
0097 ASSERT_OK(err, "Read cpumap entry");
0098 ASSERT_EQ(info.id, val.bpf_prog.id,
0099 "Match program id to cpumap entry prog_id");
0100
0101
0102
0103
0104 idx = 1;
0105 val.qsize = 192;
0106 val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_cm);
0107 err = bpf_map_update_elem(map_fd, &idx, &val, 0);
0108 ASSERT_NEQ(err, 0, "Add BPF_XDP program to cpumap entry");
0109
0110 out_close:
0111 test_xdp_with_cpumap_frags_helpers__destroy(skel);
0112 }
0113
0114 void serial_test_xdp_cpumap_attach(void)
0115 {
0116 if (test__start_subtest("CPUMAP with programs in entries"))
0117 test_xdp_with_cpumap_helpers();
0118
0119 if (test__start_subtest("CPUMAP with frags programs in entries"))
0120 test_xdp_with_cpumap_frags_helpers();
0121 }