xref: /linux/tools/testing/selftests/bpf/progs/test_xdp_devmap_tailcall.c (revision 4f38da1f027ea2c9f01bb71daa7a299c191b6940)
1*0e8e60e8SDaniel Borkmann // SPDX-License-Identifier: GPL-2.0
2*0e8e60e8SDaniel Borkmann 
3*0e8e60e8SDaniel Borkmann #include "vmlinux.h"
4*0e8e60e8SDaniel Borkmann #include <bpf/bpf_helpers.h>
5*0e8e60e8SDaniel Borkmann #include <bpf/bpf_tracing.h>
6*0e8e60e8SDaniel Borkmann 
7*0e8e60e8SDaniel Borkmann SEC("xdp")
8*0e8e60e8SDaniel Borkmann int xdp_devmap(struct xdp_md *ctx)
9*0e8e60e8SDaniel Borkmann {
10*0e8e60e8SDaniel Borkmann 	return ctx->egress_ifindex;
11*0e8e60e8SDaniel Borkmann }
12*0e8e60e8SDaniel Borkmann 
13*0e8e60e8SDaniel Borkmann struct {
14*0e8e60e8SDaniel Borkmann 	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
15*0e8e60e8SDaniel Borkmann 	__uint(max_entries, 1);
16*0e8e60e8SDaniel Borkmann 	__uint(key_size, sizeof(__u32));
17*0e8e60e8SDaniel Borkmann 	__array(values, int (void *));
18*0e8e60e8SDaniel Borkmann } xdp_map SEC(".maps") = {
19*0e8e60e8SDaniel Borkmann 	.values = {
20*0e8e60e8SDaniel Borkmann 		[0] = (void *)&xdp_devmap,
21*0e8e60e8SDaniel Borkmann 	},
22*0e8e60e8SDaniel Borkmann };
23*0e8e60e8SDaniel Borkmann 
24*0e8e60e8SDaniel Borkmann SEC("xdp")
25*0e8e60e8SDaniel Borkmann int xdp_entry(struct xdp_md *ctx)
26*0e8e60e8SDaniel Borkmann {
27*0e8e60e8SDaniel Borkmann 	bpf_tail_call(ctx, &xdp_map, 0);
28*0e8e60e8SDaniel Borkmann 	return 0;
29*0e8e60e8SDaniel Borkmann }
30