1
2
3
4 #ifndef __VHOST_USER_H__
5 #define __VHOST_USER_H__
6
7
8 #define VHOST_USER_FLAG_REPLY BIT(2)
9 #define VHOST_USER_FLAG_NEED_REPLY BIT(3)
10
11 #define VHOST_USER_F_PROTOCOL_FEATURES 30
12
13 #define VHOST_USER_PROTOCOL_F_REPLY_ACK 3
14 #define VHOST_USER_PROTOCOL_F_SLAVE_REQ 5
15 #define VHOST_USER_PROTOCOL_F_CONFIG 9
16
17 #define VHOST_USER_VRING_INDEX_MASK 0xff
18 #define VHOST_USER_VRING_POLL_MASK BIT(8)
19
20
21 #define VHOST_USER_VERSION 1
22
23 #define VHOST_USER_SUPPORTED_F BIT_ULL(VHOST_USER_F_PROTOCOL_FEATURES)
24
25 #define VHOST_USER_SUPPORTED_PROTOCOL_F (BIT_ULL(VHOST_USER_PROTOCOL_F_REPLY_ACK) | \
26 BIT_ULL(VHOST_USER_PROTOCOL_F_SLAVE_REQ) | \
27 BIT_ULL(VHOST_USER_PROTOCOL_F_CONFIG))
28
29 enum vhost_user_request {
30 VHOST_USER_GET_FEATURES = 1,
31 VHOST_USER_SET_FEATURES = 2,
32 VHOST_USER_SET_OWNER = 3,
33 VHOST_USER_RESET_OWNER = 4,
34 VHOST_USER_SET_MEM_TABLE = 5,
35 VHOST_USER_SET_LOG_BASE = 6,
36 VHOST_USER_SET_LOG_FD = 7,
37 VHOST_USER_SET_VRING_NUM = 8,
38 VHOST_USER_SET_VRING_ADDR = 9,
39 VHOST_USER_SET_VRING_BASE = 10,
40 VHOST_USER_GET_VRING_BASE = 11,
41 VHOST_USER_SET_VRING_KICK = 12,
42 VHOST_USER_SET_VRING_CALL = 13,
43 VHOST_USER_SET_VRING_ERR = 14,
44 VHOST_USER_GET_PROTOCOL_FEATURES = 15,
45 VHOST_USER_SET_PROTOCOL_FEATURES = 16,
46 VHOST_USER_GET_QUEUE_NUM = 17,
47 VHOST_USER_SET_VRING_ENABLE = 18,
48 VHOST_USER_SEND_RARP = 19,
49 VHOST_USER_NET_SEND_MTU = 20,
50 VHOST_USER_SET_SLAVE_REQ_FD = 21,
51 VHOST_USER_IOTLB_MSG = 22,
52 VHOST_USER_SET_VRING_ENDIAN = 23,
53 VHOST_USER_GET_CONFIG = 24,
54 VHOST_USER_SET_CONFIG = 25,
55 };
56
57 enum vhost_user_slave_request {
58 VHOST_USER_SLAVE_IOTLB_MSG = 1,
59 VHOST_USER_SLAVE_CONFIG_CHANGE_MSG = 2,
60 VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG = 3,
61 };
62
63 struct vhost_user_header {
64
65
66
67
68 u32 request;
69 u32 flags;
70 u32 size;
71 } __packed;
72
73 struct vhost_user_config {
74 u32 offset;
75 u32 size;
76 u32 flags;
77 u8 payload[0];
78 } __packed;
79
80 struct vhost_user_vring_state {
81 u32 index;
82 u32 num;
83 } __packed;
84
85 struct vhost_user_vring_addr {
86 u32 index;
87 u32 flags;
88 u64 desc, used, avail, log;
89 } __packed;
90
91 struct vhost_user_mem_region {
92 u64 guest_addr;
93 u64 size;
94 u64 user_addr;
95 u64 mmap_offset;
96 } __packed;
97
98 struct vhost_user_mem_regions {
99 u32 num;
100 u32 padding;
101 struct vhost_user_mem_region regions[2];
102 } __packed;
103
104 union vhost_user_payload {
105 u64 integer;
106 struct vhost_user_config config;
107 struct vhost_user_vring_state vring_state;
108 struct vhost_user_vring_addr vring_addr;
109 struct vhost_user_mem_regions mem_regions;
110 };
111
112 struct vhost_user_msg {
113 struct vhost_user_header header;
114 union vhost_user_payload payload;
115 } __packed;
116
117 #endif