0001
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
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
0061
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
0115
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 }