On Tue, Apr 17, 2018 at 09:42:19PM -0700, Nikita V. Shirokov wrote: > w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as > well (only "decrease" of pointer's location is going to be supported). > changing of this pointer will change packet's size. > for tun driver we need to adjust XDP_PASS handling by recalculating > length of the packet if it was passed to the TCP/IP stack > (in case if after xdp's prog run data_end pointer was adjusted) > > Reviewed-by: Jason Wang <jasow...@redhat.com> > Signed-off-by: Nikita V. Shirokov <tehn...@tehnerd.com>
Acked-by: Michael S. Tsirkin <m...@redhat.com> > --- > drivers/net/tun.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/tun.c b/drivers/net/tun.c > index 1e58be152d5c..901351a6ed21 100644 > --- a/drivers/net/tun.c > +++ b/drivers/net/tun.c > @@ -1696,6 +1696,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct > *tun, > return NULL; > case XDP_PASS: > delta = orig_data - xdp.data; > + len = xdp.data_end - xdp.data; > break; > default: > bpf_warn_invalid_xdp_action(act); > @@ -1716,7 +1717,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct > *tun, > } > > skb_reserve(skb, pad - delta); > - skb_put(skb, len + delta); > + skb_put(skb, len); > get_page(alloc_frag->page); > alloc_frag->offset += buflen; > > -- > 2.15.1