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 12d39aec79SDavid Ahern SEC("xdp_redir") 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 */ 21d39aec79SDavid Ahern SEC("xdp_dummy") 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 */ 307a64135fSJesper Dangaard Brouer SEC("xdp_devmap/map_prog") 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 } 43d39aec79SDavid Ahern char _license[] SEC("license") = "GPL"; 44