xref: /linux/tools/testing/selftests/bpf/progs/test_xdp_pull_data.c (revision 4f38da1f027ea2c9f01bb71daa7a299c191b6940)
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