1*323302f5SAmery Hung // SPDX-License-Identifier: GPL-2.0 2*323302f5SAmery Hung 3*323302f5SAmery Hung #include "vmlinux.h" 4*323302f5SAmery Hung #include <bpf/bpf_helpers.h> 5*323302f5SAmery Hung 6*323302f5SAmery Hung int xdpf_sz; 7*323302f5SAmery Hung int sinfo_sz; 8*323302f5SAmery Hung int data_len; 9*323302f5SAmery Hung int pull_len; 10*323302f5SAmery Hung 11*323302f5SAmery Hung #define XDP_PACKET_HEADROOM 256 12*323302f5SAmery Hung 13*323302f5SAmery Hung SEC("xdp.frags") 14*323302f5SAmery Hung int xdp_find_sizes(struct xdp_md *ctx) 15*323302f5SAmery Hung { 16*323302f5SAmery Hung xdpf_sz = sizeof(struct xdp_frame); 17*323302f5SAmery Hung sinfo_sz = __PAGE_SIZE - XDP_PACKET_HEADROOM - 18*323302f5SAmery Hung (ctx->data_end - ctx->data); 19*323302f5SAmery Hung 20*323302f5SAmery Hung return XDP_PASS; 21*323302f5SAmery Hung } 22*323302f5SAmery Hung 23*323302f5SAmery Hung SEC("xdp.frags") 24*323302f5SAmery Hung int xdp_pull_data_prog(struct xdp_md *ctx) 25*323302f5SAmery Hung { 26*323302f5SAmery Hung __u8 *data_end = (void *)(long)ctx->data_end; 27*323302f5SAmery Hung __u8 *data = (void *)(long)ctx->data; 28*323302f5SAmery Hung __u8 *val_p; 29*323302f5SAmery Hung int err; 30*323302f5SAmery Hung 31*323302f5SAmery Hung if (data_len != data_end - data) 32*323302f5SAmery Hung return XDP_DROP; 33*323302f5SAmery Hung 34*323302f5SAmery Hung err = bpf_xdp_pull_data(ctx, pull_len); 35*323302f5SAmery Hung if (err) 36*323302f5SAmery Hung return XDP_DROP; 37*323302f5SAmery Hung 38*323302f5SAmery Hung val_p = (void *)(long)ctx->data + 1024; 39*323302f5SAmery Hung if (val_p + 1 > (void *)(long)ctx->data_end) 40*323302f5SAmery Hung return XDP_DROP; 41*323302f5SAmery Hung 42*323302f5SAmery Hung if (*val_p != 0xbb) 43*323302f5SAmery Hung return XDP_DROP; 44*323302f5SAmery Hung 45*323302f5SAmery Hung return XDP_PASS; 46*323302f5SAmery Hung } 47*323302f5SAmery Hung 48*323302f5SAmery Hung char _license[] SEC("license") = "GPL"; 49