aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/vhost/virtio_std.h
blob: fa826933a9c6c6a6e55bb710deb25ecd3b29f2a6 (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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
/*
 * Copyright (c) 2015 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef __VIRTIO_STD_H__
#define __VIRTIO_STD_H__

#define foreach_virtio_net_features                                           \
  _ (VIRTIO_NET_F_CSUM, 0)	 /* Host handles pkts w/ partial csum */      \
  _ (VIRTIO_NET_F_GUEST_CSUM, 1) /* Guest handles pkts w/ partial csum */     \
  _ (VIRTIO_NET_F_CTRL_GUEST_OFFLOADS,                                        \
     2)				     /* Dynamic offload configuration. */     \
  _ (VIRTIO_NET_F_MTU, 3)	     /* Initial MTU advice. */                \
  _ (VIRTIO_NET_F_MAC, 5)	     /* Host has given MAC address. */        \
  _ (VIRTIO_NET_F_GSO, 6)	     /* Host handles pkts w/ any GSO. */      \
  _ (VIRTIO_NET_F_GUEST_TSO4, 7)     /* Guest can handle TSOv4 in. */         \
  _ (VIRTIO_NET_F_GUEST_TSO6, 8)     /* Guest can handle TSOv6 in. */         \
  _ (VIRTIO_NET_F_GUEST_ECN, 9)	     /* Guest can handle TSO[6] w/ ECN in. */ \
  _ (VIRTIO_NET_F_GUEST_UFO, 10)     /* Guest can handle UFO in. */           \
  _ (VIRTIO_NET_F_HOST_TSO4, 11)     /* Host can handle TSOv4 in. */          \
  _ (VIRTIO_NET_F_HOST_TSO6, 12)     /* Host can handle TSOv6 in. */          \
  _ (VIRTIO_NET_F_HOST_ECN, 13)	     /* Host can handle TSO[6] w/ ECN in. */  \
  _ (VIRTIO_NET_F_HOST_UFO, 14)	     /* Host can handle UFO in. */            \
  _ (VIRTIO_NET_F_MRG_RXBUF, 15)     /* Host can merge receive buffers. */    \
  _ (VIRTIO_NET_F_STATUS, 16)	     /* virtio_net_config.status available */ \
  _ (VIRTIO_NET_F_CTRL_VQ, 17)	     /* Control channel available */          \
  _ (VIRTIO_NET_F_CTRL_RX, 18)	     /* Control channel RX mode support */    \
  _ (VIRTIO_NET_F_CTRL_VLAN, 19)     /* Control channel VLAN filtering */     \
  _ (VIRTIO_NET_F_CTRL_RX_EXTRA, 20) /* Extra RX mode control support */      \
  _ (VIRTIO_NET_F_GUEST_ANNOUNCE,                                             \
     21)		  /* Guest can announce device on the network */      \
  _ (VIRTIO_NET_F_MQ, 22) /* Device supports Receive Flow Steering */         \
  _ (VIRTIO_NET_F_CTRL_MAC_ADDR, 23) /* Set MAC address */                    \
  _ (VIRTIO_F_NOTIFY_ON_EMPTY, 24)                                            \
  _ (VHOST_F_LOG_ALL, 26) /* Log all write descriptors */                     \
  _ (VIRTIO_F_ANY_LAYOUT,                                                     \
     27) /* Can the device handle any descriptor layout */                    \
  _ (VIRTIO_RING_F_INDIRECT_DESC,                                             \
     28) /* Support indirect buffer descriptors */                            \
  _ (VIRTIO_RING_F_EVENT_IDX,                                                 \
     29) /* The Guest publishes the used index for which it expects an        \
	  * interrupt at the end of the avail ring. Host should ignore the    \
	  * avail->flags field. */                                            \
  /* The Host publishes the avail index for which it expects a kick           \
   * at the end of the used ring. Guest should ignore the used->flags field.  \
   */                                                                         \
  _ (VHOST_USER_F_PROTOCOL_FEATURES, 30)                                      \
  _ (VIRTIO_F_VERSION_1, 32) /* v1.0 compliant. */                            \
  _ (VIRTIO_F_IOMMU_PLATFORM, 33)                                             \
  _ (VIRTIO_F_RING_PACKED, 34)                                                \
  _ (VIRTIO_F_IN_ORDER, 35) /* all buffers are used by the device in the */   \
  /* same order in which they have been made available */                     \
  _ (VIRTIO_F_ORDER_PLATFORM, 36) /* memory accesses by the driver and the */ \
  /* device are ordered in a way described by the platfor */                  \
  _ (VIRTIO_F_NOTIFICATION_DATA,                                              \
     38) /* the driver passes extra data (besides */                          \
  /* identifying the virtqueue) in its device notifications. */               \
  _ (VIRTIO_NET_F_SPEED_DUPLEX, 63) /* Device set linkspeed and duplex */

typedef enum
{
#define _(f, n) f = n,
  foreach_virtio_net_features
#undef _
} vnet_virtio_net_feature_t;

#define VIRTIO_FEATURE(X) (1ULL << X)

#define VRING_MAX_SIZE 32768

#define VRING_DESC_F_NEXT     1
#define VRING_DESC_F_WRITE    2
#define VRING_DESC_F_INDIRECT 4

#define VRING_DESC_F_AVAIL (1 << 7)
#define VRING_DESC_F_USED  (1 << 15)

#define foreach_virtio_event_idx_flags                                        \
  _ (VRING_EVENT_F_ENABLE, 0)                                                 \
  _ (VRING_EVENT_F_DISABLE, 1)                                                \
  _ (VRING_EVENT_F_DESC, 2)

typedef enum
{
#define _(f, n) f = n,
  foreach_virtio_event_idx_flags
#undef _
} vnet_virtio_event_idx_flags_t;

#define VRING_USED_F_NO_NOTIFY	   1
#define VRING_AVAIL_F_NO_INTERRUPT 1

typedef struct
{
  u64 addr;
  u32 len;
  u16 flags;
  u16 next;
} vnet_virtio_vring_desc_t;

typedef struct
{
  u16 flags;
  u16 idx;
  u16 ring[0];
  /*  u16 used_event; */
} vnet_virtio_vring_avail_t;

typedef struct
{
  u32 id;
  u32 len;
} vnet_virtio_vring_used_elem_t;

typedef struct
{
  u16 flags;
  u16 idx;
  vnet_virtio_vring_used_elem_t ring[0];
  /* u16 avail_event; */
} vnet_virtio_vring_used_t;

typedef CLIB_PACKED (struct {
  u64 addr;  // packet data buffer address
  u32 len;   // packet data buffer size
  u16 id;    // buffer id
  u16 flags; // flags
}) vnet_virtio_vring_packed_desc_t;

STATIC_ASSERT_SIZEOF (vnet_virtio_vring_packed_desc_t, 16);

typedef CLIB_PACKED (struct {
  u16 off_wrap;
  u16 flags;
}) vnet_virtio_vring_desc_event_t;

#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 /* Use csum_start, csum_offset */
#define VIRTIO_NET_HDR_F_DATA_VALID 2 /* Csum is valid */

#define VIRTIO_NET_HDR_GSO_NONE	 0    /* Not a GSO frame */
#define VIRTIO_NET_HDR_GSO_TCPV4 1    /* GSO frame, IPv4 TCP (TSO) */
#define VIRTIO_NET_HDR_GSO_UDP	 3    /* GSO frame, IPv4 UDP (UFO) */
#define VIRTIO_NET_HDR_GSO_TCPV6 4    /* GSO frame, IPv6 TCP */
#define VIRTIO_NET_HDR_GSO_ECN	 0x80 /* TCP has ECN set */

typedef CLIB_PACKED (struct {
  u8 flags;
  u8 gso_type;
  u16 hdr_len;	   /* Ethernet + IP + tcp/udp hdrs */
  u16 gso_size;	   /* Bytes to append to hdr_len per frame */
  u16 csum_start;  /* Position to start checksumming from */
  u16 csum_offset; /* Offset after that to place checksum */
  u16 num_buffers; /* Number of merged rx buffers */
}) vnet_virtio_net_hdr_v1_t;

typedef CLIB_PACKED (struct {
  u8 flags;
  u8 gso_type;
  u16 hdr_len;
  u16 gso_size;
  u16 csum_start;
  u16 csum_offset;
}) vnet_virtio_net_hdr_t;

typedef CLIB_PACKED (struct {
  vnet_virtio_net_hdr_t hdr;
  u16 num_buffers;
}) vnet_virtio_net_hdr_mrg_rxbuf_t;

#endif

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */