From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Michael S. Tsirkin" Subject: Re: [PATCH bpf-next v3 07/11] bpf: make tun compatible w/ bpf_xdp_adjust_tail Date: Wed, 18 Apr 2018 19:16:11 +0300 Message-ID: <20180418191605-mutt-send-email-mst@kernel.org> References: <20180418044223.17685-1-tehnerd@tehnerd.com> <20180418044223.17685-8-tehnerd@tehnerd.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Alexei Starovoitov , Daniel Borkmann , Jason Wang , "David S. Miller" , netdev@vger.kernel.org To: "Nikita V. Shirokov" Return-path: Received: from mx3-rdu2.redhat.com ([66.187.233.73]:56360 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752511AbeDRQQN (ORCPT ); Wed, 18 Apr 2018 12:16:13 -0400 Content-Disposition: inline In-Reply-To: <20180418044223.17685-8-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org List-ID: 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 > Signed-off-by: Nikita V. Shirokov Acked-by: Michael S. Tsirkin > --- > 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