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 |