xref: /linux/tools/testing/selftests/bpf/progs/test_xdp_update_frags.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * This program is free software; you can redistribute it and/or
4  * modify it under the terms of version 2 of the GNU General Public
5  * License as published by the Free Software Foundation.
6  */
7 #include <linux/bpf.h>
8 #include <linux/if_ether.h>
9 #include <bpf/bpf_helpers.h>
10 
11 int _version SEC("version") = 1;
12 
13 SEC("xdp.frags")
14 int xdp_adjust_frags(struct xdp_md *xdp)
15 {
16 	__u8 *data_end = (void *)(long)xdp->data_end;
17 	__u8 *data = (void *)(long)xdp->data;
18 	__u8 val[16] = {};
19 	__u32 offset;
20 	int err;
21 
22 	if (data + sizeof(__u32) > data_end)
23 		return XDP_DROP;
24 
25 	offset = *(__u32 *)data;
26 	err = bpf_xdp_load_bytes(xdp, offset, val, sizeof(val));
27 	if (err < 0)
28 		return XDP_DROP;
29 
30 	if (val[0] != 0xaa || val[15] != 0xaa) /* marker */
31 		return XDP_DROP;
32 
33 	val[0] = 0xbb; /* update the marker */
34 	val[15] = 0xbb;
35 	err = bpf_xdp_store_bytes(xdp, offset, val, sizeof(val));
36 	if (err < 0)
37 		return XDP_DROP;
38 
39 	return XDP_PASS;
40 }
41 
42 char _license[] SEC("license") = "GPL";
43