1  #ifndef _UAPI_LINUX_VIRTIO_NET_H
2  #define _UAPI_LINUX_VIRTIO_NET_H
3  /* This header is BSD licensed so anyone can use the definitions to implement
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. */
28  #include <linux/types.h>
29  #include <linux/virtio_ids.h>
30  #include <linux/virtio_config.h>
31  #include <linux/virtio_types.h>
32  #include <linux/if_ether.h>
33  
34  /* The feature bitmap for virtio net */
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 */
37  #define VIRTIO_NET_F_CTRL_GUEST_OFFLOADS 2 /* Dynamic offload configuration. */
38  #define VIRTIO_NET_F_MTU	3	/* Initial MTU advice */
39  #define VIRTIO_NET_F_MAC	5	/* Host has given MAC address. */
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. */
48  #define VIRTIO_NET_F_MRG_RXBUF	15	/* Host can merge receive buffers. */
49  #define VIRTIO_NET_F_STATUS	16	/* virtio_net_config.status available */
50  #define VIRTIO_NET_F_CTRL_VQ	17	/* Control channel available */
51  #define VIRTIO_NET_F_CTRL_RX	18	/* Control channel RX mode support */
52  #define VIRTIO_NET_F_CTRL_VLAN	19	/* Control channel VLAN filtering */
53  #define VIRTIO_NET_F_CTRL_RX_EXTRA 20	/* Extra RX mode control support */
54  #define VIRTIO_NET_F_GUEST_ANNOUNCE 21	/* Guest can announce device on the
55  					 * network */
56  #define VIRTIO_NET_F_MQ	22	/* Device supports Receive Flow
57  					 * Steering */
58  #define VIRTIO_NET_F_CTRL_MAC_ADDR 23	/* Set MAC address */
59  #define VIRTIO_NET_F_DEVICE_STATS 50	/* Device can provide device-level statistics. */
60  #define VIRTIO_NET_F_VQ_NOTF_COAL 52	/* Device supports virtqueue notification coalescing */
61  #define VIRTIO_NET_F_NOTF_COAL	53	/* Device supports notifications coalescing */
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. */
65  #define VIRTIO_NET_F_HASH_REPORT  57	/* Supports hash report */
66  #define VIRTIO_NET_F_GUEST_HDRLEN  59	/* Guest provides the exact hdr_len value. */
67  #define VIRTIO_NET_F_RSS	  60	/* Supports RSS RX steering */
68  #define VIRTIO_NET_F_RSC_EXT	  61	/* extended coalescing info */
69  #define VIRTIO_NET_F_STANDBY	  62	/* Act as standby for another device
70  					 * with the same MAC.
71  					 */
72  #define VIRTIO_NET_F_SPEED_DUPLEX 63	/* Device set linkspeed and duplex */
73  
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  
78  #define VIRTIO_NET_S_LINK_UP	1	/* Link is up */
79  #define VIRTIO_NET_S_ANNOUNCE	2	/* Announcement is needed */
80  
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  
92  struct virtio_net_config {
93  	/* The config defining mac address (if VIRTIO_NET_F_MAC) */
94  	__u8 mac[ETH_ALEN];
95  	/* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */
96  	__virtio16 status;
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  	 */
101  	__virtio16 max_virtqueue_pairs;
102  	/* Default maximum transmit unit advice */
103  	__virtio16 mtu;
104  	/*
105  	 * speed, in units of 1Mb. All values 0 to INT_MAX are legal.
106  	 * Any other value stands for unknown.
107  	 */
108  	__le32 speed;
109  	/*
110  	 * 0x00 - half duplex
111  	 * 0x01 - full duplex
112  	 * Any other value stands for unknown.
113  	 */
114  	__u8 duplex;
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;
121  } __attribute__((packed));
122  
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   *
127   * This is bitwise-equivalent to the legacy struct virtio_net_hdr_mrg_rxbuf,
128   * only flattened.
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 */
133  #define VIRTIO_NET_HDR_F_RSC_INFO	4	/* rsc info in csum_ fields */
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 */
139  #define VIRTIO_NET_HDR_GSO_UDP_L4	5	/* GSO frame, IPv4& IPv6 UDP (USO) */
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 */
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  	};
164  	__virtio16 num_buffers;	/* Number of merged rx buffers */
165  };
166  
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  
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  };
206  #endif /* ...VIRTIO_NET_NO_LEGACY */
207  
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  
225  /*
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.
231   */
232  #define VIRTIO_NET_CTRL_RX    0
233   #define VIRTIO_NET_CTRL_RX_PROMISC      0
234   #define VIRTIO_NET_CTRL_RX_ALLMULTI     1
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
239  
240  /*
241   * Control the MAC
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.
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.
258   */
259  struct virtio_net_ctrl_mac {
260  	__virtio32 entries;
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
266   #define VIRTIO_NET_CTRL_MAC_ADDR_SET         1
267  
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  
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  
292  /*
293   * Control Receive Flow Steering
294   */
295  #define VIRTIO_NET_CTRL_MQ   4
296  /*
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 {
306  	__virtio16 virtqueue_pairs;
307  };
308  
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  
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  
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  
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  
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  /*
374   * Set the tx-usecs/tx-max-packets parameters.
375   */
376  struct virtio_net_ctrl_coal_tx {
377  	/* Maximum number of packets to send before a TX notification */
378  	__le32 tx_max_packets;
379  	/* Maximum number of usecs to delay a TX notification */
380  	__le32 tx_usecs;
381  };
382  
383  #define VIRTIO_NET_CTRL_NOTF_COAL_TX_SET		0
384  
385  /*
386   * Set the rx-usecs/rx-max-packets parameters.
387   */
388  struct virtio_net_ctrl_coal_rx {
389  	/* Maximum number of packets to receive before a RX notification */
390  	__le32 rx_max_packets;
391  	/* Maximum number of usecs to delay a RX notification */
392  	__le32 rx_usecs;
393  };
394  
395  #define VIRTIO_NET_CTRL_NOTF_COAL_RX_SET		1
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  };
409  
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  
552  #endif /* _UAPI_LINUX_VIRTIO_NET_H */
553