168545fb6SJesper Dangaard Brouer // SPDX-License-Identifier: GPL-2.0 268545fb6SJesper Dangaard Brouer /* Copyright (c) 2018 Facebook 368545fb6SJesper Dangaard Brouer * 468545fb6SJesper Dangaard Brouer * This program is free software; you can redistribute it and/or 568545fb6SJesper Dangaard Brouer * modify it under the terms of version 2 of the GNU General Public 668545fb6SJesper Dangaard Brouer * License as published by the Free Software Foundation. 768545fb6SJesper Dangaard Brouer */ 868545fb6SJesper Dangaard Brouer #include <linux/bpf.h> 968545fb6SJesper Dangaard Brouer #include <linux/if_ether.h> 1068545fb6SJesper Dangaard Brouer #include <bpf/bpf_helpers.h> 1168545fb6SJesper Dangaard Brouer 128fffa0e3SAndrii Nakryiko SEC("xdp") _xdp_adjust_tail_shrink(struct xdp_md * xdp)1368545fb6SJesper Dangaard Brouerint _xdp_adjust_tail_shrink(struct xdp_md *xdp) 1468545fb6SJesper Dangaard Brouer { 15*11022108SEelco Chaudron __u8 *data_end = (void *)(long)xdp->data_end; 16*11022108SEelco Chaudron __u8 *data = (void *)(long)xdp->data; 1768545fb6SJesper Dangaard Brouer int offset = 0; 1868545fb6SJesper Dangaard Brouer 19*11022108SEelco Chaudron switch (bpf_xdp_get_buff_len(xdp)) { 20*11022108SEelco Chaudron case 54: 21*11022108SEelco Chaudron /* sizeof(pkt_v4) */ 2268545fb6SJesper Dangaard Brouer offset = 256; /* shrink too much */ 23*11022108SEelco Chaudron break; 24*11022108SEelco Chaudron case 9000: 25*11022108SEelco Chaudron /* non-linear buff test cases */ 26*11022108SEelco Chaudron if (data + 1 > data_end) 27*11022108SEelco Chaudron return XDP_DROP; 28*11022108SEelco Chaudron 29*11022108SEelco Chaudron switch (data[0]) { 30*11022108SEelco Chaudron case 0: 31*11022108SEelco Chaudron offset = 10; 32*11022108SEelco Chaudron break; 33*11022108SEelco Chaudron case 1: 34*11022108SEelco Chaudron offset = 4100; 35*11022108SEelco Chaudron break; 36*11022108SEelco Chaudron case 2: 37*11022108SEelco Chaudron offset = 8200; 38*11022108SEelco Chaudron break; 39*11022108SEelco Chaudron default: 40*11022108SEelco Chaudron return XDP_DROP; 41*11022108SEelco Chaudron } 42*11022108SEelco Chaudron break; 43*11022108SEelco Chaudron default: 4468545fb6SJesper Dangaard Brouer offset = 20; 45*11022108SEelco Chaudron break; 46*11022108SEelco Chaudron } 4768545fb6SJesper Dangaard Brouer if (bpf_xdp_adjust_tail(xdp, 0 - offset)) 4868545fb6SJesper Dangaard Brouer return XDP_DROP; 4968545fb6SJesper Dangaard Brouer return XDP_TX; 5068545fb6SJesper Dangaard Brouer } 5168545fb6SJesper Dangaard Brouer 5268545fb6SJesper Dangaard Brouer char _license[] SEC("license") = "GPL"; 53