1d39aec79SDavid Ahern // SPDX-License-Identifier: GPL-2.0
2042b1545SJesper Dangaard Brouer #include <linux/bpf.h>
3d39aec79SDavid Ahern #include <bpf/bpf_helpers.h>
4d39aec79SDavid Ahern 
5d39aec79SDavid Ahern struct {
6d39aec79SDavid Ahern 	__uint(type, BPF_MAP_TYPE_DEVMAP);
7d39aec79SDavid Ahern 	__uint(key_size, sizeof(__u32));
8d39aec79SDavid Ahern 	__uint(value_size, sizeof(struct bpf_devmap_val));
9d39aec79SDavid Ahern 	__uint(max_entries, 4);
10d39aec79SDavid Ahern } dm_ports SEC(".maps");
11d39aec79SDavid Ahern 
128fffa0e3SAndrii Nakryiko SEC("xdp")
xdp_redir_prog(struct xdp_md * ctx)13d39aec79SDavid Ahern int xdp_redir_prog(struct xdp_md *ctx)
14d39aec79SDavid Ahern {
15d39aec79SDavid Ahern 	return bpf_redirect_map(&dm_ports, 1, 0);
16d39aec79SDavid Ahern }
17d39aec79SDavid Ahern 
18d39aec79SDavid Ahern /* invalid program on DEVMAP entry;
19d39aec79SDavid Ahern  * SEC name means expected attach type not set
20d39aec79SDavid Ahern  */
218fffa0e3SAndrii Nakryiko SEC("xdp")
xdp_dummy_prog(struct xdp_md * ctx)22d39aec79SDavid Ahern int xdp_dummy_prog(struct xdp_md *ctx)
23d39aec79SDavid Ahern {
24d39aec79SDavid Ahern 	return XDP_PASS;
25d39aec79SDavid Ahern }
26d39aec79SDavid Ahern 
27d39aec79SDavid Ahern /* valid program on DEVMAP entry via SEC name;
28d39aec79SDavid Ahern  * has access to egress and ingress ifindex
29d39aec79SDavid Ahern  */
30*439f0336SLorenzo Bianconi SEC("xdp/devmap")
xdp_dummy_dm(struct xdp_md * ctx)31d39aec79SDavid Ahern int xdp_dummy_dm(struct xdp_md *ctx)
32d39aec79SDavid Ahern {
33d39aec79SDavid Ahern 	char fmt[] = "devmap redirect: dev %u -> dev %u len %u\n";
34d39aec79SDavid Ahern 	void *data_end = (void *)(long)ctx->data_end;
35d39aec79SDavid Ahern 	void *data = (void *)(long)ctx->data;
36d39aec79SDavid Ahern 	unsigned int len = data_end - data;
37d39aec79SDavid Ahern 
38d39aec79SDavid Ahern 	bpf_trace_printk(fmt, sizeof(fmt),
39d39aec79SDavid Ahern 			 ctx->ingress_ifindex, ctx->egress_ifindex, len);
40d39aec79SDavid Ahern 
41d39aec79SDavid Ahern 	return XDP_PASS;
42d39aec79SDavid Ahern }
430c5e118cSLorenzo Bianconi 
440c5e118cSLorenzo Bianconi SEC("xdp.frags/devmap")
xdp_dummy_dm_frags(struct xdp_md * ctx)450c5e118cSLorenzo Bianconi int xdp_dummy_dm_frags(struct xdp_md *ctx)
460c5e118cSLorenzo Bianconi {
470c5e118cSLorenzo Bianconi 	return XDP_PASS;
480c5e118cSLorenzo Bianconi }
490c5e118cSLorenzo Bianconi 
50d39aec79SDavid Ahern char _license[] SEC("license") = "GPL";
51