cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

virtio_net.h (13940B)


      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
     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
     86struct 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 */
    124struct 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
    160struct 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. */
    182struct 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. */
    195struct 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 */
    208struct virtio_net_ctrl_hdr {
    209	uint8_t class;
    210	uint8_t cmd;
    211} QEMU_PACKED;
    212
    213typedef 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 */
    252struct 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 */
    298struct 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 */
    313struct 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 */
    333struct 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#endif /* _LINUX_VIRTIO_NET_H */