Skip to content

Commit 18baed2

Browse files
Björn Töpelborkmann
authored andcommitted
xsk: include XDP meta data in AF_XDP frames
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 <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]>
1 parent 56b48c6 commit 18baed2

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

net/xdp/xsk.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,20 +55,30 @@ EXPORT_SYMBOL(xsk_umem_discard_addr);
5555

5656
static int __xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp, u32 len)
5757
{
58-
void *buffer;
58+
void *to_buf, *from_buf;
59+
u32 metalen;
5960
u64 addr;
6061
int err;
6162

6263
if (!xskq_peek_addr(xs->umem->fq, &addr) ||
63-
len > xs->umem->chunk_size_nohr) {
64+
len > xs->umem->chunk_size_nohr - XDP_PACKET_HEADROOM) {
6465
xs->rx_dropped++;
6566
return -ENOSPC;
6667
}
6768

6869
addr += xs->umem->headroom;
6970

70-
buffer = xdp_umem_get_data(xs->umem, addr);
71-
memcpy(buffer, xdp->data, len);
71+
if (unlikely(xdp_data_meta_unsupported(xdp))) {
72+
from_buf = xdp->data;
73+
metalen = 0;
74+
} else {
75+
from_buf = xdp->data_meta;
76+
metalen = xdp->data - xdp->data_meta;
77+
}
78+
79+
to_buf = xdp_umem_get_data(xs->umem, addr);
80+
memcpy(to_buf, from_buf, len + metalen);
81+
addr += metalen;
7282
err = xskq_produce_batch_desc(xs->rx, addr, len);
7383
if (!err) {
7484
xskq_discard_addr(xs->umem->fq);
@@ -111,6 +121,7 @@ void xsk_flush(struct xdp_sock *xs)
111121

112122
int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
113123
{
124+
u32 metalen = xdp->data - xdp->data_meta;
114125
u32 len = xdp->data_end - xdp->data;
115126
void *buffer;
116127
u64 addr;
@@ -120,15 +131,16 @@ int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
120131
return -EINVAL;
121132

122133
if (!xskq_peek_addr(xs->umem->fq, &addr) ||
123-
len > xs->umem->chunk_size_nohr) {
134+
len > xs->umem->chunk_size_nohr - XDP_PACKET_HEADROOM) {
124135
xs->rx_dropped++;
125136
return -ENOSPC;
126137
}
127138

128139
addr += xs->umem->headroom;
129140

130141
buffer = xdp_umem_get_data(xs->umem, addr);
131-
memcpy(buffer, xdp->data, len);
142+
memcpy(buffer, xdp->data_meta, len + metalen);
143+
addr += metalen;
132144
err = xskq_produce_batch_desc(xs->rx, addr, len);
133145
if (!err) {
134146
xskq_discard_addr(xs->umem->fq);

0 commit comments

Comments
 (0)