0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/bpf.h>
0009 #include <linux/if_ether.h>
0010 #include <bpf/bpf_helpers.h>
0011
0012 SEC("xdp")
0013 int _xdp_adjust_tail_shrink(struct xdp_md *xdp)
0014 {
0015 __u8 *data_end = (void *)(long)xdp->data_end;
0016 __u8 *data = (void *)(long)xdp->data;
0017 int offset = 0;
0018
0019 switch (bpf_xdp_get_buff_len(xdp)) {
0020 case 54:
0021
0022 offset = 256;
0023 break;
0024 case 9000:
0025
0026 if (data + 1 > data_end)
0027 return XDP_DROP;
0028
0029 switch (data[0]) {
0030 case 0:
0031 offset = 10;
0032 break;
0033 case 1:
0034 offset = 4100;
0035 break;
0036 case 2:
0037 offset = 8200;
0038 break;
0039 default:
0040 return XDP_DROP;
0041 }
0042 break;
0043 default:
0044 offset = 20;
0045 break;
0046 }
0047 if (bpf_xdp_adjust_tail(xdp, 0 - offset))
0048 return XDP_DROP;
0049 return XDP_TX;
0050 }
0051
0052 char _license[] SEC("license") = "GPL";