Introduce xdp multi-buff support to __xdp_build_skb_from_frame/xdp_build_skb_from_frame utility routines. Signed-off-by: Lorenzo Bianconi <lorenzo@xxxxxxxxxx> --- net/core/xdp.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/net/core/xdp.c b/net/core/xdp.c index f61c63115c95..71bedf6049a1 100644 --- a/net/core/xdp.c +++ b/net/core/xdp.c @@ -582,9 +582,15 @@ struct sk_buff *__xdp_build_skb_from_frame(struct xdp_frame *xdpf, struct sk_buff *skb, struct net_device *dev) { + struct skb_shared_info *sinfo = xdp_get_shared_info_from_frame(xdpf); unsigned int headroom, frame_size; + int i, num_frags = 0; void *hard_start; + /* xdp multi-buff frame */ + if (unlikely(xdp_frame_is_mb(xdpf))) + num_frags = sinfo->nr_frags; + /* Part of headroom was reserved to xdpf */ headroom = sizeof(*xdpf) + xdpf->headroom; @@ -603,6 +609,13 @@ struct sk_buff *__xdp_build_skb_from_frame(struct xdp_frame *xdpf, if (xdpf->metasize) skb_metadata_set(skb, xdpf->metasize); + for (i = 0; i < num_frags; i++) + skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, + skb_frag_page(&sinfo->frags[i]), + skb_frag_off(&sinfo->frags[i]), + skb_frag_size(&sinfo->frags[i]), + xdpf->frame_sz); + /* Essential SKB info: protocol and skb->dev */ skb->protocol = eth_type_trans(skb, dev); -- 2.31.1