Skip to content

Commit

Permalink
xsk: include XDP meta data in AF_XDP frames
Browse files Browse the repository at this point in the history
Previously, the AF_XDP (XDP_DRV/XDP_SKB copy-mode) ingress logic did
not include XDP meta data in the data buffers copied out to the user
application.

In this commit, we check if meta data is available, and if so, it is
prepended to the frame.

Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
  • Loading branch information
Björn Töpel authored and Daniel Borkmann committed Aug 30, 2018
1 parent 56b48c6 commit 18baed2
Showing 1 changed file with 18 additions and 6 deletions.
24 changes: 18 additions & 6 deletions net/xdp/xsk.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,20 +55,30 @@ EXPORT_SYMBOL(xsk_umem_discard_addr);

static int __xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp, u32 len)
{
void *buffer;
void *to_buf, *from_buf;
u32 metalen;
u64 addr;
int err;

if (!xskq_peek_addr(xs->umem->fq, &addr) ||
len > xs->umem->chunk_size_nohr) {
len > xs->umem->chunk_size_nohr - XDP_PACKET_HEADROOM) {
xs->rx_dropped++;
return -ENOSPC;
}

addr += xs->umem->headroom;

buffer = xdp_umem_get_data(xs->umem, addr);
memcpy(buffer, xdp->data, len);
if (unlikely(xdp_data_meta_unsupported(xdp))) {
from_buf = xdp->data;
metalen = 0;
} else {
from_buf = xdp->data_meta;
metalen = xdp->data - xdp->data_meta;
}

to_buf = xdp_umem_get_data(xs->umem, addr);
memcpy(to_buf, from_buf, len + metalen);
addr += metalen;
err = xskq_produce_batch_desc(xs->rx, addr, len);
if (!err) {
xskq_discard_addr(xs->umem->fq);
Expand Down Expand Up @@ -111,6 +121,7 @@ void xsk_flush(struct xdp_sock *xs)

int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
{
u32 metalen = xdp->data - xdp->data_meta;
u32 len = xdp->data_end - xdp->data;
void *buffer;
u64 addr;
Expand All @@ -120,15 +131,16 @@ int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
return -EINVAL;

if (!xskq_peek_addr(xs->umem->fq, &addr) ||
len > xs->umem->chunk_size_nohr) {
len > xs->umem->chunk_size_nohr - XDP_PACKET_HEADROOM) {
xs->rx_dropped++;
return -ENOSPC;
}

addr += xs->umem->headroom;

buffer = xdp_umem_get_data(xs->umem, addr);
memcpy(buffer, xdp->data, len);
memcpy(buffer, xdp->data_meta, len + metalen);
addr += metalen;
err = xskq_produce_batch_desc(xs->rx, addr, len);
if (!err) {
xskq_discard_addr(xs->umem->fq);
Expand Down

0 comments on commit 18baed2

Please sign in to comment.