|
@@ -57,6 +57,9 @@
|
|
|
* Steering */
|
|
|
#define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */
|
|
|
|
|
|
+#define VIRTIO_NET_F_HASH_REPORT 57 /* Supports hash report */
|
|
|
+#define VIRTIO_NET_F_RSS 60 /* Supports RSS RX steering */
|
|
|
+#define VIRTIO_NET_F_RSC_EXT 61 /* extended coalescing info */
|
|
|
#define VIRTIO_NET_F_STANDBY 62 /* Act as standby for another device
|
|
|
* with the same MAC.
|
|
|
*/
|
|
@@ -69,6 +72,17 @@
|
|
|
#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
|
|
|
#define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */
|
|
|
|
|
|
+/* supported/enabled hash types */
|
|
|
+#define VIRTIO_NET_RSS_HASH_TYPE_IPv4 (1 << 0)
|
|
|
+#define VIRTIO_NET_RSS_HASH_TYPE_TCPv4 (1 << 1)
|
|
|
+#define VIRTIO_NET_RSS_HASH_TYPE_UDPv4 (1 << 2)
|
|
|
+#define VIRTIO_NET_RSS_HASH_TYPE_IPv6 (1 << 3)
|
|
|
+#define VIRTIO_NET_RSS_HASH_TYPE_TCPv6 (1 << 4)
|
|
|
+#define VIRTIO_NET_RSS_HASH_TYPE_UDPv6 (1 << 5)
|
|
|
+#define VIRTIO_NET_RSS_HASH_TYPE_IP_EX (1 << 6)
|
|
|
+#define VIRTIO_NET_RSS_HASH_TYPE_TCP_EX (1 << 7)
|
|
|
+#define VIRTIO_NET_RSS_HASH_TYPE_UDP_EX (1 << 8)
|
|
|
+
|
|
|
struct virtio_net_config {
|
|
|
/* The config defining mac address (if VIRTIO_NET_F_MAC) */
|
|
|
uint8_t mac[ETH_ALEN];
|
|
@@ -92,6 +106,12 @@ struct virtio_net_config {
|
|
|
* Any other value stands for unknown.
|
|
|
*/
|
|
|
uint8_t duplex;
|
|
|
+ /* maximum size of RSS key */
|
|
|
+ uint8_t rss_max_key_size;
|
|
|
+ /* maximum number of indirection table entries */
|
|
|
+ uint16_t rss_max_indirection_table_length;
|
|
|
+ /* bitmask of supported VIRTIO_NET_RSS_HASH_ types */
|
|
|
+ uint32_t supported_hash_types;
|
|
|
} QEMU_PACKED;
|
|
|
|
|
|
/*
|
|
@@ -104,6 +124,7 @@ struct virtio_net_config {
|
|
|
struct virtio_net_hdr_v1 {
|
|
|
#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_F_RSC_INFO 4 /* rsc info in csum_ fields */
|
|
|
uint8_t flags;
|
|
|
#define VIRTIO_NET_HDR_GSO_NONE 0 /* Not a GSO frame */
|
|
|
#define VIRTIO_NET_HDR_GSO_TCPV4 1 /* GSO frame, IPv4 TCP (TSO) */
|
|
@@ -113,11 +134,46 @@ struct virtio_net_hdr_v1 {
|
|
|
uint8_t gso_type;
|
|
|
__virtio16 hdr_len; /* Ethernet + IP + tcp/udp hdrs */
|
|
|
__virtio16 gso_size; /* Bytes to append to hdr_len per frame */
|
|
|
- __virtio16 csum_start; /* Position to start checksumming from */
|
|
|
- __virtio16 csum_offset; /* Offset after that to place checksum */
|
|
|
+ union {
|
|
|
+ struct {
|
|
|
+ __virtio16 csum_start;
|
|
|
+ __virtio16 csum_offset;
|
|
|
+ };
|
|
|
+ /* Checksum calculation */
|
|
|
+ struct {
|
|
|
+ /* Position to start checksumming from */
|
|
|
+ __virtio16 start;
|
|
|
+ /* Offset after that to place checksum */
|
|
|
+ __virtio16 offset;
|
|
|
+ } csum;
|
|
|
+ /* Receive Segment Coalescing */
|
|
|
+ struct {
|
|
|
+ /* Number of coalesced segments */
|
|
|
+ uint16_t segments;
|
|
|
+ /* Number of duplicated acks */
|
|
|
+ uint16_t dup_acks;
|
|
|
+ } rsc;
|
|
|
+ };
|
|
|
__virtio16 num_buffers; /* Number of merged rx buffers */
|
|
|
};
|
|
|
|
|
|
+struct virtio_net_hdr_v1_hash {
|
|
|
+ struct virtio_net_hdr_v1 hdr;
|
|
|
+ uint32_t hash_value;
|
|
|
+#define VIRTIO_NET_HASH_REPORT_NONE 0
|
|
|
+#define VIRTIO_NET_HASH_REPORT_IPv4 1
|
|
|
+#define VIRTIO_NET_HASH_REPORT_TCPv4 2
|
|
|
+#define VIRTIO_NET_HASH_REPORT_UDPv4 3
|
|
|
+#define VIRTIO_NET_HASH_REPORT_IPv6 4
|
|
|
+#define VIRTIO_NET_HASH_REPORT_TCPv6 5
|
|
|
+#define VIRTIO_NET_HASH_REPORT_UDPv6 6
|
|
|
+#define VIRTIO_NET_HASH_REPORT_IPv6_EX 7
|
|
|
+#define VIRTIO_NET_HASH_REPORT_TCPv6_EX 8
|
|
|
+#define VIRTIO_NET_HASH_REPORT_UDPv6_EX 9
|
|
|
+ uint16_t hash_report;
|
|
|
+ uint16_t padding;
|
|
|
+};
|
|
|
+
|
|
|
#ifndef VIRTIO_NET_NO_LEGACY
|
|
|
/* This header comes first in the scatter-gather list.
|
|
|
* For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated, it must
|
|
@@ -228,7 +284,9 @@ struct virtio_net_ctrl_mac {
|
|
|
|
|
|
/*
|
|
|
* Control Receive Flow Steering
|
|
|
- *
|
|
|
+ */
|
|
|
+#define VIRTIO_NET_CTRL_MQ 4
|
|
|
+/*
|
|
|
* The command VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET
|
|
|
* enables Receive Flow Steering, specifying the number of the transmit and
|
|
|
* receive queues that will be used. After the command is consumed and acked by
|
|
@@ -241,11 +299,47 @@ struct virtio_net_ctrl_mq {
|
|
|
__virtio16 virtqueue_pairs;
|
|
|
};
|
|
|
|
|
|
-#define VIRTIO_NET_CTRL_MQ 4
|
|
|
#define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET 0
|
|
|
#define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN 1
|
|
|
#define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX 0x8000
|
|
|
|
|
|
+/*
|
|
|
+ * The command VIRTIO_NET_CTRL_MQ_RSS_CONFIG has the same effect as
|
|
|
+ * VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET does and additionally configures
|
|
|
+ * the receive steering to use a hash calculated for incoming packet
|
|
|
+ * to decide on receive virtqueue to place the packet. The command
|
|
|
+ * also provides parameters to calculate a hash and receive virtqueue.
|
|
|
+ */
|
|
|
+struct virtio_net_rss_config {
|
|
|
+ uint32_t hash_types;
|
|
|
+ uint16_t indirection_table_mask;
|
|
|
+ uint16_t unclassified_queue;
|
|
|
+ uint16_t indirection_table[1/* + indirection_table_mask */];
|
|
|
+ uint16_t max_tx_vq;
|
|
|
+ uint8_t hash_key_length;
|
|
|
+ uint8_t hash_key_data[/* hash_key_length */];
|
|
|
+};
|
|
|
+
|
|
|
+ #define VIRTIO_NET_CTRL_MQ_RSS_CONFIG 1
|
|
|
+
|
|
|
+/*
|
|
|
+ * The command VIRTIO_NET_CTRL_MQ_HASH_CONFIG requests the device
|
|
|
+ * to include in the virtio header of the packet the value of the
|
|
|
+ * calculated hash and the report type of hash. It also provides
|
|
|
+ * parameters for hash calculation. The command requires feature
|
|
|
+ * VIRTIO_NET_F_HASH_REPORT to be negotiated to extend the
|
|
|
+ * layout of virtio header as defined in virtio_net_hdr_v1_hash.
|
|
|
+ */
|
|
|
+struct virtio_net_hash_config {
|
|
|
+ uint32_t hash_types;
|
|
|
+ /* for compatibility with virtio_net_rss_config */
|
|
|
+ uint16_t reserved[4];
|
|
|
+ uint8_t hash_key_length;
|
|
|
+ uint8_t hash_key_data[/* hash_key_length */];
|
|
|
+};
|
|
|
+
|
|
|
+ #define VIRTIO_NET_CTRL_MQ_HASH_CONFIG 2
|
|
|
+
|
|
|
/*
|
|
|
* Control network offloads
|
|
|
*
|