FD.io VPP  v16.06
Vector Packet Processing
vhost-user.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef __VIRTIO_VHOST_USER_H__
16 #define __VIRTIO_VHOST_USER_H__
17 /* vhost-user data structures */
18 
19 #define VHOST_MEMORY_MAX_NREGIONS 8
20 #define VHOST_USER_MSG_HDR_SZ 12
21 #define VHOST_VRING_MAX_SIZE 32768
22 #define VHOST_NET_VRING_IDX_RX 0
23 #define VHOST_NET_VRING_IDX_TX 1
24 #define VHOST_NET_VRING_NUM 2
25 
26 #define VIRTQ_DESC_F_NEXT 1
27 #define VHOST_USER_REPLY_MASK (0x1 << 2)
28 
29 #define VHOST_USER_PROTOCOL_F_MQ 0
30 #define VHOST_USER_PROTOCOL_F_LOG_SHMFD 1
31 #define VHOST_VRING_F_LOG 0
32 
33 #if RTE_VERSION >= RTE_VERSION_NUM(2, 2, 0, 0)
34 #define VHOST_USER_F_PROTOCOL_FEATURES 30
35 #if RTE_VERSION >= RTE_VERSION_NUM(16, 4, 0, 0)
36 #define VHOST_USER_PROTOCOL_FEATURES ((1ULL << VHOST_USER_PROTOCOL_F_MQ) | \
37  (1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD))
38 #else
39 #define VHOST_USER_PROTOCOL_FEATURES (1ULL << VHOST_USER_PROTOCOL_F_MQ)
40 #endif
41 
42 /* If multiqueue is provided by host, then we suppport it. */
43 #define VIRTIO_NET_CTRL_MQ 4
44 #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET 0
45 #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN 1
46 #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX 0x8000
47 #endif
48 
49 #define foreach_virtio_net_feature \
50  _ (VIRTIO_NET_F_MRG_RXBUF, 15) \
51  _ (VIRTIO_F_ANY_LAYOUT, 27) \
52  _ (VHOST_F_LOG_ALL, 26) \
53  _ (VIRTIO_NET_F_GUEST_ANNOUNCE, 21) \
54  _ (VHOST_USER_F_PROTOCOL_FEATURES, 30)
55 
56 
57 typedef enum {
58 #define _(f,n) FEAT_##f = (n),
60 #undef _
62 
64  const char * sock_filename, u8 is_server,
65  u32 * sw_if_index, u64 feature_mask,
66  u8 renumber, u32 custom_dev_instance, u8 *hwaddr);
68  const char * sock_filename, u8 is_server,
69  u32 sw_if_index, u64 feature_mask,
70  u8 renumber, u32 custom_dev_instance);
71 int vhost_user_delete_if(vnet_main_t * vnm, vlib_main_t * vm, u32 sw_if_index);
72 
73 typedef struct vhost_user_memory_region {
79 
80 typedef struct vhost_user_memory {
85 
86 typedef struct {
87  unsigned int index, num;
89 
90 typedef struct {
91  unsigned int index, flags;
92  u64 desc_user_addr, used_user_addr, avail_user_addr, log_guest_addr;
94 
95 typedef struct vhost_user_log {
99 
100 typedef enum vhost_user_req {
118 #if RTE_VERSION >= RTE_VERSION_NUM(2, 2, 0, 0)
120 #endif
124 
125 // vring_desc I/O buffer descriptor
126 typedef struct {
127  uint64_t addr; // packet data buffer address
128  uint32_t len; // packet data buffer size
129  uint16_t flags; // (see below)
130  uint16_t next; // optional index next descriptor in chain
131 } __attribute ((packed)) vring_desc_t;
132 
133 typedef struct {
134  uint16_t flags;
135  uint16_t idx;
137 } __attribute ((packed)) vring_avail_t;
138 
139 typedef struct {
140  uint16_t flags;
141  uint16_t idx;
142  struct /* vring_used_elem */ {
143  uint32_t id;
144  uint32_t len;
145  } ring[VHOST_VRING_MAX_SIZE];
146 } __attribute ((packed)) vring_used_t;
147 
148 typedef struct {
149  u8 flags;
150  u8 gso_type;
151  u16 hdr_len;
152  u16 gso_size;
153  u16 csum_start;
154  u16 csum_offset;
155 } __attribute ((packed)) virtio_net_hdr_t;
156 
157 typedef struct {
158  virtio_net_hdr_t hdr;
159  u16 num_buffers;
160 } __attribute ((packed)) virtio_net_hdr_mrg_rxbuf_t;
161 
162 typedef struct vhost_user_msg {
166  union {
172  };
173 } __attribute ((packed)) vhost_user_msg_t;
174 
175 typedef struct {
179  vring_desc_t *desc;
180  vring_avail_t *avail;
181  vring_used_t *used;
183  int callfd;
184  int kickfd;
185  int errfd;
192 
193 typedef struct {
194  CLIB_CACHE_LINE_ALIGN_MARK(cacheline0);
195  volatile u32 * lockp;
201  char sock_filename[256];
204  u32 hw_if_index, sw_if_index;
206 
213  void * region_mmap_addr[VHOST_MEMORY_MAX_NREGIONS];
219 
223 
224 typedef struct {
237 
238 typedef struct {
239  u8 if_name[64];
244  u8 sock_filename[256];
248 
250  vhost_user_intf_details_t **out_vuids);
251 
252 // CLI commands to be used from dpdk
253 clib_error_t *
255  unformat_input_t * input,
256  vlib_cli_command_t * cmd);
257 clib_error_t *
259  unformat_input_t * input,
260  vlib_cli_command_t * cmd);
261 clib_error_t *
263  unformat_input_t * input,
264  vlib_cli_command_t * cmd);
265 
266 #endif
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
Definition: cache.h:68
vring_desc_t * desc
Definition: vhost-user.h:179
vhost_user_log_t log
Definition: vhost-user.h:171
virtio_net_feature_t
Definition: vhost-user.h:57
clib_error_t * vhost_user_connect_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: vhost-user.c:1746
unsigned int uint32_t
Definition: fix_types.h:29
uword * vhost_user_interface_index_by_sock_fd
Definition: vhost-user.h:230
enum vhost_user_req vhost_user_req_t
vring_avail_t * avail
Definition: vhost-user.h:180
vhost_vring_state_t state
Definition: vhost-user.h:168
struct vhost_user_memory_region vhost_user_memory_region_t
vring_used_t * used
Definition: vhost-user.h:181
clib_error_t * show_vhost_user_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: vhost-user.c:1871
vhost_user_req
Definition: vhost-user.h:100
struct vhost_user_log vhost_user_log_t
void * log_base_addr
Definition: vhost-user.h:220
unsigned long u64
Definition: types.h:89
unsigned int num
Definition: vhost-user.h:87
#define VHOST_VRING_MAX_SIZE
Definition: vhost-user.h:21
#define foreach_virtio_net_feature
Definition: vhost-user.h:49
struct vhost_user_memory vhost_user_memory_t
unsigned short int uint16_t
Definition: fix_types.h:28
vhost_vring_addr_t addr
Definition: vhost-user.h:169
int vhost_user_modify_if(vnet_main_t *vnm, vlib_main_t *vm, const char *sock_filename, u8 is_server, u32 sw_if_index, u64 feature_mask, u8 renumber, u32 custom_dev_instance)
Definition: vhost-user.c:1700
u32 * show_dev_instance_by_real_dev_instance
Definition: vhost-user.h:232
vhost_user_intf_t * vhost_user_interfaces
Definition: vhost-user.h:227
int vhost_user_create_if(vnet_main_t *vnm, vlib_main_t *vm, const char *sock_filename, u8 is_server, u32 *sw_if_index, u64 feature_mask, u8 renumber, u32 custom_dev_instance, u8 *hwaddr)
Definition: vhost-user.c:1654
#define VHOST_MEMORY_MAX_NREGIONS
Definition: vhost-user.h:19
u32 * vhost_user_inactive_interfaces_index
Definition: vhost-user.h:228
clib_error_t * vhost_user_delete_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: vhost-user.c:1794
int vhost_user_delete_if(vnet_main_t *vnm, vlib_main_t *vm, u32 sw_if_index)
Definition: vhost-user.c:1449
unsigned int u32
Definition: types.h:88
u64 uword
Definition: types.h:112
volatile u32 * lockp
Definition: vhost-user.h:195
unsigned short u16
Definition: types.h:57
double f64
Definition: types.h:140
unsigned char u8
Definition: types.h:56
uword * vhost_user_interface_index_by_listener_fd
Definition: vhost-user.h:229
vhost_vring_addr_t addr
Definition: vhost-user.h:78
struct _unformat_input_t unformat_input_t
int vhost_user_dump_ifs(vnet_main_t *vnm, vlib_main_t *vm, vhost_user_intf_details_t **out_vuids)
Definition: vhost-user.c:1821
u32 flags
Definition: vhost-user.h:73
unsigned int index
Definition: vhost-user.h:91
uword * vhost_user_interface_index_by_sw_if_index
Definition: vhost-user.h:231
vhost_user_memory_t memory
Definition: vhost-user.h:170
vhost_user_req_t request
Definition: vhost-user.h:163
int dont_dump_vhost_user_memory
Definition: vhost-user.h:235