qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

virtio_net.h (14853B)


      1 #ifndef _LINUX_VIRTIO_NET_H
      2 #define _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 "standard-headers/linux/types.h"
     29 #include "standard-headers/linux/virtio_ids.h"
     30 #include "standard-headers/linux/virtio_config.h"
     31 #include "standard-headers/linux/virtio_types.h"
     32 #include "standard-headers/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_NOTF_COAL	53	/* Device supports notifications coalescing */
     60 #define VIRTIO_NET_F_HASH_REPORT  57	/* Supports hash report */
     61 #define VIRTIO_NET_F_RSS	  60	/* Supports RSS RX steering */
     62 #define VIRTIO_NET_F_RSC_EXT	  61	/* extended coalescing info */
     63 #define VIRTIO_NET_F_STANDBY	  62	/* Act as standby for another device
     64 					 * with the same MAC.
     65 					 */
     66 #define VIRTIO_NET_F_SPEED_DUPLEX 63	/* Device set linkspeed and duplex */
     67 
     68 #ifndef VIRTIO_NET_NO_LEGACY
     69 #define VIRTIO_NET_F_GSO	6	/* Host handles pkts w/ any GSO type */
     70 #endif /* VIRTIO_NET_NO_LEGACY */
     71 
     72 #define VIRTIO_NET_S_LINK_UP	1	/* Link is up */
     73 #define VIRTIO_NET_S_ANNOUNCE	2	/* Announcement is needed */
     74 
     75 /* supported/enabled hash types */
     76 #define VIRTIO_NET_RSS_HASH_TYPE_IPv4          (1 << 0)
     77 #define VIRTIO_NET_RSS_HASH_TYPE_TCPv4         (1 << 1)
     78 #define VIRTIO_NET_RSS_HASH_TYPE_UDPv4         (1 << 2)
     79 #define VIRTIO_NET_RSS_HASH_TYPE_IPv6          (1 << 3)
     80 #define VIRTIO_NET_RSS_HASH_TYPE_TCPv6         (1 << 4)
     81 #define VIRTIO_NET_RSS_HASH_TYPE_UDPv6         (1 << 5)
     82 #define VIRTIO_NET_RSS_HASH_TYPE_IP_EX         (1 << 6)
     83 #define VIRTIO_NET_RSS_HASH_TYPE_TCP_EX        (1 << 7)
     84 #define VIRTIO_NET_RSS_HASH_TYPE_UDP_EX        (1 << 8)
     85 
     86 struct virtio_net_config {
     87 	/* The config defining mac address (if VIRTIO_NET_F_MAC) */
     88 	uint8_t mac[ETH_ALEN];
     89 	/* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */
     90 	__virtio16 status;
     91 	/* Maximum number of each of transmit and receive queues;
     92 	 * see VIRTIO_NET_F_MQ and VIRTIO_NET_CTRL_MQ.
     93 	 * Legal values are between 1 and 0x8000
     94 	 */
     95 	__virtio16 max_virtqueue_pairs;
     96 	/* Default maximum transmit unit advice */
     97 	__virtio16 mtu;
     98 	/*
     99 	 * speed, in units of 1Mb. All values 0 to INT_MAX are legal.
    100 	 * Any other value stands for unknown.
    101 	 */
    102 	uint32_t speed;
    103 	/*
    104 	 * 0x00 - half duplex
    105 	 * 0x01 - full duplex
    106 	 * Any other value stands for unknown.
    107 	 */
    108 	uint8_t duplex;
    109 	/* maximum size of RSS key */
    110 	uint8_t rss_max_key_size;
    111 	/* maximum number of indirection table entries */
    112 	uint16_t rss_max_indirection_table_length;
    113 	/* bitmask of supported VIRTIO_NET_RSS_HASH_ types */
    114 	uint32_t supported_hash_types;
    115 } QEMU_PACKED;
    116 
    117 /*
    118  * This header comes first in the scatter-gather list.  If you don't
    119  * specify GSO or CSUM features, you can simply ignore the header.
    120  *
    121  * This is bitwise-equivalent to the legacy struct virtio_net_hdr_mrg_rxbuf,
    122  * only flattened.
    123  */
    124 struct virtio_net_hdr_v1 {
    125 #define VIRTIO_NET_HDR_F_NEEDS_CSUM	1	/* Use csum_start, csum_offset */
    126 #define VIRTIO_NET_HDR_F_DATA_VALID	2	/* Csum is valid */
    127 #define VIRTIO_NET_HDR_F_RSC_INFO	4	/* rsc info in csum_ fields */
    128 	uint8_t flags;
    129 #define VIRTIO_NET_HDR_GSO_NONE		0	/* Not a GSO frame */
    130 #define VIRTIO_NET_HDR_GSO_TCPV4	1	/* GSO frame, IPv4 TCP (TSO) */
    131 #define VIRTIO_NET_HDR_GSO_UDP		3	/* GSO frame, IPv4 UDP (UFO) */
    132 #define VIRTIO_NET_HDR_GSO_TCPV6	4	/* GSO frame, IPv6 TCP */
    133 #define VIRTIO_NET_HDR_GSO_ECN		0x80	/* TCP has ECN set */
    134 	uint8_t gso_type;
    135 	__virtio16 hdr_len;	/* Ethernet + IP + tcp/udp hdrs */
    136 	__virtio16 gso_size;	/* Bytes to append to hdr_len per frame */
    137 	union {
    138 		struct {
    139 			__virtio16 csum_start;
    140 			__virtio16 csum_offset;
    141 		};
    142 		/* Checksum calculation */
    143 		struct {
    144 			/* Position to start checksumming from */
    145 			__virtio16 start;
    146 			/* Offset after that to place checksum */
    147 			__virtio16 offset;
    148 		} csum;
    149 		/* Receive Segment Coalescing */
    150 		struct {
    151 			/* Number of coalesced segments */
    152 			uint16_t segments;
    153 			/* Number of duplicated acks */
    154 			uint16_t dup_acks;
    155 		} rsc;
    156 	};
    157 	__virtio16 num_buffers;	/* Number of merged rx buffers */
    158 };
    159 
    160 struct virtio_net_hdr_v1_hash {
    161 	struct virtio_net_hdr_v1 hdr;
    162 	uint32_t hash_value;
    163 #define VIRTIO_NET_HASH_REPORT_NONE            0
    164 #define VIRTIO_NET_HASH_REPORT_IPv4            1
    165 #define VIRTIO_NET_HASH_REPORT_TCPv4           2
    166 #define VIRTIO_NET_HASH_REPORT_UDPv4           3
    167 #define VIRTIO_NET_HASH_REPORT_IPv6            4
    168 #define VIRTIO_NET_HASH_REPORT_TCPv6           5
    169 #define VIRTIO_NET_HASH_REPORT_UDPv6           6
    170 #define VIRTIO_NET_HASH_REPORT_IPv6_EX         7
    171 #define VIRTIO_NET_HASH_REPORT_TCPv6_EX        8
    172 #define VIRTIO_NET_HASH_REPORT_UDPv6_EX        9
    173 	uint16_t hash_report;
    174 	uint16_t padding;
    175 };
    176 
    177 #ifndef VIRTIO_NET_NO_LEGACY
    178 /* This header comes first in the scatter-gather list.
    179  * For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated, it must
    180  * be the first element of the scatter-gather list.  If you don't
    181  * specify GSO or CSUM features, you can simply ignore the header. */
    182 struct virtio_net_hdr {
    183 	/* See VIRTIO_NET_HDR_F_* */
    184 	uint8_t flags;
    185 	/* See VIRTIO_NET_HDR_GSO_* */
    186 	uint8_t gso_type;
    187 	__virtio16 hdr_len;		/* Ethernet + IP + tcp/udp hdrs */
    188 	__virtio16 gso_size;		/* Bytes to append to hdr_len per frame */
    189 	__virtio16 csum_start;	/* Position to start checksumming from */
    190 	__virtio16 csum_offset;	/* Offset after that to place checksum */
    191 };
    192 
    193 /* This is the version of the header to use when the MRG_RXBUF
    194  * feature has been negotiated. */
    195 struct virtio_net_hdr_mrg_rxbuf {
    196 	struct virtio_net_hdr hdr;
    197 	__virtio16 num_buffers;	/* Number of merged rx buffers */
    198 };
    199 #endif /* ...VIRTIO_NET_NO_LEGACY */
    200 
    201 /*
    202  * Control virtqueue data structures
    203  *
    204  * The control virtqueue expects a header in the first sg entry
    205  * and an ack/status response in the last entry.  Data for the
    206  * command goes in between.
    207  */
    208 struct virtio_net_ctrl_hdr {
    209 	uint8_t class;
    210 	uint8_t cmd;
    211 } QEMU_PACKED;
    212 
    213 typedef uint8_t virtio_net_ctrl_ack;
    214 
    215 #define VIRTIO_NET_OK     0
    216 #define VIRTIO_NET_ERR    1
    217 
    218 /*
    219  * Control the RX mode, ie. promisucous, allmulti, etc...
    220  * All commands require an "out" sg entry containing a 1 byte
    221  * state value, zero = disable, non-zero = enable.  Commands
    222  * 0 and 1 are supported with the VIRTIO_NET_F_CTRL_RX feature.
    223  * Commands 2-5 are added with VIRTIO_NET_F_CTRL_RX_EXTRA.
    224  */
    225 #define VIRTIO_NET_CTRL_RX    0
    226  #define VIRTIO_NET_CTRL_RX_PROMISC      0
    227  #define VIRTIO_NET_CTRL_RX_ALLMULTI     1
    228  #define VIRTIO_NET_CTRL_RX_ALLUNI       2
    229  #define VIRTIO_NET_CTRL_RX_NOMULTI      3
    230  #define VIRTIO_NET_CTRL_RX_NOUNI        4
    231  #define VIRTIO_NET_CTRL_RX_NOBCAST      5
    232 
    233 /*
    234  * Control the MAC
    235  *
    236  * The MAC filter table is managed by the hypervisor, the guest should
    237  * assume the size is infinite.  Filtering should be considered
    238  * non-perfect, ie. based on hypervisor resources, the guest may
    239  * received packets from sources not specified in the filter list.
    240  *
    241  * In addition to the class/cmd header, the TABLE_SET command requires
    242  * two out scatterlists.  Each contains a 4 byte count of entries followed
    243  * by a concatenated byte stream of the ETH_ALEN MAC addresses.  The
    244  * first sg list contains unicast addresses, the second is for multicast.
    245  * This functionality is present if the VIRTIO_NET_F_CTRL_RX feature
    246  * is available.
    247  *
    248  * The ADDR_SET command requests one out scatterlist, it contains a
    249  * 6 bytes MAC address. This functionality is present if the
    250  * VIRTIO_NET_F_CTRL_MAC_ADDR feature is available.
    251  */
    252 struct virtio_net_ctrl_mac {
    253 	__virtio32 entries;
    254 	uint8_t macs[][ETH_ALEN];
    255 } QEMU_PACKED;
    256 
    257 #define VIRTIO_NET_CTRL_MAC    1
    258  #define VIRTIO_NET_CTRL_MAC_TABLE_SET        0
    259  #define VIRTIO_NET_CTRL_MAC_ADDR_SET         1
    260 
    261 /*
    262  * Control VLAN filtering
    263  *
    264  * The VLAN filter table is controlled via a simple ADD/DEL interface.
    265  * VLAN IDs not added may be filterd by the hypervisor.  Del is the
    266  * opposite of add.  Both commands expect an out entry containing a 2
    267  * byte VLAN ID.  VLAN filterting is available with the
    268  * VIRTIO_NET_F_CTRL_VLAN feature bit.
    269  */
    270 #define VIRTIO_NET_CTRL_VLAN       2
    271  #define VIRTIO_NET_CTRL_VLAN_ADD             0
    272  #define VIRTIO_NET_CTRL_VLAN_DEL             1
    273 
    274 /*
    275  * Control link announce acknowledgement
    276  *
    277  * The command VIRTIO_NET_CTRL_ANNOUNCE_ACK is used to indicate that
    278  * driver has recevied the notification; device would clear the
    279  * VIRTIO_NET_S_ANNOUNCE bit in the status field after it receives
    280  * this command.
    281  */
    282 #define VIRTIO_NET_CTRL_ANNOUNCE       3
    283  #define VIRTIO_NET_CTRL_ANNOUNCE_ACK         0
    284 
    285 /*
    286  * Control Receive Flow Steering
    287  */
    288 #define VIRTIO_NET_CTRL_MQ   4
    289 /*
    290  * The command VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET
    291  * enables Receive Flow Steering, specifying the number of the transmit and
    292  * receive queues that will be used. After the command is consumed and acked by
    293  * the device, the device will not steer new packets on receive virtqueues
    294  * other than specified nor read from transmit virtqueues other than specified.
    295  * Accordingly, driver should not transmit new packets  on virtqueues other than
    296  * specified.
    297  */
    298 struct virtio_net_ctrl_mq {
    299 	__virtio16 virtqueue_pairs;
    300 };
    301 
    302  #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET        0
    303  #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN        1
    304  #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX        0x8000
    305 
    306 /*
    307  * The command VIRTIO_NET_CTRL_MQ_RSS_CONFIG has the same effect as
    308  * VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET does and additionally configures
    309  * the receive steering to use a hash calculated for incoming packet
    310  * to decide on receive virtqueue to place the packet. The command
    311  * also provides parameters to calculate a hash and receive virtqueue.
    312  */
    313 struct virtio_net_rss_config {
    314 	uint32_t hash_types;
    315 	uint16_t indirection_table_mask;
    316 	uint16_t unclassified_queue;
    317 	uint16_t indirection_table[1/* + indirection_table_mask */];
    318 	uint16_t max_tx_vq;
    319 	uint8_t hash_key_length;
    320 	uint8_t hash_key_data[/* hash_key_length */];
    321 };
    322 
    323  #define VIRTIO_NET_CTRL_MQ_RSS_CONFIG          1
    324 
    325 /*
    326  * The command VIRTIO_NET_CTRL_MQ_HASH_CONFIG requests the device
    327  * to include in the virtio header of the packet the value of the
    328  * calculated hash and the report type of hash. It also provides
    329  * parameters for hash calculation. The command requires feature
    330  * VIRTIO_NET_F_HASH_REPORT to be negotiated to extend the
    331  * layout of virtio header as defined in virtio_net_hdr_v1_hash.
    332  */
    333 struct virtio_net_hash_config {
    334 	uint32_t hash_types;
    335 	/* for compatibility with virtio_net_rss_config */
    336 	uint16_t reserved[4];
    337 	uint8_t hash_key_length;
    338 	uint8_t hash_key_data[/* hash_key_length */];
    339 };
    340 
    341  #define VIRTIO_NET_CTRL_MQ_HASH_CONFIG         2
    342 
    343 /*
    344  * Control network offloads
    345  *
    346  * Reconfigures the network offloads that Guest can handle.
    347  *
    348  * Available with the VIRTIO_NET_F_CTRL_GUEST_OFFLOADS feature bit.
    349  *
    350  * Command data format matches the feature bit mask exactly.
    351  *
    352  * See VIRTIO_NET_F_GUEST_* for the list of offloads
    353  * that can be enabled/disabled.
    354  */
    355 #define VIRTIO_NET_CTRL_GUEST_OFFLOADS   5
    356 #define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET        0
    357 
    358 /*
    359  * Control notifications coalescing.
    360  *
    361  * Request the device to change the notifications coalescing parameters.
    362  *
    363  * Available with the VIRTIO_NET_F_NOTF_COAL feature bit.
    364  */
    365 #define VIRTIO_NET_CTRL_NOTF_COAL		6
    366 /*
    367  * Set the tx-usecs/tx-max-packets parameters.
    368  */
    369 struct virtio_net_ctrl_coal_tx {
    370 	/* Maximum number of packets to send before a TX notification */
    371 	uint32_t tx_max_packets;
    372 	/* Maximum number of usecs to delay a TX notification */
    373 	uint32_t tx_usecs;
    374 };
    375 
    376 #define VIRTIO_NET_CTRL_NOTF_COAL_TX_SET		0
    377 
    378 /*
    379  * Set the rx-usecs/rx-max-packets parameters.
    380  */
    381 struct virtio_net_ctrl_coal_rx {
    382 	/* Maximum number of packets to receive before a RX notification */
    383 	uint32_t rx_max_packets;
    384 	/* Maximum number of usecs to delay a RX notification */
    385 	uint32_t rx_usecs;
    386 };
    387 
    388 #define VIRTIO_NET_CTRL_NOTF_COAL_RX_SET		1
    389 
    390 #endif /* _LINUX_VIRTIO_NET_H */