105500125SLorenzo Bianconi // SPDX-License-Identifier: GPL-2.0
205500125SLorenzo Bianconi #include <uapi/linux/bpf.h>
305500125SLorenzo Bianconi #include <linux/if_link.h>
405500125SLorenzo Bianconi #include <test_progs.h>
505500125SLorenzo Bianconi
60c5e118cSLorenzo Bianconi #include "test_xdp_with_cpumap_frags_helpers.skel.h"
705500125SLorenzo Bianconi #include "test_xdp_with_cpumap_helpers.skel.h"
805500125SLorenzo Bianconi
905500125SLorenzo Bianconi #define IFINDEX_LO 1
1005500125SLorenzo Bianconi
test_xdp_with_cpumap_helpers(void)115912fcb4SHou Tao static void test_xdp_with_cpumap_helpers(void)
1205500125SLorenzo Bianconi {
1305500125SLorenzo Bianconi struct test_xdp_with_cpumap_helpers *skel;
1405500125SLorenzo Bianconi struct bpf_prog_info info = {};
1536246d5aSKumar Kartikeya Dwivedi __u32 len = sizeof(info);
1605500125SLorenzo Bianconi struct bpf_cpumap_val val = {
1705500125SLorenzo Bianconi .qsize = 192,
1805500125SLorenzo Bianconi };
1905500125SLorenzo Bianconi int err, prog_fd, map_fd;
2036246d5aSKumar Kartikeya Dwivedi __u32 idx = 0;
2105500125SLorenzo Bianconi
2205500125SLorenzo Bianconi skel = test_xdp_with_cpumap_helpers__open_and_load();
2336246d5aSKumar Kartikeya Dwivedi if (!ASSERT_OK_PTR(skel, "test_xdp_with_cpumap_helpers__open_and_load"))
2405500125SLorenzo Bianconi return;
2505500125SLorenzo Bianconi
2605500125SLorenzo Bianconi prog_fd = bpf_program__fd(skel->progs.xdp_redir_prog);
27e4e284a8SAndrii Nakryiko err = bpf_xdp_attach(IFINDEX_LO, prog_fd, XDP_FLAGS_SKB_MODE, NULL);
2836246d5aSKumar Kartikeya Dwivedi if (!ASSERT_OK(err, "Generic attach of program with 8-byte CPUMAP"))
2936246d5aSKumar Kartikeya Dwivedi goto out_close;
3036246d5aSKumar Kartikeya Dwivedi
31e4e284a8SAndrii Nakryiko err = bpf_xdp_detach(IFINDEX_LO, XDP_FLAGS_SKB_MODE, NULL);
3236246d5aSKumar Kartikeya Dwivedi ASSERT_OK(err, "XDP program detach");
3305500125SLorenzo Bianconi
3405500125SLorenzo Bianconi prog_fd = bpf_program__fd(skel->progs.xdp_dummy_cm);
3505500125SLorenzo Bianconi map_fd = bpf_map__fd(skel->maps.cpu_map);
36*c5a237a4SIlya Leoshkevich err = bpf_prog_get_info_by_fd(prog_fd, &info, &len);
37*c5a237a4SIlya Leoshkevich if (!ASSERT_OK(err, "bpf_prog_get_info_by_fd"))
3805500125SLorenzo Bianconi goto out_close;
3905500125SLorenzo Bianconi
4005500125SLorenzo Bianconi val.bpf_prog.fd = prog_fd;
4105500125SLorenzo Bianconi err = bpf_map_update_elem(map_fd, &idx, &val, 0);
4236246d5aSKumar Kartikeya Dwivedi ASSERT_OK(err, "Add program to cpumap entry");
4305500125SLorenzo Bianconi
4405500125SLorenzo Bianconi err = bpf_map_lookup_elem(map_fd, &idx, &val);
4536246d5aSKumar Kartikeya Dwivedi ASSERT_OK(err, "Read cpumap entry");
4636246d5aSKumar Kartikeya Dwivedi ASSERT_EQ(info.id, val.bpf_prog.id, "Match program id to cpumap entry prog_id");
4705500125SLorenzo Bianconi
4805500125SLorenzo Bianconi /* can not attach BPF_XDP_CPUMAP program to a device */
49e4e284a8SAndrii Nakryiko err = bpf_xdp_attach(IFINDEX_LO, prog_fd, XDP_FLAGS_SKB_MODE, NULL);
5036246d5aSKumar Kartikeya Dwivedi if (!ASSERT_NEQ(err, 0, "Attach of BPF_XDP_CPUMAP program"))
51e4e284a8SAndrii Nakryiko bpf_xdp_detach(IFINDEX_LO, XDP_FLAGS_SKB_MODE, NULL);
5205500125SLorenzo Bianconi
5305500125SLorenzo Bianconi val.qsize = 192;
5405500125SLorenzo Bianconi val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_prog);
5505500125SLorenzo Bianconi err = bpf_map_update_elem(map_fd, &idx, &val, 0);
5636246d5aSKumar Kartikeya Dwivedi ASSERT_NEQ(err, 0, "Add non-BPF_XDP_CPUMAP program to cpumap entry");
5705500125SLorenzo Bianconi
580c5e118cSLorenzo Bianconi /* Try to attach BPF_XDP program with frags to cpumap when we have
590c5e118cSLorenzo Bianconi * already loaded a BPF_XDP program on the map
600c5e118cSLorenzo Bianconi */
610c5e118cSLorenzo Bianconi idx = 1;
620c5e118cSLorenzo Bianconi val.qsize = 192;
630c5e118cSLorenzo Bianconi val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_cm_frags);
640c5e118cSLorenzo Bianconi err = bpf_map_update_elem(map_fd, &idx, &val, 0);
650c5e118cSLorenzo Bianconi ASSERT_NEQ(err, 0, "Add BPF_XDP program with frags to cpumap entry");
660c5e118cSLorenzo Bianconi
6705500125SLorenzo Bianconi out_close:
6805500125SLorenzo Bianconi test_xdp_with_cpumap_helpers__destroy(skel);
6905500125SLorenzo Bianconi }
700c5e118cSLorenzo Bianconi
test_xdp_with_cpumap_frags_helpers(void)715912fcb4SHou Tao static void test_xdp_with_cpumap_frags_helpers(void)
720c5e118cSLorenzo Bianconi {
730c5e118cSLorenzo Bianconi struct test_xdp_with_cpumap_frags_helpers *skel;
740c5e118cSLorenzo Bianconi struct bpf_prog_info info = {};
750c5e118cSLorenzo Bianconi __u32 len = sizeof(info);
760c5e118cSLorenzo Bianconi struct bpf_cpumap_val val = {
770c5e118cSLorenzo Bianconi .qsize = 192,
780c5e118cSLorenzo Bianconi };
790c5e118cSLorenzo Bianconi int err, frags_prog_fd, map_fd;
800c5e118cSLorenzo Bianconi __u32 idx = 0;
810c5e118cSLorenzo Bianconi
820c5e118cSLorenzo Bianconi skel = test_xdp_with_cpumap_frags_helpers__open_and_load();
830c5e118cSLorenzo Bianconi if (!ASSERT_OK_PTR(skel, "test_xdp_with_cpumap_helpers__open_and_load"))
840c5e118cSLorenzo Bianconi return;
850c5e118cSLorenzo Bianconi
860c5e118cSLorenzo Bianconi frags_prog_fd = bpf_program__fd(skel->progs.xdp_dummy_cm_frags);
870c5e118cSLorenzo Bianconi map_fd = bpf_map__fd(skel->maps.cpu_map);
88*c5a237a4SIlya Leoshkevich err = bpf_prog_get_info_by_fd(frags_prog_fd, &info, &len);
89*c5a237a4SIlya Leoshkevich if (!ASSERT_OK(err, "bpf_prog_get_info_by_fd"))
900c5e118cSLorenzo Bianconi goto out_close;
910c5e118cSLorenzo Bianconi
920c5e118cSLorenzo Bianconi val.bpf_prog.fd = frags_prog_fd;
930c5e118cSLorenzo Bianconi err = bpf_map_update_elem(map_fd, &idx, &val, 0);
940c5e118cSLorenzo Bianconi ASSERT_OK(err, "Add program to cpumap entry");
950c5e118cSLorenzo Bianconi
960c5e118cSLorenzo Bianconi err = bpf_map_lookup_elem(map_fd, &idx, &val);
970c5e118cSLorenzo Bianconi ASSERT_OK(err, "Read cpumap entry");
980c5e118cSLorenzo Bianconi ASSERT_EQ(info.id, val.bpf_prog.id,
990c5e118cSLorenzo Bianconi "Match program id to cpumap entry prog_id");
1000c5e118cSLorenzo Bianconi
1010c5e118cSLorenzo Bianconi /* Try to attach BPF_XDP program to cpumap when we have
1020c5e118cSLorenzo Bianconi * already loaded a BPF_XDP program with frags on the map
1030c5e118cSLorenzo Bianconi */
1040c5e118cSLorenzo Bianconi idx = 1;
1050c5e118cSLorenzo Bianconi val.qsize = 192;
1060c5e118cSLorenzo Bianconi val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_cm);
1070c5e118cSLorenzo Bianconi err = bpf_map_update_elem(map_fd, &idx, &val, 0);
1080c5e118cSLorenzo Bianconi ASSERT_NEQ(err, 0, "Add BPF_XDP program to cpumap entry");
1090c5e118cSLorenzo Bianconi
1100c5e118cSLorenzo Bianconi out_close:
1110c5e118cSLorenzo Bianconi test_xdp_with_cpumap_frags_helpers__destroy(skel);
1120c5e118cSLorenzo Bianconi }
1130c5e118cSLorenzo Bianconi
serial_test_xdp_cpumap_attach(void)1140c5e118cSLorenzo Bianconi void serial_test_xdp_cpumap_attach(void)
1150c5e118cSLorenzo Bianconi {
1160c5e118cSLorenzo Bianconi if (test__start_subtest("CPUMAP with programs in entries"))
1170c5e118cSLorenzo Bianconi test_xdp_with_cpumap_helpers();
1180c5e118cSLorenzo Bianconi
1190c5e118cSLorenzo Bianconi if (test__start_subtest("CPUMAP with frags programs in entries"))
1200c5e118cSLorenzo Bianconi test_xdp_with_cpumap_frags_helpers();
1210c5e118cSLorenzo Bianconi }
122