bpf: fix xdp_generic for bpf_adjust_tail usecase
authorNikita V. Shirokov <tehnerd@tehnerd.com>
Wed, 25 Apr 2018 14:15:03 +0000 (07:15 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 26 Apr 2018 20:56:40 +0000 (22:56 +0200)
When bpf_adjust_tail was introduced for generic xdp, it changed skb's tail
pointer, so it was pointing to the new "end of the packet". However skb's
len field wasn't properly modified, so on the wire ethernet frame had
original (or even bigger, if adjust_head was used) size. This diff is
fixing this.

Fixes: 198d83bb3 (" bpf: make generic xdp compatible w/ bpf_xdp_adjust_tail")
Signed-off-by: Nikita V. Shirokov <tehnerd@tehnerd.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
net/core/dev.c

index c624a04dad1fbbd8ea7ad0055b2d47d11c6caa1b..8f8931b93140e15db2b9a530d9b28dd94b6f7cd1 100644 (file)
@@ -4057,8 +4057,10 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb,
         * pckt.
         */
        off = orig_data_end - xdp.data_end;
-       if (off != 0)
+       if (off != 0) {
                skb_set_tail_pointer(skb, xdp.data_end - xdp.data);
+               skb->len -= off;
+       }
 
        switch (act) {
        case XDP_REDIRECT: