From: Maryam Tahhan <mtahhan@xxxxxxxxxx> Simply set AF_XDP descriptor options to XDP flags. Jesper: Will this really be acceptable by AF_XDP maintainers? Signed-off-by: Maryam Tahhan <mtahhan@xxxxxxxxxx> --- include/uapi/linux/if_xdp.h | 2 +- net/xdp/xsk.c | 2 +- net/xdp/xsk_queue.h | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/uapi/linux/if_xdp.h b/include/uapi/linux/if_xdp.h index a78a8096f4ce..9335b56474e7 100644 --- a/include/uapi/linux/if_xdp.h +++ b/include/uapi/linux/if_xdp.h @@ -103,7 +103,7 @@ struct xdp_options { struct xdp_desc { __u64 addr; __u32 len; - __u32 options; + __u32 options; /* set to the values of xdp_hints_flags*/ }; /* UMEM descriptor is __u64 */ diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 5b4ce6ba1bc7..32095d78f06b 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -141,7 +141,7 @@ static int __xsk_rcv_zc(struct xdp_sock *xs, struct xdp_buff *xdp, u32 len) int err; addr = xp_get_handle(xskb); - err = xskq_prod_reserve_desc(xs->rx, addr, len); + err = xskq_prod_reserve_desc(xs->rx, addr, len, xdp->flags); if (err) { xs->rx_queue_full++; return err; diff --git a/net/xdp/xsk_queue.h b/net/xdp/xsk_queue.h index fb20bf7207cf..7a66f082f97e 100644 --- a/net/xdp/xsk_queue.h +++ b/net/xdp/xsk_queue.h @@ -368,7 +368,7 @@ static inline u32 xskq_prod_reserve_addr_batch(struct xsk_queue *q, struct xdp_d } static inline int xskq_prod_reserve_desc(struct xsk_queue *q, - u64 addr, u32 len) + u64 addr, u32 len, u32 flags) { struct xdp_rxtx_ring *ring = (struct xdp_rxtx_ring *)q->ring; u32 idx; @@ -380,6 +380,7 @@ static inline int xskq_prod_reserve_desc(struct xsk_queue *q, idx = q->cached_prod++ & q->ring_mask; ring->desc[idx].addr = addr; ring->desc[idx].len = len; + ring->desc[idx].options = flags; return 0; }