| From 0055e6e171f97d45b3db789991a7fd425c819417 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 10 Oct 2023 22:15:14 +0300 |
| Subject: vsock: read from socket's error queue |
| |
| From: Arseniy Krasnov <avkrasnov@salutedevices.com> |
| |
| [ Upstream commit 49dbe25adac42d3e06f65d1420946bec65896222 ] |
| |
| This adds handling of MSG_ERRQUEUE input flag in receive call. This flag |
| is used to read socket's error queue instead of data queue. Possible |
| scenario of error queue usage is receiving completions for transmission |
| with MSG_ZEROCOPY flag. This patch also adds new defines: 'SOL_VSOCK' |
| and 'VSOCK_RECVERR'. |
| |
| Signed-off-by: Arseniy Krasnov <avkrasnov@salutedevices.com> |
| Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| include/linux/socket.h | 1 + |
| include/uapi/linux/vm_sockets.h | 17 +++++++++++++++++ |
| net/vmw_vsock/af_vsock.c | 6 ++++++ |
| 3 files changed, 24 insertions(+) |
| |
| diff --git a/include/linux/socket.h b/include/linux/socket.h |
| index de3701a2a2129..1db29aab8f9c3 100644 |
| --- a/include/linux/socket.h |
| +++ b/include/linux/socket.h |
| @@ -376,6 +376,7 @@ struct ucred { |
| #define SOL_MPTCP 284 |
| #define SOL_MCTP 285 |
| #define SOL_SMC 286 |
| +#define SOL_VSOCK 287 |
| |
| /* IPX options */ |
| #define IPX_TYPE 1 |
| diff --git a/include/uapi/linux/vm_sockets.h b/include/uapi/linux/vm_sockets.h |
| index c60ca33eac594..ed07181d4eff9 100644 |
| --- a/include/uapi/linux/vm_sockets.h |
| +++ b/include/uapi/linux/vm_sockets.h |
| @@ -191,4 +191,21 @@ struct sockaddr_vm { |
| |
| #define IOCTL_VM_SOCKETS_GET_LOCAL_CID _IO(7, 0xb9) |
| |
| +/* MSG_ZEROCOPY notifications are encoded in the standard error format, |
| + * sock_extended_err. See Documentation/networking/msg_zerocopy.rst in |
| + * kernel source tree for more details. |
| + */ |
| + |
| +/* 'cmsg_level' field value of 'struct cmsghdr' for notification parsing |
| + * when MSG_ZEROCOPY flag is used on transmissions. |
| + */ |
| + |
| +#define SOL_VSOCK 287 |
| + |
| +/* 'cmsg_type' field value of 'struct cmsghdr' for notification parsing |
| + * when MSG_ZEROCOPY flag is used on transmissions. |
| + */ |
| + |
| +#define VSOCK_RECVERR 1 |
| + |
| #endif /* _UAPI_VM_SOCKETS_H */ |
| diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c |
| index 8360c790a8a01..84471745c0829 100644 |
| --- a/net/vmw_vsock/af_vsock.c |
| +++ b/net/vmw_vsock/af_vsock.c |
| @@ -89,6 +89,7 @@ |
| #include <linux/types.h> |
| #include <linux/bitops.h> |
| #include <linux/cred.h> |
| +#include <linux/errqueue.h> |
| #include <linux/init.h> |
| #include <linux/io.h> |
| #include <linux/kernel.h> |
| @@ -110,6 +111,7 @@ |
| #include <linux/workqueue.h> |
| #include <net/sock.h> |
| #include <net/af_vsock.h> |
| +#include <uapi/linux/vm_sockets.h> |
| |
| static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr); |
| static void vsock_sk_destruct(struct sock *sk); |
| @@ -2096,6 +2098,10 @@ vsock_connectible_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, |
| int err; |
| |
| sk = sock->sk; |
| + |
| + if (unlikely(flags & MSG_ERRQUEUE)) |
| + return sock_recv_errqueue(sk, msg, len, SOL_VSOCK, VSOCK_RECVERR); |
| + |
| vsk = vsock_sk(sk); |
| err = 0; |
| |
| -- |
| 2.42.0 |
| |