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