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 110c5e118cSLorenzo Bianconi 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); 27*e4e284a8SAndrii 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 31*e4e284a8SAndrii 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); 3605500125SLorenzo Bianconi err = bpf_obj_get_info_by_fd(prog_fd, &info, &len); 3736246d5aSKumar Kartikeya Dwivedi if (!ASSERT_OK(err, "bpf_obj_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 */ 49*e4e284a8SAndrii 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")) 51*e4e284a8SAndrii 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 710c5e118cSLorenzo Bianconi 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); 880c5e118cSLorenzo Bianconi err = bpf_obj_get_info_by_fd(frags_prog_fd, &info, &len); 890c5e118cSLorenzo Bianconi if (!ASSERT_OK(err, "bpf_obj_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 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