Commit | Line | Data |
---|---|---|
678ece30 MR |
1 | #ifndef _UAPI_LINUX_VIRTIO_NET_H |
2 | #define _UAPI_LINUX_VIRTIO_NET_H | |
674bfc23 | 3 | /* This header is BSD licensed so anyone can use the definitions to implement |
a1b38387 RR |
4 | * compatible drivers/servers. |
5 | * | |
6 | * Redistribution and use in source and binary forms, with or without | |
7 | * modification, are permitted provided that the following conditions | |
8 | * are met: | |
9 | * 1. Redistributions of source code must retain the above copyright | |
10 | * notice, this list of conditions and the following disclaimer. | |
11 | * 2. Redistributions in binary form must reproduce the above copyright | |
12 | * notice, this list of conditions and the following disclaimer in the | |
13 | * documentation and/or other materials provided with the distribution. | |
14 | * 3. Neither the name of IBM nor the names of its contributors | |
15 | * may be used to endorse or promote products derived from this software | |
16 | * without specific prior written permission. | |
17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND | |
18 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
19 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
20 | * ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE | |
21 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
22 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
23 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
24 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
25 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
26 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
27 | * SUCH DAMAGE. */ | |
9a0e0ac2 | 28 | #include <linux/types.h> |
e95646c3 | 29 | #include <linux/virtio_ids.h> |
296f96fc | 30 | #include <linux/virtio_config.h> |
fdd819b2 | 31 | #include <linux/virtio_types.h> |
c047fcd2 | 32 | #include <linux/if_ether.h> |
296f96fc | 33 | |
a586d4f6 | 34 | /* The feature bitmap for virtio net */ |
5539ae96 RR |
35 | #define VIRTIO_NET_F_CSUM 0 /* Host handles pkts w/ partial csum */ |
36 | #define VIRTIO_NET_F_GUEST_CSUM 1 /* Guest handles pkts w/ partial csum */ | |
8b0a9d42 | 37 | #define VIRTIO_NET_F_CTRL_GUEST_OFFLOADS 2 /* Dynamic offload configuration. */ |
7d84e37e | 38 | #define VIRTIO_NET_F_MTU 3 /* Initial MTU advice */ |
34a48579 | 39 | #define VIRTIO_NET_F_MAC 5 /* Host has given MAC address. */ |
5539ae96 RR |
40 | #define VIRTIO_NET_F_GUEST_TSO4 7 /* Guest can handle TSOv4 in. */ |
41 | #define VIRTIO_NET_F_GUEST_TSO6 8 /* Guest can handle TSOv6 in. */ | |
42 | #define VIRTIO_NET_F_GUEST_ECN 9 /* Guest can handle TSO[6] w/ ECN in. */ | |
43 | #define VIRTIO_NET_F_GUEST_UFO 10 /* Guest can handle UFO in. */ | |
44 | #define VIRTIO_NET_F_HOST_TSO4 11 /* Host can handle TSOv4 in. */ | |
45 | #define VIRTIO_NET_F_HOST_TSO6 12 /* Host can handle TSOv6 in. */ | |
46 | #define VIRTIO_NET_F_HOST_ECN 13 /* Host can handle TSO[6] w/ ECN in. */ | |
47 | #define VIRTIO_NET_F_HOST_UFO 14 /* Host can handle UFO in. */ | |
3f2c31d9 | 48 | #define VIRTIO_NET_F_MRG_RXBUF 15 /* Host can merge receive buffers. */ |
9f4d26d0 | 49 | #define VIRTIO_NET_F_STATUS 16 /* virtio_net_config.status available */ |
2a41f71d | 50 | #define VIRTIO_NET_F_CTRL_VQ 17 /* Control channel available */ |
2af7698e | 51 | #define VIRTIO_NET_F_CTRL_RX 18 /* Control channel RX mode support */ |
0bde9569 | 52 | #define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */ |
e79f07e2 | 53 | #define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */ |
586d17c5 JW |
54 | #define VIRTIO_NET_F_GUEST_ANNOUNCE 21 /* Guest can announce device on the |
55 | * network */ | |
986a4f4d JW |
56 | #define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow |
57 | * Steering */ | |
7e58d5ae | 58 | #define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */ |
34cfe872 | 59 | #define VIRTIO_NET_F_DEVICE_STATS 50 /* Device can provide device-level statistics. */ |
394bd877 | 60 | #define VIRTIO_NET_F_VQ_NOTF_COAL 52 /* Device supports virtqueue notification coalescing */ |
fce1c23f | 61 | #define VIRTIO_NET_F_NOTF_COAL 53 /* Device supports notifications coalescing */ |
34061b34 AM |
62 | #define VIRTIO_NET_F_GUEST_USO4 54 /* Guest can handle USOv4 in. */ |
63 | #define VIRTIO_NET_F_GUEST_USO6 55 /* Guest can handle USOv6 in. */ | |
64 | #define VIRTIO_NET_F_HOST_USO 56 /* Host can handle USO in. */ | |
3024e209 | 65 | #define VIRTIO_NET_F_HASH_REPORT 57 /* Supports hash report */ |
be50da3e | 66 | #define VIRTIO_NET_F_GUEST_HDRLEN 59 /* Guest provides the exact hdr_len value. */ |
fd58bf67 | 67 | #define VIRTIO_NET_F_RSS 60 /* Supports RSS RX steering */ |
22b436c9 | 68 | #define VIRTIO_NET_F_RSC_EXT 61 /* extended coalescing info */ |
9805069d SS |
69 | #define VIRTIO_NET_F_STANDBY 62 /* Act as standby for another device |
70 | * with the same MAC. | |
71 | */ | |
faa9b39f JB |
72 | #define VIRTIO_NET_F_SPEED_DUPLEX 63 /* Device set linkspeed and duplex */ |
73 | ||
ed9ecb04 RR |
74 | #ifndef VIRTIO_NET_NO_LEGACY |
75 | #define VIRTIO_NET_F_GSO 6 /* Host handles pkts w/ any GSO type */ | |
76 | #endif /* VIRTIO_NET_NO_LEGACY */ | |
77 | ||
9f4d26d0 | 78 | #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */ |
586d17c5 | 79 | #define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */ |
296f96fc | 80 | |
fd58bf67 YB |
81 | /* supported/enabled hash types */ |
82 | #define VIRTIO_NET_RSS_HASH_TYPE_IPv4 (1 << 0) | |
83 | #define VIRTIO_NET_RSS_HASH_TYPE_TCPv4 (1 << 1) | |
84 | #define VIRTIO_NET_RSS_HASH_TYPE_UDPv4 (1 << 2) | |
85 | #define VIRTIO_NET_RSS_HASH_TYPE_IPv6 (1 << 3) | |
86 | #define VIRTIO_NET_RSS_HASH_TYPE_TCPv6 (1 << 4) | |
87 | #define VIRTIO_NET_RSS_HASH_TYPE_UDPv6 (1 << 5) | |
88 | #define VIRTIO_NET_RSS_HASH_TYPE_IP_EX (1 << 6) | |
89 | #define VIRTIO_NET_RSS_HASH_TYPE_TCP_EX (1 << 7) | |
90 | #define VIRTIO_NET_RSS_HASH_TYPE_UDP_EX (1 << 8) | |
91 | ||
1842f23c | 92 | struct virtio_net_config { |
a586d4f6 | 93 | /* The config defining mac address (if VIRTIO_NET_F_MAC) */ |
e216975a | 94 | __u8 mac[ETH_ALEN]; |
9f4d26d0 | 95 | /* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */ |
577e677a | 96 | __virtio16 status; |
986a4f4d JW |
97 | /* Maximum number of each of transmit and receive queues; |
98 | * see VIRTIO_NET_F_MQ and VIRTIO_NET_CTRL_MQ. | |
99 | * Legal values are between 1 and 0x8000 | |
100 | */ | |
577e677a | 101 | __virtio16 max_virtqueue_pairs; |
14de9d11 | 102 | /* Default maximum transmit unit advice */ |
577e677a | 103 | __virtio16 mtu; |
faa9b39f JB |
104 | /* |
105 | * speed, in units of 1Mb. All values 0 to INT_MAX are legal. | |
106 | * Any other value stands for unknown. | |
107 | */ | |
64ffa39d | 108 | __le32 speed; |
faa9b39f JB |
109 | /* |
110 | * 0x00 - half duplex | |
111 | * 0x01 - full duplex | |
112 | * Any other value stands for unknown. | |
113 | */ | |
114 | __u8 duplex; | |
fd58bf67 YB |
115 | /* maximum size of RSS key */ |
116 | __u8 rss_max_key_size; | |
117 | /* maximum number of indirection table entries */ | |
118 | __le16 rss_max_indirection_table_length; | |
119 | /* bitmask of supported VIRTIO_NET_RSS_HASH_ types */ | |
120 | __le32 supported_hash_types; | |
a586d4f6 | 121 | } __attribute__((packed)); |
296f96fc | 122 | |
ed9ecb04 RR |
123 | /* |
124 | * This header comes first in the scatter-gather list. If you don't | |
125 | * specify GSO or CSUM features, you can simply ignore the header. | |
126 | * | |
e68c48f9 RR |
127 | * This is bitwise-equivalent to the legacy struct virtio_net_hdr_mrg_rxbuf, |
128 | * only flattened. | |
ed9ecb04 RR |
129 | */ |
130 | struct virtio_net_hdr_v1 { | |
131 | #define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 /* Use csum_start, csum_offset */ | |
132 | #define VIRTIO_NET_HDR_F_DATA_VALID 2 /* Csum is valid */ | |
22b436c9 | 133 | #define VIRTIO_NET_HDR_F_RSC_INFO 4 /* rsc info in csum_ fields */ |
ed9ecb04 RR |
134 | __u8 flags; |
135 | #define VIRTIO_NET_HDR_GSO_NONE 0 /* Not a GSO frame */ | |
136 | #define VIRTIO_NET_HDR_GSO_TCPV4 1 /* GSO frame, IPv4 TCP (TSO) */ | |
137 | #define VIRTIO_NET_HDR_GSO_UDP 3 /* GSO frame, IPv4 UDP (UFO) */ | |
138 | #define VIRTIO_NET_HDR_GSO_TCPV6 4 /* GSO frame, IPv6 TCP */ | |
34061b34 | 139 | #define VIRTIO_NET_HDR_GSO_UDP_L4 5 /* GSO frame, IPv4& IPv6 UDP (USO) */ |
ed9ecb04 RR |
140 | #define VIRTIO_NET_HDR_GSO_ECN 0x80 /* TCP has ECN set */ |
141 | __u8 gso_type; | |
142 | __virtio16 hdr_len; /* Ethernet + IP + tcp/udp hdrs */ | |
143 | __virtio16 gso_size; /* Bytes to append to hdr_len per frame */ | |
22b436c9 YB |
144 | union { |
145 | struct { | |
146 | __virtio16 csum_start; | |
147 | __virtio16 csum_offset; | |
148 | }; | |
149 | /* Checksum calculation */ | |
150 | struct { | |
151 | /* Position to start checksumming from */ | |
152 | __virtio16 start; | |
153 | /* Offset after that to place checksum */ | |
154 | __virtio16 offset; | |
155 | } csum; | |
156 | /* Receive Segment Coalescing */ | |
157 | struct { | |
158 | /* Number of coalesced segments */ | |
159 | __le16 segments; | |
160 | /* Number of duplicated acks */ | |
161 | __le16 dup_acks; | |
162 | } rsc; | |
163 | }; | |
ed9ecb04 RR |
164 | __virtio16 num_buffers; /* Number of merged rx buffers */ |
165 | }; | |
e68c48f9 | 166 | |
3024e209 YB |
167 | struct virtio_net_hdr_v1_hash { |
168 | struct virtio_net_hdr_v1 hdr; | |
169 | __le32 hash_value; | |
170 | #define VIRTIO_NET_HASH_REPORT_NONE 0 | |
171 | #define VIRTIO_NET_HASH_REPORT_IPv4 1 | |
172 | #define VIRTIO_NET_HASH_REPORT_TCPv4 2 | |
173 | #define VIRTIO_NET_HASH_REPORT_UDPv4 3 | |
174 | #define VIRTIO_NET_HASH_REPORT_IPv6 4 | |
175 | #define VIRTIO_NET_HASH_REPORT_TCPv6 5 | |
176 | #define VIRTIO_NET_HASH_REPORT_UDPv6 6 | |
177 | #define VIRTIO_NET_HASH_REPORT_IPv6_EX 7 | |
178 | #define VIRTIO_NET_HASH_REPORT_TCPv6_EX 8 | |
179 | #define VIRTIO_NET_HASH_REPORT_UDPv6_EX 9 | |
180 | __le16 hash_report; | |
181 | __le16 padding; | |
182 | }; | |
183 | ||
e68c48f9 RR |
184 | #ifndef VIRTIO_NET_NO_LEGACY |
185 | /* This header comes first in the scatter-gather list. | |
186 | * For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated, it must | |
187 | * be the first element of the scatter-gather list. If you don't | |
188 | * specify GSO or CSUM features, you can simply ignore the header. */ | |
189 | struct virtio_net_hdr { | |
190 | /* See VIRTIO_NET_HDR_F_* */ | |
191 | __u8 flags; | |
192 | /* See VIRTIO_NET_HDR_GSO_* */ | |
193 | __u8 gso_type; | |
194 | __virtio16 hdr_len; /* Ethernet + IP + tcp/udp hdrs */ | |
195 | __virtio16 gso_size; /* Bytes to append to hdr_len per frame */ | |
196 | __virtio16 csum_start; /* Position to start checksumming from */ | |
197 | __virtio16 csum_offset; /* Offset after that to place checksum */ | |
198 | }; | |
199 | ||
200 | /* This is the version of the header to use when the MRG_RXBUF | |
201 | * feature has been negotiated. */ | |
202 | struct virtio_net_hdr_mrg_rxbuf { | |
203 | struct virtio_net_hdr hdr; | |
204 | __virtio16 num_buffers; /* Number of merged rx buffers */ | |
205 | }; | |
ed9ecb04 | 206 | #endif /* ...VIRTIO_NET_NO_LEGACY */ |
3f2c31d9 | 207 | |
2a41f71d AW |
208 | /* |
209 | * Control virtqueue data structures | |
210 | * | |
211 | * The control virtqueue expects a header in the first sg entry | |
212 | * and an ack/status response in the last entry. Data for the | |
213 | * command goes in between. | |
214 | */ | |
215 | struct virtio_net_ctrl_hdr { | |
216 | __u8 class; | |
217 | __u8 cmd; | |
218 | } __attribute__((packed)); | |
219 | ||
220 | typedef __u8 virtio_net_ctrl_ack; | |
221 | ||
222 | #define VIRTIO_NET_OK 0 | |
223 | #define VIRTIO_NET_ERR 1 | |
224 | ||
2af7698e | 225 | /* |
e79f07e2 AW |
226 | * Control the RX mode, ie. promisucous, allmulti, etc... |
227 | * All commands require an "out" sg entry containing a 1 byte | |
228 | * state value, zero = disable, non-zero = enable. Commands | |
229 | * 0 and 1 are supported with the VIRTIO_NET_F_CTRL_RX feature. | |
230 | * Commands 2-5 are added with VIRTIO_NET_F_CTRL_RX_EXTRA. | |
2af7698e AW |
231 | */ |
232 | #define VIRTIO_NET_CTRL_RX 0 | |
233 | #define VIRTIO_NET_CTRL_RX_PROMISC 0 | |
234 | #define VIRTIO_NET_CTRL_RX_ALLMULTI 1 | |
e79f07e2 AW |
235 | #define VIRTIO_NET_CTRL_RX_ALLUNI 2 |
236 | #define VIRTIO_NET_CTRL_RX_NOMULTI 3 | |
237 | #define VIRTIO_NET_CTRL_RX_NOUNI 4 | |
238 | #define VIRTIO_NET_CTRL_RX_NOBCAST 5 | |
2af7698e | 239 | |
f565a7c2 | 240 | /* |
7e58d5ae | 241 | * Control the MAC |
f565a7c2 AW |
242 | * |
243 | * The MAC filter table is managed by the hypervisor, the guest should | |
244 | * assume the size is infinite. Filtering should be considered | |
245 | * non-perfect, ie. based on hypervisor resources, the guest may | |
246 | * received packets from sources not specified in the filter list. | |
247 | * | |
248 | * In addition to the class/cmd header, the TABLE_SET command requires | |
249 | * two out scatterlists. Each contains a 4 byte count of entries followed | |
250 | * by a concatenated byte stream of the ETH_ALEN MAC addresses. The | |
251 | * first sg list contains unicast addresses, the second is for multicast. | |
252 | * This functionality is present if the VIRTIO_NET_F_CTRL_RX feature | |
253 | * is available. | |
7e58d5ae AK |
254 | * |
255 | * The ADDR_SET command requests one out scatterlist, it contains a | |
256 | * 6 bytes MAC address. This functionality is present if the | |
257 | * VIRTIO_NET_F_CTRL_MAC_ADDR feature is available. | |
f565a7c2 AW |
258 | */ |
259 | struct virtio_net_ctrl_mac { | |
fdd819b2 | 260 | __virtio32 entries; |
f565a7c2 AW |
261 | __u8 macs[][ETH_ALEN]; |
262 | } __attribute__((packed)); | |
263 | ||
264 | #define VIRTIO_NET_CTRL_MAC 1 | |
265 | #define VIRTIO_NET_CTRL_MAC_TABLE_SET 0 | |
7e58d5ae | 266 | #define VIRTIO_NET_CTRL_MAC_ADDR_SET 1 |
f565a7c2 | 267 | |
0bde9569 AW |
268 | /* |
269 | * Control VLAN filtering | |
270 | * | |
271 | * The VLAN filter table is controlled via a simple ADD/DEL interface. | |
272 | * VLAN IDs not added may be filterd by the hypervisor. Del is the | |
273 | * opposite of add. Both commands expect an out entry containing a 2 | |
274 | * byte VLAN ID. VLAN filterting is available with the | |
275 | * VIRTIO_NET_F_CTRL_VLAN feature bit. | |
276 | */ | |
277 | #define VIRTIO_NET_CTRL_VLAN 2 | |
278 | #define VIRTIO_NET_CTRL_VLAN_ADD 0 | |
279 | #define VIRTIO_NET_CTRL_VLAN_DEL 1 | |
280 | ||
586d17c5 JW |
281 | /* |
282 | * Control link announce acknowledgement | |
283 | * | |
284 | * The command VIRTIO_NET_CTRL_ANNOUNCE_ACK is used to indicate that | |
285 | * driver has recevied the notification; device would clear the | |
286 | * VIRTIO_NET_S_ANNOUNCE bit in the status field after it receives | |
287 | * this command. | |
288 | */ | |
289 | #define VIRTIO_NET_CTRL_ANNOUNCE 3 | |
290 | #define VIRTIO_NET_CTRL_ANNOUNCE_ACK 0 | |
291 | ||
986a4f4d JW |
292 | /* |
293 | * Control Receive Flow Steering | |
fd58bf67 YB |
294 | */ |
295 | #define VIRTIO_NET_CTRL_MQ 4 | |
296 | /* | |
986a4f4d JW |
297 | * The command VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET |
298 | * enables Receive Flow Steering, specifying the number of the transmit and | |
299 | * receive queues that will be used. After the command is consumed and acked by | |
300 | * the device, the device will not steer new packets on receive virtqueues | |
301 | * other than specified nor read from transmit virtqueues other than specified. | |
302 | * Accordingly, driver should not transmit new packets on virtqueues other than | |
303 | * specified. | |
304 | */ | |
305 | struct virtio_net_ctrl_mq { | |
fdd819b2 | 306 | __virtio16 virtqueue_pairs; |
986a4f4d JW |
307 | }; |
308 | ||
986a4f4d JW |
309 | #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET 0 |
310 | #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN 1 | |
311 | #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX 0x8000 | |
312 | ||
fd58bf67 YB |
313 | /* |
314 | * The command VIRTIO_NET_CTRL_MQ_RSS_CONFIG has the same effect as | |
315 | * VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET does and additionally configures | |
316 | * the receive steering to use a hash calculated for incoming packet | |
317 | * to decide on receive virtqueue to place the packet. The command | |
318 | * also provides parameters to calculate a hash and receive virtqueue. | |
319 | */ | |
320 | struct virtio_net_rss_config { | |
321 | __le32 hash_types; | |
322 | __le16 indirection_table_mask; | |
323 | __le16 unclassified_queue; | |
324 | __le16 indirection_table[1/* + indirection_table_mask */]; | |
325 | __le16 max_tx_vq; | |
326 | __u8 hash_key_length; | |
327 | __u8 hash_key_data[/* hash_key_length */]; | |
328 | }; | |
329 | ||
330 | #define VIRTIO_NET_CTRL_MQ_RSS_CONFIG 1 | |
331 | ||
3024e209 YB |
332 | /* |
333 | * The command VIRTIO_NET_CTRL_MQ_HASH_CONFIG requests the device | |
334 | * to include in the virtio header of the packet the value of the | |
335 | * calculated hash and the report type of hash. It also provides | |
336 | * parameters for hash calculation. The command requires feature | |
337 | * VIRTIO_NET_F_HASH_REPORT to be negotiated to extend the | |
338 | * layout of virtio header as defined in virtio_net_hdr_v1_hash. | |
339 | */ | |
340 | struct virtio_net_hash_config { | |
341 | __le32 hash_types; | |
342 | /* for compatibility with virtio_net_rss_config */ | |
343 | __le16 reserved[4]; | |
344 | __u8 hash_key_length; | |
345 | __u8 hash_key_data[/* hash_key_length */]; | |
346 | }; | |
347 | ||
348 | #define VIRTIO_NET_CTRL_MQ_HASH_CONFIG 2 | |
349 | ||
8b0a9d42 MT |
350 | /* |
351 | * Control network offloads | |
352 | * | |
353 | * Reconfigures the network offloads that Guest can handle. | |
354 | * | |
355 | * Available with the VIRTIO_NET_F_CTRL_GUEST_OFFLOADS feature bit. | |
356 | * | |
357 | * Command data format matches the feature bit mask exactly. | |
358 | * | |
359 | * See VIRTIO_NET_F_GUEST_* for the list of offloads | |
360 | * that can be enabled/disabled. | |
361 | */ | |
362 | #define VIRTIO_NET_CTRL_GUEST_OFFLOADS 5 | |
363 | #define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET 0 | |
364 | ||
699b045a AK |
365 | /* |
366 | * Control notifications coalescing. | |
367 | * | |
368 | * Request the device to change the notifications coalescing parameters. | |
369 | * | |
370 | * Available with the VIRTIO_NET_F_NOTF_COAL feature bit. | |
371 | */ | |
372 | #define VIRTIO_NET_CTRL_NOTF_COAL 6 | |
373 | /* | |
fce1c23f | 374 | * Set the tx-usecs/tx-max-packets parameters. |
699b045a AK |
375 | */ |
376 | struct virtio_net_ctrl_coal_tx { | |
fce1c23f | 377 | /* Maximum number of packets to send before a TX notification */ |
699b045a | 378 | __le32 tx_max_packets; |
fce1c23f | 379 | /* Maximum number of usecs to delay a TX notification */ |
699b045a AK |
380 | __le32 tx_usecs; |
381 | }; | |
382 | ||
383 | #define VIRTIO_NET_CTRL_NOTF_COAL_TX_SET 0 | |
384 | ||
385 | /* | |
fce1c23f | 386 | * Set the rx-usecs/rx-max-packets parameters. |
699b045a AK |
387 | */ |
388 | struct virtio_net_ctrl_coal_rx { | |
fce1c23f | 389 | /* Maximum number of packets to receive before a RX notification */ |
699b045a | 390 | __le32 rx_max_packets; |
fce1c23f | 391 | /* Maximum number of usecs to delay a RX notification */ |
699b045a AK |
392 | __le32 rx_usecs; |
393 | }; | |
394 | ||
395 | #define VIRTIO_NET_CTRL_NOTF_COAL_RX_SET 1 | |
394bd877 GL |
396 | #define VIRTIO_NET_CTRL_NOTF_COAL_VQ_SET 2 |
397 | #define VIRTIO_NET_CTRL_NOTF_COAL_VQ_GET 3 | |
398 | ||
399 | struct virtio_net_ctrl_coal { | |
400 | __le32 max_packets; | |
401 | __le32 max_usecs; | |
402 | }; | |
403 | ||
404 | struct virtio_net_ctrl_coal_vq { | |
405 | __le16 vqn; | |
406 | __le16 reserved; | |
407 | struct virtio_net_ctrl_coal coal; | |
408 | }; | |
699b045a | 409 | |
34cfe872 XZ |
410 | /* |
411 | * Device Statistics | |
412 | */ | |
413 | #define VIRTIO_NET_CTRL_STATS 8 | |
414 | #define VIRTIO_NET_CTRL_STATS_QUERY 0 | |
415 | #define VIRTIO_NET_CTRL_STATS_GET 1 | |
416 | ||
417 | struct virtio_net_stats_capabilities { | |
418 | ||
419 | #define VIRTIO_NET_STATS_TYPE_CVQ (1ULL << 32) | |
420 | ||
421 | #define VIRTIO_NET_STATS_TYPE_RX_BASIC (1ULL << 0) | |
422 | #define VIRTIO_NET_STATS_TYPE_RX_CSUM (1ULL << 1) | |
423 | #define VIRTIO_NET_STATS_TYPE_RX_GSO (1ULL << 2) | |
424 | #define VIRTIO_NET_STATS_TYPE_RX_SPEED (1ULL << 3) | |
425 | ||
426 | #define VIRTIO_NET_STATS_TYPE_TX_BASIC (1ULL << 16) | |
427 | #define VIRTIO_NET_STATS_TYPE_TX_CSUM (1ULL << 17) | |
428 | #define VIRTIO_NET_STATS_TYPE_TX_GSO (1ULL << 18) | |
429 | #define VIRTIO_NET_STATS_TYPE_TX_SPEED (1ULL << 19) | |
430 | ||
431 | __le64 supported_stats_types[1]; | |
432 | }; | |
433 | ||
434 | struct virtio_net_ctrl_queue_stats { | |
435 | struct { | |
436 | __le16 vq_index; | |
437 | __le16 reserved[3]; | |
438 | __le64 types_bitmap[1]; | |
439 | } stats[1]; | |
440 | }; | |
441 | ||
442 | struct virtio_net_stats_reply_hdr { | |
443 | #define VIRTIO_NET_STATS_TYPE_REPLY_CVQ 32 | |
444 | ||
445 | #define VIRTIO_NET_STATS_TYPE_REPLY_RX_BASIC 0 | |
446 | #define VIRTIO_NET_STATS_TYPE_REPLY_RX_CSUM 1 | |
447 | #define VIRTIO_NET_STATS_TYPE_REPLY_RX_GSO 2 | |
448 | #define VIRTIO_NET_STATS_TYPE_REPLY_RX_SPEED 3 | |
449 | ||
450 | #define VIRTIO_NET_STATS_TYPE_REPLY_TX_BASIC 16 | |
451 | #define VIRTIO_NET_STATS_TYPE_REPLY_TX_CSUM 17 | |
452 | #define VIRTIO_NET_STATS_TYPE_REPLY_TX_GSO 18 | |
453 | #define VIRTIO_NET_STATS_TYPE_REPLY_TX_SPEED 19 | |
454 | __u8 type; | |
455 | __u8 reserved; | |
456 | __le16 vq_index; | |
457 | __le16 reserved1; | |
458 | __le16 size; | |
459 | }; | |
460 | ||
461 | struct virtio_net_stats_cvq { | |
462 | struct virtio_net_stats_reply_hdr hdr; | |
463 | ||
464 | __le64 command_num; | |
465 | __le64 ok_num; | |
466 | }; | |
467 | ||
468 | struct virtio_net_stats_rx_basic { | |
469 | struct virtio_net_stats_reply_hdr hdr; | |
470 | ||
471 | __le64 rx_notifications; | |
472 | ||
473 | __le64 rx_packets; | |
474 | __le64 rx_bytes; | |
475 | ||
476 | __le64 rx_interrupts; | |
477 | ||
478 | __le64 rx_drops; | |
479 | __le64 rx_drop_overruns; | |
480 | }; | |
481 | ||
482 | struct virtio_net_stats_tx_basic { | |
483 | struct virtio_net_stats_reply_hdr hdr; | |
484 | ||
485 | __le64 tx_notifications; | |
486 | ||
487 | __le64 tx_packets; | |
488 | __le64 tx_bytes; | |
489 | ||
490 | __le64 tx_interrupts; | |
491 | ||
492 | __le64 tx_drops; | |
493 | __le64 tx_drop_malformed; | |
494 | }; | |
495 | ||
496 | struct virtio_net_stats_rx_csum { | |
497 | struct virtio_net_stats_reply_hdr hdr; | |
498 | ||
499 | __le64 rx_csum_valid; | |
500 | __le64 rx_needs_csum; | |
501 | __le64 rx_csum_none; | |
502 | __le64 rx_csum_bad; | |
503 | }; | |
504 | ||
505 | struct virtio_net_stats_tx_csum { | |
506 | struct virtio_net_stats_reply_hdr hdr; | |
507 | ||
508 | __le64 tx_csum_none; | |
509 | __le64 tx_needs_csum; | |
510 | }; | |
511 | ||
512 | struct virtio_net_stats_rx_gso { | |
513 | struct virtio_net_stats_reply_hdr hdr; | |
514 | ||
515 | __le64 rx_gso_packets; | |
516 | __le64 rx_gso_bytes; | |
517 | __le64 rx_gso_packets_coalesced; | |
518 | __le64 rx_gso_bytes_coalesced; | |
519 | }; | |
520 | ||
521 | struct virtio_net_stats_tx_gso { | |
522 | struct virtio_net_stats_reply_hdr hdr; | |
523 | ||
524 | __le64 tx_gso_packets; | |
525 | __le64 tx_gso_bytes; | |
526 | __le64 tx_gso_segments; | |
527 | __le64 tx_gso_segments_bytes; | |
528 | __le64 tx_gso_packets_noseg; | |
529 | __le64 tx_gso_bytes_noseg; | |
530 | }; | |
531 | ||
532 | struct virtio_net_stats_rx_speed { | |
533 | struct virtio_net_stats_reply_hdr hdr; | |
534 | ||
535 | /* rx_{packets,bytes}_allowance_exceeded are too long. So rename to | |
536 | * short name. | |
537 | */ | |
538 | __le64 rx_ratelimit_packets; | |
539 | __le64 rx_ratelimit_bytes; | |
540 | }; | |
541 | ||
542 | struct virtio_net_stats_tx_speed { | |
543 | struct virtio_net_stats_reply_hdr hdr; | |
544 | ||
545 | /* tx_{packets,bytes}_allowance_exceeded are too long. So rename to | |
546 | * short name. | |
547 | */ | |
548 | __le64 tx_ratelimit_packets; | |
549 | __le64 tx_ratelimit_bytes; | |
550 | }; | |
551 | ||
678ece30 | 552 | #endif /* _UAPI_LINUX_VIRTIO_NET_H */ |