1 | // SPDX-License-Identifier: GPL-2.0 |
2 | #include <linux/bpf.h> |
3 | #include <bpf/bpf_helpers.h> |
4 | |
5 | SEC("xdp" ) |
6 | int _xdp_adjust_tail_grow(struct xdp_md *xdp) |
7 | { |
8 | int data_len = bpf_xdp_get_buff_len(xdp); |
9 | int offset = 0; |
10 | /* SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) */ |
11 | #if defined(__TARGET_ARCH_s390) |
12 | int tailroom = 512; |
13 | #else |
14 | int tailroom = 320; |
15 | #endif |
16 | |
17 | /* Data length determine test case */ |
18 | |
19 | if (data_len == 54) { /* sizeof(pkt_v4) */ |
20 | offset = 4096; /* test too large offset */ |
21 | } else if (data_len == 74) { /* sizeof(pkt_v6) */ |
22 | offset = 40; |
23 | } else if (data_len == 64) { |
24 | offset = 128; |
25 | } else if (data_len == 128) { |
26 | /* Max tail grow 3520 */ |
27 | offset = 4096 - 256 - tailroom - data_len; |
28 | } else if (data_len == 9000) { |
29 | offset = 10; |
30 | } else if (data_len == 9001) { |
31 | offset = 4096; |
32 | } else { |
33 | return XDP_ABORTED; /* No matching test */ |
34 | } |
35 | |
36 | if (bpf_xdp_adjust_tail(xdp, offset)) |
37 | return XDP_DROP; |
38 | return XDP_TX; |
39 | } |
40 | |
41 | char _license[] SEC("license" ) = "GPL" ; |
42 | |