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