struct bpf_prog *xdp_prog)
 {
        struct netdev_rx_queue *rxqueue;
+       void *orig_data, *orig_data_end;
        u32 metalen, act = XDP_DROP;
        struct xdp_buff xdp;
-       void *orig_data;
        int hlen, off;
        u32 mac_len;
 
        xdp.data_meta = xdp.data;
        xdp.data_end = xdp.data + hlen;
        xdp.data_hard_start = skb->data - skb_headroom(skb);
+       orig_data_end = xdp.data_end;
        orig_data = xdp.data;
 
        rxqueue = netif_get_rxqueue(skb);
                __skb_push(skb, -off);
        skb->mac_header += off;
 
+       /* check if bpf_xdp_adjust_tail was used. it can only "shrink"
+        * pckt.
+        */
+       off = orig_data_end - xdp.data_end;
+       if (off != 0)
+               skb_set_tail_pointer(skb, xdp.data_end - xdp.data);
+
        switch (act) {
        case XDP_REDIRECT:
        case XDP_TX: