xref: /qemu/hw/vfio-user/proxy.h (revision 3bdb738b734c77f93f93f8119c8f6ba8a9c5947c)
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