Linux Audio

Check our new training course

Linux kernel drivers training

Mar 31-Apr 9, 2025, special US time zones
Register
Loading...
Note: File does not exist in v5.4.
 1// SPDX-License-Identifier: GPL-2.0
 2#include <uapi/linux/bpf.h>
 3#include <linux/if_link.h>
 4#include <test_progs.h>
 5
 6#include "test_xdp_devmap_helpers.skel.h"
 7#include "test_xdp_with_devmap_helpers.skel.h"
 8
 9#define IFINDEX_LO 1
10
11void test_xdp_with_devmap_helpers(void)
12{
13	struct test_xdp_with_devmap_helpers *skel;
14	struct bpf_prog_info info = {};
15	struct bpf_devmap_val val = {
16		.ifindex = IFINDEX_LO,
17	};
18	__u32 len = sizeof(info);
19	__u32 duration = 0, idx = 0;
20	int err, dm_fd, map_fd;
21
22
23	skel = test_xdp_with_devmap_helpers__open_and_load();
24	if (CHECK_FAIL(!skel)) {
25		perror("test_xdp_with_devmap_helpers__open_and_load");
26		return;
27	}
28
29	/* can not attach program with DEVMAPs that allow programs
30	 * as xdp generic
31	 */
32	dm_fd = bpf_program__fd(skel->progs.xdp_redir_prog);
33	err = bpf_set_link_xdp_fd(IFINDEX_LO, dm_fd, XDP_FLAGS_SKB_MODE);
34	CHECK(err == 0, "Generic attach of program with 8-byte devmap",
35	      "should have failed\n");
36
37	dm_fd = bpf_program__fd(skel->progs.xdp_dummy_dm);
38	map_fd = bpf_map__fd(skel->maps.dm_ports);
39	err = bpf_obj_get_info_by_fd(dm_fd, &info, &len);
40	if (CHECK_FAIL(err))
41		goto out_close;
42
43	val.bpf_prog.fd = dm_fd;
44	err = bpf_map_update_elem(map_fd, &idx, &val, 0);
45	CHECK(err, "Add program to devmap entry",
46	      "err %d errno %d\n", err, errno);
47
48	err = bpf_map_lookup_elem(map_fd, &idx, &val);
49	CHECK(err, "Read devmap entry", "err %d errno %d\n", err, errno);
50	CHECK(info.id != val.bpf_prog.id, "Expected program id in devmap entry",
51	      "expected %u read %u\n", info.id, val.bpf_prog.id);
52
53	/* can not attach BPF_XDP_DEVMAP program to a device */
54	err = bpf_set_link_xdp_fd(IFINDEX_LO, dm_fd, XDP_FLAGS_SKB_MODE);
55	CHECK(err == 0, "Attach of BPF_XDP_DEVMAP program",
56	      "should have failed\n");
57
58	val.ifindex = 1;
59	val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_prog);
60	err = bpf_map_update_elem(map_fd, &idx, &val, 0);
61	CHECK(err == 0, "Add non-BPF_XDP_DEVMAP program to devmap entry",
62	      "should have failed\n");
63
64out_close:
65	test_xdp_with_devmap_helpers__destroy(skel);
66}
67
68void test_neg_xdp_devmap_helpers(void)
69{
70	struct test_xdp_devmap_helpers *skel;
71	__u32 duration = 0;
72
73	skel = test_xdp_devmap_helpers__open_and_load();
74	if (CHECK(skel,
75		  "Load of XDP program accessing egress ifindex without attach type",
76		  "should have failed\n")) {
77		test_xdp_devmap_helpers__destroy(skel);
78	}
79}
80
81
82void test_xdp_devmap_attach(void)
83{
84	if (test__start_subtest("DEVMAP with programs in entries"))
85		test_xdp_with_devmap_helpers();
86
87	if (test__start_subtest("Verifier check of DEVMAP programs"))
88		test_neg_xdp_devmap_helpers();
89}