aboutsummaryrefslogtreecommitdiff
path: root/lib/tran_sock.h
blob: b764e9b617cdea9ca58b991a50175e2840ed32ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * Copyright (c) 2019 Nutanix Inc. All rights reserved.
 *
 * Authors: Thanos Makatos <thanos@nutanix.com>
 *          Swapnil Ingle <swapnil.ingle@nutanix.com>
 *          Felipe Franciosi <felipe@nutanix.com>
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *      * Redistributions of source code must retain the above copyright
 *        notice, this list of conditions and the following disclaimer.
 *      * Redistributions in binary form must reproduce the above copyright
 *        notice, this list of conditions and the following disclaimer in the
 *        documentation and/or other materials provided with the distribution.
 *      * Neither the name of Nutanix nor the names of its contributors may be
 *        used to endorse or promote products derived from this software without
 *        specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 *  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 *  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 *  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 *  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 *  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 *  DAMAGE.
 *
 */

#ifndef LIB_VFIO_USER_TRAN_SOCK_H
#define LIB_VFIO_USER_TRAN_SOCK_H

#include "libvfio-user.h"

/*
 * These are not public routines, but for convenience, they are used by the
 * sample/test code as well as privately within libvfio-user.
 *
 * Note there is currently only one transport - talking over a UNIX socket.
 */

/* The largest number of fd's we are prepared to receive. */
// FIXME: value?
#define VFIO_USER_CLIENT_MAX_FDS_LIMIT (1024)

extern struct transport_ops sock_transport_ops;

/*
 * Parse JSON supplied from the other side into the known parameters. Note: they
 * will not be set if not found in the JSON.
 */
int
vfu_parse_version_json(const char *json_str, int *client_max_fdsp,
                       size_t *pgsizep);

/*
 * Send a message to the other end.  The iovecs array should leave the first
 * entry empty, as it will be used for the header.
 */
int
vfu_send_iovec(int sock, uint16_t msg_id, bool is_reply,
               enum vfio_user_command cmd,
               struct iovec *iovecs, size_t nr_iovecs,
               int *fds, int count,
               int err);

/*
 * Send a message to the other end with the given data.
 */
int
vfu_send(int sock, uint16_t msg_id, bool is_reply, enum vfio_user_command cmd,
         void *data, size_t data_len);

/*
 * Send an empty reply back to the other end with the given errno.
 */
int
vfu_send_error(int sock, uint16_t msg_id,
               enum vfio_user_command cmd,
               int error);

/*
 * Receive a message from the other end, and place the data into the given
 * buffer. If data is supplied by the other end, it must be exactly *len in
 * size.
 */
int
vfu_recv(int sock, struct vfio_user_header *hdr, bool is_reply,
         uint16_t *msg_id, void *data, size_t *len);

/*
 * Receive a message from the other end, but automatically allocate a buffer for
 * it, which must be freed by the caller.  If there is no data, *datap is set to
 * NULL.
 */
int
vfu_recv_alloc(int sock, struct vfio_user_header *hdr, bool is_reply,
               uint16_t *msg_id, void **datap, size_t *lenp);

/*
 * Send and receive a message to the other end, using iovecs for the send. The
 * iovecs array should leave the first entry empty, as it will be used for the
 * header.
 *
 * If specified, the given fds are sent to the other side. @hdr is filled with
 * the reply header if non-NULL.
 */
int
vfu_msg_iovec(int sock, uint16_t msg_id,
              enum vfio_user_command cmd,
              struct iovec *iovecs, size_t nr_iovecs,
              int *send_fds, size_t fd_count,
              struct vfio_user_header *hdr,
              void *recv_data, size_t recv_len);

/*
 * Send and receive a message to the other end.  @hdr is filled with the reply
 * header if non-NULL.
 */
int
vfu_msg(int sock, uint16_t msg_id,
        enum vfio_user_command cmd,
        void *send_data, size_t send_len,
        struct vfio_user_header *hdr,
        void *recv_data, size_t recv_len);

#endif /* LIB_VFIO_USER_TRAN_SOCK_H */

/* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */