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 605500125SLorenzo Bianconi #include "test_xdp_with_cpumap_helpers.skel.h" 705500125SLorenzo Bianconi 805500125SLorenzo Bianconi #define IFINDEX_LO 1 905500125SLorenzo Bianconi 10*36246d5aSKumar Kartikeya Dwivedi void test_xdp_cpumap_attach(void) 1105500125SLorenzo Bianconi { 1205500125SLorenzo Bianconi struct test_xdp_with_cpumap_helpers *skel; 1305500125SLorenzo Bianconi struct bpf_prog_info info = {}; 14*36246d5aSKumar Kartikeya Dwivedi __u32 len = sizeof(info); 1505500125SLorenzo Bianconi struct bpf_cpumap_val val = { 1605500125SLorenzo Bianconi .qsize = 192, 1705500125SLorenzo Bianconi }; 1805500125SLorenzo Bianconi int err, prog_fd, map_fd; 19*36246d5aSKumar Kartikeya Dwivedi __u32 idx = 0; 2005500125SLorenzo Bianconi 2105500125SLorenzo Bianconi skel = test_xdp_with_cpumap_helpers__open_and_load(); 22*36246d5aSKumar Kartikeya Dwivedi if (!ASSERT_OK_PTR(skel, "test_xdp_with_cpumap_helpers__open_and_load")) 2305500125SLorenzo Bianconi return; 2405500125SLorenzo Bianconi 2505500125SLorenzo Bianconi prog_fd = bpf_program__fd(skel->progs.xdp_redir_prog); 2605500125SLorenzo Bianconi err = bpf_set_link_xdp_fd(IFINDEX_LO, prog_fd, XDP_FLAGS_SKB_MODE); 27*36246d5aSKumar Kartikeya Dwivedi if (!ASSERT_OK(err, "Generic attach of program with 8-byte CPUMAP")) 28*36246d5aSKumar Kartikeya Dwivedi goto out_close; 29*36246d5aSKumar Kartikeya Dwivedi 30*36246d5aSKumar Kartikeya Dwivedi err = bpf_set_link_xdp_fd(IFINDEX_LO, -1, XDP_FLAGS_SKB_MODE); 31*36246d5aSKumar Kartikeya Dwivedi ASSERT_OK(err, "XDP program detach"); 3205500125SLorenzo Bianconi 3305500125SLorenzo Bianconi prog_fd = bpf_program__fd(skel->progs.xdp_dummy_cm); 3405500125SLorenzo Bianconi map_fd = bpf_map__fd(skel->maps.cpu_map); 3505500125SLorenzo Bianconi err = bpf_obj_get_info_by_fd(prog_fd, &info, &len); 36*36246d5aSKumar Kartikeya Dwivedi if (!ASSERT_OK(err, "bpf_obj_get_info_by_fd")) 3705500125SLorenzo Bianconi goto out_close; 3805500125SLorenzo Bianconi 3905500125SLorenzo Bianconi val.bpf_prog.fd = prog_fd; 4005500125SLorenzo Bianconi err = bpf_map_update_elem(map_fd, &idx, &val, 0); 41*36246d5aSKumar Kartikeya Dwivedi ASSERT_OK(err, "Add program to cpumap entry"); 4205500125SLorenzo Bianconi 4305500125SLorenzo Bianconi err = bpf_map_lookup_elem(map_fd, &idx, &val); 44*36246d5aSKumar Kartikeya Dwivedi ASSERT_OK(err, "Read cpumap entry"); 45*36246d5aSKumar Kartikeya Dwivedi ASSERT_EQ(info.id, val.bpf_prog.id, "Match program id to cpumap entry prog_id"); 4605500125SLorenzo Bianconi 4705500125SLorenzo Bianconi /* can not attach BPF_XDP_CPUMAP program to a device */ 4805500125SLorenzo Bianconi err = bpf_set_link_xdp_fd(IFINDEX_LO, prog_fd, XDP_FLAGS_SKB_MODE); 49*36246d5aSKumar Kartikeya Dwivedi if (!ASSERT_NEQ(err, 0, "Attach of BPF_XDP_CPUMAP program")) 50*36246d5aSKumar Kartikeya Dwivedi bpf_set_link_xdp_fd(IFINDEX_LO, -1, XDP_FLAGS_SKB_MODE); 5105500125SLorenzo Bianconi 5205500125SLorenzo Bianconi val.qsize = 192; 5305500125SLorenzo Bianconi val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_prog); 5405500125SLorenzo Bianconi err = bpf_map_update_elem(map_fd, &idx, &val, 0); 55*36246d5aSKumar Kartikeya Dwivedi ASSERT_NEQ(err, 0, "Add non-BPF_XDP_CPUMAP program to cpumap entry"); 5605500125SLorenzo Bianconi 5705500125SLorenzo Bianconi out_close: 5805500125SLorenzo Bianconi test_xdp_with_cpumap_helpers__destroy(skel); 5905500125SLorenzo Bianconi } 60