Message ID | 20180418044223.17685-8-tehnerd@tehnerd.com |
---|---|
State | Accepted, archived |
Delegated to: | BPF Maintainers |
Headers | show |
Series | introduction of bpf_xdp_adjust_tail | expand |
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 <jasowang@redhat.com> > Signed-off-by: Nikita V. Shirokov <tehnerd@tehnerd.com> Acked-by: Michael S. Tsirkin <mst@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
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;