Skip to content

Commit 45a8668

Browse files
Björn Töpelborkmann
authored andcommitted
xsk: Add support for recvmsg()
Add support for non-blocking recvmsg() to XDP sockets. Previously, only sendmsg() was supported by XDP socket. Now, for symmetry and the upcoming busy-polling support, recvmsg() is added. Signed-off-by: Björn Töpel <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Acked-by: Magnus Karlsson <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent 7c951ca commit 45a8668

File tree

1 file changed

+21
-1
lines changed

1 file changed

+21
-1
lines changed

net/xdp/xsk.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,26 @@ static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len)
531531
return __xsk_sendmsg(sk);
532532
}
533533

534+
static int xsk_recvmsg(struct socket *sock, struct msghdr *m, size_t len, int flags)
535+
{
536+
bool need_wait = !(flags & MSG_DONTWAIT);
537+
struct sock *sk = sock->sk;
538+
struct xdp_sock *xs = xdp_sk(sk);
539+
540+
if (unlikely(!(xs->dev->flags & IFF_UP)))
541+
return -ENETDOWN;
542+
if (unlikely(!xs->rx))
543+
return -ENOBUFS;
544+
if (unlikely(!xsk_is_bound(xs)))
545+
return -ENXIO;
546+
if (unlikely(need_wait))
547+
return -EOPNOTSUPP;
548+
549+
if (xs->pool->cached_need_wakeup & XDP_WAKEUP_RX && xs->zc)
550+
return xsk_wakeup(xs, XDP_WAKEUP_RX);
551+
return 0;
552+
}
553+
534554
static __poll_t xsk_poll(struct file *file, struct socket *sock,
535555
struct poll_table_struct *wait)
536556
{
@@ -1191,7 +1211,7 @@ static const struct proto_ops xsk_proto_ops = {
11911211
.setsockopt = xsk_setsockopt,
11921212
.getsockopt = xsk_getsockopt,
11931213
.sendmsg = xsk_sendmsg,
1194-
.recvmsg = sock_no_recvmsg,
1214+
.recvmsg = xsk_recvmsg,
11951215
.mmap = xsk_mmap,
11961216
.sendpage = sock_no_sendpage,
11971217
};

0 commit comments

Comments
 (0)