Message ID | 20180418042951.17183-3-tehnerd@tehnerd.com |
---|---|
State | Changes Requested, archived |
Delegated to: | BPF Maintainers |
Headers | show |
Series | introduction of bpf_xdp_adjust_tail | expand |
On Wed, Apr 18, 2018 at 02:48:18PM +0200, Jesper Dangaard Brouer wrote: > On Tue, 17 Apr 2018 21:29:42 -0700 > "Nikita V. Shirokov" <tehnerd@tehnerd.com> 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 generic XDP we need to reflect this packet's length change by > > adjusting skb's tail pointer > > > > Acked-by: Alexei Starovoitov <ast@kernel.org> > > You are missing your own Signed-off-by: line on all of the patches. > yeah, somehow lost it between v1 and v2 :) thanks ! > BTW, thank you for working on this! It have been on my todo-list for a > while now! > > _After_ this patchset, I would like to see adding support for > "increasing" the data_end location to create a larger packet. For that > we should likely add a data_hard_end pointer. This, would also be > helpful in cpu_map_build_skb() to know the data_hard_end, to determine > the frame size (as some driver doesn't use PAGE_SIZE frames, ixgbe). > yeah, increasing the size would be nice to have, but will require more thinking / rework on drivers side (as you pointed out it's not as easy as "every driver have at least PAGE_SIZE of data available for xdp".). will add to my TODO > > -- > Best regards, > Jesper Dangaard Brouer > MSc.CS, Principal Kernel Engineer at Red Hat > LinkedIn: http://www.linkedin.com/in/brouer -- Nikita
On Tue, 17 Apr 2018 21:29:42 -0700 "Nikita V. Shirokov" <tehnerd@tehnerd.com> 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 generic XDP we need to reflect this packet's length change by > adjusting skb's tail pointer > > Acked-by: Alexei Starovoitov <ast@kernel.org> You are missing your own Signed-off-by: line on all of the patches. BTW, thank you for working on this! It have been on my todo-list for a while now! _After_ this patchset, I would like to see adding support for "increasing" the data_end location to create a larger packet. For that we should likely add a data_hard_end pointer. This, would also be helpful in cpu_map_build_skb() to know the data_hard_end, to determine the frame size (as some driver doesn't use PAGE_SIZE frames, ixgbe).
diff --git a/net/core/dev.c b/net/core/dev.c index 969462ebb296..11c789231a03 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3996,9 +3996,9 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, 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; @@ -4037,6 +4037,7 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, 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); @@ -4051,6 +4052,13 @@ static u32 netif_receive_generic_xdp(struct sk_buff *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:
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 generic XDP we need to reflect this packet's length change by adjusting skb's tail pointer Acked-by: Alexei Starovoitov <ast@kernel.org> --- net/core/dev.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)