Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
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     /* can not attach BPF_XDP_CPUMAP program to a device */
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     /* Try to attach BPF_XDP program with frags to cpumap when we have
0059      * already loaded a BPF_XDP program on the map
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     /* Try to attach BPF_XDP program to cpumap when we have
0102      * already loaded a BPF_XDP program with frags on the map
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 }