Skip to content

Commit 3a495f6

Browse files
LorenzoBianconiKernel Patches Daemon
authored and
Kernel Patches Daemon
committed
selftests/bpf: xdp_metadata: check XDP_REDIRCT support for dev-bound progs
Improve xdp_metadata bpf selftest in order to check it is possible for a XDP dev-bound program to perform XDP_REDIRECT into a DEVMAP but it is still not allowed to attach a XDP dev-bound program to a DEVMAP entry. Acked-by: Stanislav Fomichev <[email protected]> Signed-off-by: Lorenzo Bianconi <[email protected]>
1 parent 8aad74c commit 3a495f6

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

tools/testing/selftests/bpf/prog_tests/xdp_metadata.c

+21-1
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,10 @@ void test_xdp_metadata(void)
351351
struct xdp_metadata2 *bpf_obj2 = NULL;
352352
struct xdp_metadata *bpf_obj = NULL;
353353
struct bpf_program *new_prog, *prog;
354+
struct bpf_devmap_val devmap_e = {};
355+
struct bpf_map *prog_arr, *devmap;
354356
struct nstoken *tok = NULL;
355357
__u32 queue_id = QUEUE_ID;
356-
struct bpf_map *prog_arr;
357358
struct xsk tx_xsk = {};
358359
struct xsk rx_xsk = {};
359360
__u32 val, key = 0;
@@ -409,6 +410,13 @@ void test_xdp_metadata(void)
409410
bpf_program__set_ifindex(prog, rx_ifindex);
410411
bpf_program__set_flags(prog, BPF_F_XDP_DEV_BOUND_ONLY);
411412

413+
/* Make sure we can load a dev-bound program that performs
414+
* XDP_REDIRECT into a devmap.
415+
*/
416+
new_prog = bpf_object__find_program_by_name(bpf_obj->obj, "redirect");
417+
bpf_program__set_ifindex(new_prog, rx_ifindex);
418+
bpf_program__set_flags(new_prog, BPF_F_XDP_DEV_BOUND_ONLY);
419+
412420
if (!ASSERT_OK(xdp_metadata__load(bpf_obj), "load skeleton"))
413421
goto out;
414422

@@ -423,6 +431,18 @@ void test_xdp_metadata(void)
423431
"update prog_arr"))
424432
goto out;
425433

434+
/* Make sure we can't add dev-bound programs to devmaps. */
435+
devmap = bpf_object__find_map_by_name(bpf_obj->obj, "dev_map");
436+
if (!ASSERT_OK_PTR(devmap, "no dev_map found"))
437+
goto out;
438+
439+
devmap_e.bpf_prog.fd = val;
440+
if (!ASSERT_ERR(bpf_map__update_elem(devmap, &key, sizeof(key),
441+
&devmap_e, sizeof(devmap_e),
442+
BPF_ANY),
443+
"update dev_map"))
444+
goto out;
445+
426446
/* Attach BPF program to RX interface. */
427447

428448
ret = bpf_xdp_attach(rx_ifindex,

tools/testing/selftests/bpf/progs/xdp_metadata.c

+13
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ struct {
1919
__type(value, __u32);
2020
} prog_arr SEC(".maps");
2121

22+
struct {
23+
__uint(type, BPF_MAP_TYPE_DEVMAP);
24+
__uint(key_size, sizeof(__u32));
25+
__uint(value_size, sizeof(struct bpf_devmap_val));
26+
__uint(max_entries, 1);
27+
} dev_map SEC(".maps");
28+
2229
extern int bpf_xdp_metadata_rx_timestamp(const struct xdp_md *ctx,
2330
__u64 *timestamp) __ksym;
2431
extern int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx, __u32 *hash,
@@ -95,4 +102,10 @@ int rx(struct xdp_md *ctx)
95102
return bpf_redirect_map(&xsk, ctx->rx_queue_index, XDP_PASS);
96103
}
97104

105+
SEC("xdp")
106+
int redirect(struct xdp_md *ctx)
107+
{
108+
return bpf_redirect_map(&dev_map, ctx->rx_queue_index, XDP_PASS);
109+
}
110+
98111
char _license[] SEC("license") = "GPL";

0 commit comments

Comments
 (0)