|
|
|
@ -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 |
|
|
|
* |
|
|
|
|