1
2
3
4
5#ifndef _MEMIF_H_
6#define _MEMIF_H_
7
8#define MEMIF_COOKIE 0x3E31F20
9#define MEMIF_VERSION_MAJOR 2
10#define MEMIF_VERSION_MINOR 0
11#define MEMIF_VERSION ((MEMIF_VERSION_MAJOR << 8) | MEMIF_VERSION_MINOR)
12#define MEMIF_NAME_SZ 32
13
14
15
16
17
18
19
20
21
22
23typedef enum memif_msg_type {
24 MEMIF_MSG_TYPE_NONE,
25 MEMIF_MSG_TYPE_ACK,
26 MEMIF_MSG_TYPE_HELLO,
27 MEMIF_MSG_TYPE_INIT,
28 MEMIF_MSG_TYPE_ADD_REGION,
29 MEMIF_MSG_TYPE_ADD_RING,
30 MEMIF_MSG_TYPE_CONNECT,
31 MEMIF_MSG_TYPE_CONNECTED,
32 MEMIF_MSG_TYPE_DISCONNECT,
33} memif_msg_type_t;
34
35typedef enum {
36 MEMIF_RING_C2S,
37 MEMIF_RING_S2C,
38} memif_ring_type_t;
39
40typedef enum {
41 MEMIF_INTERFACE_MODE_ETHERNET,
42 MEMIF_INTERFACE_MODE_IP,
43 MEMIF_INTERFACE_MODE_PUNT_INJECT,
44} memif_interface_mode_t;
45
46typedef uint16_t memif_region_index_t;
47typedef uint32_t memif_region_offset_t;
48typedef uint64_t memif_region_size_t;
49typedef uint16_t memif_ring_index_t;
50typedef uint32_t memif_interface_id_t;
51typedef uint16_t memif_version_t;
52typedef uint8_t memif_log2_ring_size_t;
53
54
55
56
57
58
59
60
61
62typedef struct __rte_packed {
63 uint8_t name[MEMIF_NAME_SZ];
64 memif_version_t min_version;
65 memif_version_t max_version;
66 memif_region_index_t max_region;
67 memif_ring_index_t max_s2c_ring;
68 memif_ring_index_t max_c2s_ring;
69 memif_log2_ring_size_t max_log2_ring_size;
70} memif_msg_hello_t;
71
72
73
74
75
76
77typedef struct __rte_packed {
78 memif_version_t version;
79 memif_interface_id_t id;
80 memif_interface_mode_t mode:8;
81 uint8_t secret[24];
82 uint8_t name[MEMIF_NAME_SZ];
83} memif_msg_init_t;
84
85
86
87
88
89
90typedef struct __rte_packed {
91 memif_region_index_t index;
92 memif_region_size_t size;
93} memif_msg_add_region_t;
94
95
96
97
98
99typedef struct __rte_packed {
100 uint16_t flags;
101#define MEMIF_MSG_ADD_RING_FLAG_C2S 1
102 memif_ring_index_t index;
103 memif_region_index_t region;
104 memif_region_offset_t offset;
105 memif_log2_ring_size_t log2_ring_size;
106 uint16_t private_hdr_size;
107} memif_msg_add_ring_t;
108
109
110
111
112
113typedef struct __rte_packed {
114 uint8_t if_name[MEMIF_NAME_SZ];
115} memif_msg_connect_t;
116
117
118
119
120
121typedef struct __rte_packed {
122 uint8_t if_name[MEMIF_NAME_SZ];
123} memif_msg_connected_t;
124
125
126
127
128
129typedef struct __rte_packed {
130 uint32_t code;
131 uint8_t string[96];
132} memif_msg_disconnect_t;
133
134typedef struct __rte_packed __rte_aligned(128)
135{
136 memif_msg_type_t type:16;
137 union {
138 memif_msg_hello_t hello;
139 memif_msg_init_t init;
140 memif_msg_add_region_t add_region;
141 memif_msg_add_ring_t add_ring;
142 memif_msg_connect_t connect;
143 memif_msg_connected_t connected;
144 memif_msg_disconnect_t disconnect;
145 };
146} memif_msg_t;
147
148
149
150
151
152
153
154
155typedef struct __rte_packed {
156 uint16_t flags;
157#define MEMIF_DESC_FLAG_NEXT 1
158 memif_region_index_t region;
159 uint32_t length;
160 memif_region_offset_t offset;
161 uint32_t metadata;
162} memif_desc_t;
163
164#define MEMIF_CACHELINE_ALIGN_MARK(mark) \
165 RTE_MARKER mark __rte_cache_aligned;
166
167typedef struct {
168 MEMIF_CACHELINE_ALIGN_MARK(cacheline0);
169 uint32_t cookie;
170 uint16_t flags;
171#define MEMIF_RING_FLAG_MASK_INT 1
172 uint16_t head;
173 MEMIF_CACHELINE_ALIGN_MARK(cacheline1);
174 uint16_t tail;
175 MEMIF_CACHELINE_ALIGN_MARK(cacheline2);
176 memif_desc_t desc[0];
177} memif_ring_t;
178
179#endif
180