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