1 #ifndef VFIO_USER_PROXY_H 2 #define VFIO_USER_PROXY_H 3 4 /* 5 * vfio protocol over a UNIX socket. 6 * 7 * Copyright © 2018, 2021 Oracle and/or its affiliates. 8 * 9 * SPDX-License-Identifier: GPL-2.0-or-later 10 */ 11 12 #include "io/channel.h" 13 #include "io/channel-socket.h" 14 15 #include "qemu/queue.h" 16 #include "qemu/sockets.h" 17 #include "qemu/thread.h" 18 #include "hw/vfio-user/protocol.h" 19 20 typedef struct { 21 int send_fds; 22 int recv_fds; 23 int *fds; 24 } VFIOUserFDs; 25 26 enum msg_type { 27 VFIO_MSG_NONE, 28 VFIO_MSG_ASYNC, 29 VFIO_MSG_WAIT, 30 VFIO_MSG_NOWAIT, 31 VFIO_MSG_REQ, 32 }; 33 34 typedef struct VFIOUserMsg { 35 QTAILQ_ENTRY(VFIOUserMsg) next; 36 VFIOUserHdr *hdr; 37 VFIOUserFDs *fds; 38 uint32_t rsize; 39 uint32_t id; 40 QemuCond cv; 41 bool complete; 42 bool pending; 43 enum msg_type type; 44 } VFIOUserMsg; 45 46 47 enum proxy_state { 48 VFIO_PROXY_CONNECTED = 1, 49 VFIO_PROXY_ERROR = 2, 50 VFIO_PROXY_CLOSING = 3, 51 VFIO_PROXY_CLOSED = 4, 52 }; 53 54 typedef QTAILQ_HEAD(VFIOUserMsgQ, VFIOUserMsg) VFIOUserMsgQ; 55 56 typedef struct VFIOUserProxy { 57 QLIST_ENTRY(VFIOUserProxy) next; 58 char *sockname; 59 struct QIOChannel *ioc; 60 void (*request)(void *opaque, VFIOUserMsg *msg); 61 void *req_arg; 62 uint64_t max_xfer_size; 63 uint64_t max_send_fds; 64 uint64_t max_dma; 65 uint64_t dma_pgsizes; 66 uint64_t max_bitmap; 67 uint64_t migr_pgsize; 68 int flags; 69 QemuCond close_cv; 70 AioContext *ctx; 71 QEMUBH *req_bh; 72 73 /* 74 * above only changed when BQL is held 75 * below are protected by per-proxy lock 76 */ 77 QemuMutex lock; 78 VFIOUserMsgQ free; 79 VFIOUserMsgQ pending; 80 VFIOUserMsgQ incoming; 81 VFIOUserMsgQ outgoing; 82 VFIOUserMsg *last_nowait; 83 VFIOUserMsg *part_recv; 84 size_t recv_left; 85 enum proxy_state state; 86 } VFIOUserProxy; 87 88 /* VFIOProxy flags */ 89 #define VFIO_PROXY_CLIENT 0x1 90 #define VFIO_PROXY_FORCE_QUEUED 0x4 91 92 typedef struct VFIODevice VFIODevice; 93 94 VFIOUserProxy *vfio_user_connect_dev(SocketAddress *addr, Error **errp); 95 void vfio_user_disconnect(VFIOUserProxy *proxy); 96 void vfio_user_set_handler(VFIODevice *vbasedev, 97 void (*handler)(void *opaque, VFIOUserMsg *msg), 98 void *reqarg); 99 bool vfio_user_validate_version(VFIOUserProxy *proxy, Error **errp); 100 101 void vfio_user_request_msg(VFIOUserHdr *hdr, uint16_t cmd, 102 uint32_t size, uint32_t flags); 103 bool vfio_user_send_wait(VFIOUserProxy *proxy, VFIOUserHdr *hdr, 104 VFIOUserFDs *fds, int rsize, Error **errp); 105 106 #endif /* VFIO_USER_PROXY_H */ 107