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