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_devmap_helpers.skel.h"
0007 #include "test_xdp_with_devmap_frags_helpers.skel.h"
0008 #include "test_xdp_with_devmap_helpers.skel.h"
0009 
0010 #define IFINDEX_LO 1
0011 
0012 static void test_xdp_with_devmap_helpers(void)
0013 {
0014     struct test_xdp_with_devmap_helpers *skel;
0015     struct bpf_prog_info info = {};
0016     struct bpf_devmap_val val = {
0017         .ifindex = IFINDEX_LO,
0018     };
0019     __u32 len = sizeof(info);
0020     int err, dm_fd, map_fd;
0021     __u32 idx = 0;
0022 
0023 
0024     skel = test_xdp_with_devmap_helpers__open_and_load();
0025     if (!ASSERT_OK_PTR(skel, "test_xdp_with_devmap_helpers__open_and_load"))
0026         return;
0027 
0028     dm_fd = bpf_program__fd(skel->progs.xdp_redir_prog);
0029     err = bpf_xdp_attach(IFINDEX_LO, dm_fd, XDP_FLAGS_SKB_MODE, NULL);
0030     if (!ASSERT_OK(err, "Generic attach of program with 8-byte devmap"))
0031         goto out_close;
0032 
0033     err = bpf_xdp_detach(IFINDEX_LO, XDP_FLAGS_SKB_MODE, NULL);
0034     ASSERT_OK(err, "XDP program detach");
0035 
0036     dm_fd = bpf_program__fd(skel->progs.xdp_dummy_dm);
0037     map_fd = bpf_map__fd(skel->maps.dm_ports);
0038     err = bpf_obj_get_info_by_fd(dm_fd, &info, &len);
0039     if (!ASSERT_OK(err, "bpf_obj_get_info_by_fd"))
0040         goto out_close;
0041 
0042     val.bpf_prog.fd = dm_fd;
0043     err = bpf_map_update_elem(map_fd, &idx, &val, 0);
0044     ASSERT_OK(err, "Add program to devmap entry");
0045 
0046     err = bpf_map_lookup_elem(map_fd, &idx, &val);
0047     ASSERT_OK(err, "Read devmap entry");
0048     ASSERT_EQ(info.id, val.bpf_prog.id, "Match program id to devmap entry prog_id");
0049 
0050     /* can not attach BPF_XDP_DEVMAP program to a device */
0051     err = bpf_xdp_attach(IFINDEX_LO, dm_fd, XDP_FLAGS_SKB_MODE, NULL);
0052     if (!ASSERT_NEQ(err, 0, "Attach of BPF_XDP_DEVMAP program"))
0053         bpf_xdp_detach(IFINDEX_LO, XDP_FLAGS_SKB_MODE, NULL);
0054 
0055     val.ifindex = 1;
0056     val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_prog);
0057     err = bpf_map_update_elem(map_fd, &idx, &val, 0);
0058     ASSERT_NEQ(err, 0, "Add non-BPF_XDP_DEVMAP program to devmap entry");
0059 
0060     /* Try to attach BPF_XDP program with frags to devmap when we have
0061      * already loaded a BPF_XDP program on the map
0062      */
0063     idx = 1;
0064     val.ifindex = 1;
0065     val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_dm_frags);
0066     err = bpf_map_update_elem(map_fd, &idx, &val, 0);
0067     ASSERT_NEQ(err, 0, "Add BPF_XDP program with frags to devmap entry");
0068 
0069 out_close:
0070     test_xdp_with_devmap_helpers__destroy(skel);
0071 }
0072 
0073 static void test_neg_xdp_devmap_helpers(void)
0074 {
0075     struct test_xdp_devmap_helpers *skel;
0076 
0077     skel = test_xdp_devmap_helpers__open_and_load();
0078     if (!ASSERT_EQ(skel, NULL,
0079             "Load of XDP program accessing egress ifindex without attach type")) {
0080         test_xdp_devmap_helpers__destroy(skel);
0081     }
0082 }
0083 
0084 static void test_xdp_with_devmap_frags_helpers(void)
0085 {
0086     struct test_xdp_with_devmap_frags_helpers *skel;
0087     struct bpf_prog_info info = {};
0088     struct bpf_devmap_val val = {
0089         .ifindex = IFINDEX_LO,
0090     };
0091     __u32 len = sizeof(info);
0092     int err, dm_fd_frags, map_fd;
0093     __u32 idx = 0;
0094 
0095     skel = test_xdp_with_devmap_frags_helpers__open_and_load();
0096     if (!ASSERT_OK_PTR(skel, "test_xdp_with_devmap_helpers__open_and_load"))
0097         return;
0098 
0099     dm_fd_frags = bpf_program__fd(skel->progs.xdp_dummy_dm_frags);
0100     map_fd = bpf_map__fd(skel->maps.dm_ports);
0101     err = bpf_obj_get_info_by_fd(dm_fd_frags, &info, &len);
0102     if (!ASSERT_OK(err, "bpf_obj_get_info_by_fd"))
0103         goto out_close;
0104 
0105     val.bpf_prog.fd = dm_fd_frags;
0106     err = bpf_map_update_elem(map_fd, &idx, &val, 0);
0107     ASSERT_OK(err, "Add frags program to devmap entry");
0108 
0109     err = bpf_map_lookup_elem(map_fd, &idx, &val);
0110     ASSERT_OK(err, "Read devmap entry");
0111     ASSERT_EQ(info.id, val.bpf_prog.id,
0112           "Match program id to devmap entry prog_id");
0113 
0114     /* Try to attach BPF_XDP program to devmap when we have
0115      * already loaded a BPF_XDP program with frags on the map
0116      */
0117     idx = 1;
0118     val.ifindex = 1;
0119     val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_dm);
0120     err = bpf_map_update_elem(map_fd, &idx, &val, 0);
0121     ASSERT_NEQ(err, 0, "Add BPF_XDP program to devmap entry");
0122 
0123 out_close:
0124     test_xdp_with_devmap_frags_helpers__destroy(skel);
0125 }
0126 
0127 void serial_test_xdp_devmap_attach(void)
0128 {
0129     if (test__start_subtest("DEVMAP with programs in entries"))
0130         test_xdp_with_devmap_helpers();
0131 
0132     if (test__start_subtest("DEVMAP with frags programs in entries"))
0133         test_xdp_with_devmap_frags_helpers();
0134 
0135     if (test__start_subtest("Verifier check of DEVMAP programs"))
0136         test_neg_xdp_devmap_helpers();
0137 }