[dpdk-dev,5/5] virtio: clarify feature bit handling
Commit Message
Change the features from bit mask to bit number. This allows the
DPDK driver to use the definitions from Linux[1]. This makes doing
enhancements to DPDK driver easier when new feature bits are added.
More importantly, get rid of the confusing feature bit initialization
code. Remove the double negative code in the feature masking.
Instead just have a new define with the list of feature bits implemented.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/librte_pmd_virtio/virtio_ethdev.c | 17 +------
lib/librte_pmd_virtio/virtio_ethdev.h | 27 ++++------
lib/librte_pmd_virtio/virtio_pci.h | 96 ++++++++++++++++++-----------------
lib/librte_pmd_virtio/virtqueue.h | 8 +--
4 files changed, 61 insertions(+), 87 deletions(-)
Comments
On Wed, 15 Apr 2015 08:20:19 -0700
Stephen Hemminger <stephen@networkplumber.org> wrote:
> Change the features from bit mask to bit number. This allows the
> DPDK driver to use the definitions from Linux[1]. This makes doing
> enhancements to DPDK driver easier when new feature bits are added.
>
> More importantly, get rid of the confusing feature bit initialization
> code. Remove the double negative code in the feature masking.
> Instead just have a new define with the list of feature bits implemented.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> lib/librte_pmd_virtio/virtio_ethdev.c | 17 +------
> lib/librte_pmd_virtio/virtio_ethdev.h | 27 ++++------
> lib/librte_pmd_virtio/virtio_pci.h | 96 ++++++++++++++++++-----------------
> lib/librte_pmd_virtio/virtqueue.h | 8 +--
> 4 files changed, 61 insertions(+), 87 deletions(-)
>
> diff --git a/lib/librte_pmd_virtio/virtio_ethdev.c b/lib/librte_pmd_virtio/virtio_ethdev.c
> index db0232e..349b73b 100644
> --- a/lib/librte_pmd_virtio/virtio_ethdev.c
> +++ b/lib/librte_pmd_virtio/virtio_ethdev.c
> @@ -807,23 +807,10 @@ virtio_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
> static void
> virtio_negotiate_features(struct virtio_hw *hw)
> {
> - uint32_t host_features, mask;
> -
> - /* checksum offload not implemented */
> - mask = VIRTIO_NET_F_CSUM | VIRTIO_NET_F_GUEST_CSUM;
> -
> - /* TSO and LRO are only available when their corresponding
> - * checksum offload feature is also negotiated.
> - */
> - mask |= VIRTIO_NET_F_HOST_TSO4 | VIRTIO_NET_F_HOST_TSO6 | VIRTIO_NET_F_HOST_ECN;
> - mask |= VIRTIO_NET_F_GUEST_TSO4 | VIRTIO_NET_F_GUEST_TSO6 | VIRTIO_NET_F_GUEST_ECN;
> - mask |= VTNET_LRO_FEATURES;
> -
> - /* not negotiating INDIRECT descriptor table support */
> - mask |= VIRTIO_RING_F_INDIRECT_DESC;
> + uint32_t host_features;
>
> /* Prepare guest_features: feature that driver wants to support */
> - hw->guest_features = VTNET_FEATURES & ~mask;
> + hw->guest_features = VIRTIO_PMD_GUEST_FEATURES;
> PMD_INIT_LOG(DEBUG, "guest_features before negotiate = %x",
> hw->guest_features);
>
> diff --git a/lib/librte_pmd_virtio/virtio_ethdev.h b/lib/librte_pmd_virtio/virtio_ethdev.h
> index e6d4533..df2cb7d 100644
> --- a/lib/librte_pmd_virtio/virtio_ethdev.h
> +++ b/lib/librte_pmd_virtio/virtio_ethdev.h
> @@ -56,24 +56,15 @@
> #define VIRTIO_MAX_RX_PKTLEN 9728
>
> /* Features desired/implemented by this driver. */
> -#define VTNET_FEATURES \
> - (VIRTIO_NET_F_MAC | \
> - VIRTIO_NET_F_STATUS | \
> - VIRTIO_NET_F_MQ | \
> - VIRTIO_NET_F_CTRL_MAC_ADDR | \
> - VIRTIO_NET_F_CTRL_VQ | \
> - VIRTIO_NET_F_CTRL_RX | \
> - VIRTIO_NET_F_CTRL_VLAN | \
> - VIRTIO_NET_F_CSUM | \
> - VIRTIO_NET_F_HOST_TSO4 | \
> - VIRTIO_NET_F_HOST_TSO6 | \
> - VIRTIO_NET_F_HOST_ECN | \
> - VIRTIO_NET_F_GUEST_CSUM | \
> - VIRTIO_NET_F_GUEST_TSO4 | \
> - VIRTIO_NET_F_GUEST_TSO6 | \
> - VIRTIO_NET_F_GUEST_ECN | \
> - VIRTIO_NET_F_MRG_RXBUF | \
> - VIRTIO_RING_F_INDIRECT_DESC)
> +#define VIRTIO_PMD_GUEST_FEATURES \
> + (1u << VIRTIO_NET_F_MAC | \
> + 1u << VIRTIO_NET_F_STATUS | \
> + 1u << VIRTIO_NET_F_MQ | \
> + 1u << VIRTIO_NET_F_CTRL_MAC_ADDR | \
> + 1u << VIRTIO_NET_F_CTRL_VQ | \
> + 1u << VIRTIO_NET_F_CTRL_RX | \
> + 1u << VIRTIO_NET_F_CTRL_VLAN | \
> + 1u << VIRTIO_NET_F_MRG_RXBUF)
>
> /*
> * CQ function prototype
> diff --git a/lib/librte_pmd_virtio/virtio_pci.h b/lib/librte_pmd_virtio/virtio_pci.h
> index 64d9c34..47f722a 100644
> --- a/lib/librte_pmd_virtio/virtio_pci.h
> +++ b/lib/librte_pmd_virtio/virtio_pci.h
> @@ -96,26 +96,6 @@ struct virtqueue;
> #define VIRTIO_CONFIG_STATUS_FAILED 0x80
>
> /*
> - * Generate interrupt when the virtqueue ring is
> - * completely used, even if we've suppressed them.
> - */
> -#define VIRTIO_F_NOTIFY_ON_EMPTY (1 << 24)
> -
> -/*
> - * The guest should never negotiate this feature; it
> - * is used to detect faulty drivers.
> - */
> -#define VIRTIO_F_BAD_FEATURE (1 << 30)
> -
> -/*
> - * Some VirtIO feature bits (currently bits 28 through 31) are
> - * reserved for the transport being used (eg. virtio_ring), the
> - * rest are per-device feature bits.
> - */
> -#define VIRTIO_TRANSPORT_F_START 28
> -#define VIRTIO_TRANSPORT_F_END 32
> -
> -/*
> * Each virtqueue indirect descriptor list must be physically contiguous.
> * To allow us to malloc(9) each list individually, limit the number
> * supported to what will fit in one page. With 4KB pages, this is a limit
> @@ -128,33 +108,55 @@ struct virtqueue;
> #define VIRTIO_MAX_INDIRECT ((int) (PAGE_SIZE / 16))
>
> /* The feature bitmap for virtio net */
> -#define VIRTIO_NET_F_CSUM 0x00001 /* Host handles pkts w/ partial csum */
> -#define VIRTIO_NET_F_GUEST_CSUM 0x00002 /* Guest handles pkts w/ partial csum*/
> -#define VIRTIO_NET_F_MAC 0x00020 /* Host has given MAC address. */
> -#define VIRTIO_NET_F_GSO 0x00040 /* Host handles pkts w/ any GSO type */
> -#define VIRTIO_NET_F_GUEST_TSO4 0x00080 /* Guest can handle TSOv4 in. */
> -#define VIRTIO_NET_F_GUEST_TSO6 0x00100 /* Guest can handle TSOv6 in. */
> -#define VIRTIO_NET_F_GUEST_ECN 0x00200 /* Guest can handle TSO[6] w/ ECN in.*/
> -#define VIRTIO_NET_F_GUEST_UFO 0x00400 /* Guest can handle UFO in. */
> -#define VIRTIO_NET_F_HOST_TSO4 0x00800 /* Host can handle TSOv4 in. */
> -#define VIRTIO_NET_F_HOST_TSO6 0x01000 /* Host can handle TSOv6 in. */
> -#define VIRTIO_NET_F_HOST_ECN 0x02000 /* Host can handle TSO[6] w/ ECN in. */
> -#define VIRTIO_NET_F_HOST_UFO 0x04000 /* Host can handle UFO in. */
> -#define VIRTIO_NET_F_MRG_RXBUF 0x08000 /* Host can merge receive buffers. */
> -#define VIRTIO_NET_F_STATUS 0x10000 /* virtio_net_config.status available*/
> -#define VIRTIO_NET_F_CTRL_VQ 0x20000 /* Control channel available */
> -#define VIRTIO_NET_F_CTRL_RX 0x40000 /* Control channel RX mode support */
> -#define VIRTIO_NET_F_CTRL_VLAN 0x80000 /* Control channel VLAN filtering */
> -#define VIRTIO_NET_F_CTRL_RX_EXTRA 0x100000 /* Extra RX mode control support */
> -#define VIRTIO_RING_F_INDIRECT_DESC 0x10000000 /* Support for indirect buffer descriptors. */
> -/* The guest publishes the used index for which it expects an interrupt
> - * at the end of the avail ring. Host should ignore the avail->flags field.
> - * The host publishes the avail index for which it expects a kick
> - * at the end of the used ring. Guest should ignore the used->flags field.
> +#define VIRTIO_NET_F_CSUM 0 /* Host handles pkts w/ partial csum */
> +#define VIRTIO_NET_F_GUEST_CSUM 1 /* Guest handles pkts w/ partial csum */
> +#define VIRTIO_NET_F_MAC 5 /* Host has given MAC address. */
> +#define VIRTIO_NET_F_GUEST_TSO4 7 /* Guest can handle TSOv4 in. */
> +#define VIRTIO_NET_F_GUEST_TSO6 8 /* Guest can handle TSOv6 in. */
> +#define VIRTIO_NET_F_GUEST_ECN 9 /* Guest can handle TSO[6] w/ ECN in. */
> +#define VIRTIO_NET_F_GUEST_UFO 10 /* Guest can handle UFO in. */
> +#define VIRTIO_NET_F_HOST_TSO4 11 /* Host can handle TSOv4 in. */
> +#define VIRTIO_NET_F_HOST_TSO6 12 /* Host can handle TSOv6 in. */
> +#define VIRTIO_NET_F_HOST_ECN 13 /* Host can handle TSO[6] w/ ECN in. */
> +#define VIRTIO_NET_F_HOST_UFO 14 /* Host can handle UFO in. */
> +#define VIRTIO_NET_F_MRG_RXBUF 15 /* Host can merge receive buffers. */
> +#define VIRTIO_NET_F_STATUS 16 /* virtio_net_config.status available */
> +#define VIRTIO_NET_F_CTRL_VQ 17 /* Control channel available */
> +#define VIRTIO_NET_F_CTRL_RX 18 /* Control channel RX mode support */
> +#define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */
> +#define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */
> +#define VIRTIO_NET_F_GUEST_ANNOUNCE 21 /* Guest can announce device on the
> + * network */
> +#define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow
> + * Steering */
> +#define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */
> +
> +/* Do we get callbacks when the ring is completely used, even if we've
> + * suppressed them? */
> +#define VIRTIO_F_NOTIFY_ON_EMPTY 24
> +
> +/* Can the device handle any descriptor layout? */
> +#define VIRTIO_F_ANY_LAYOUT 27
> +
> +/* We support indirect buffer descriptors */
> +#define VIRTIO_RING_F_INDIRECT_DESC 28
> +
> +/*
> + * Some VirtIO feature bits (currently bits 28 through 31) are
> + * reserved for the transport being used (eg. virtio_ring), the
> + * rest are per-device feature bits.
> */
> -#define VIRTIO_RING_F_EVENT_IDX 0x20000000
> +#define VIRTIO_TRANSPORT_F_START 28
> +#define VIRTIO_TRANSPORT_F_END 32
> +
> +/* The Guest publishes the used index for which it expects an interrupt
> + * at the end of the avail ring. Host should ignore the avail->flags field. */
> +/* The Host publishes the avail index for which it expects a kick
> + * at the end of the used ring. Guest should ignore the used->flags field. */
> +#define VIRTIO_RING_F_EVENT_IDX 29
>
> -#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
> +#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
> +#define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */
>
> /*
> * Maximum number of virtqueues per device.
> @@ -243,9 +245,9 @@ outl_p(unsigned int data, unsigned int port)
> outl_p((unsigned int)(value), (VIRTIO_PCI_REG_ADDR((hw), (reg))))
>
> static inline int
> -vtpci_with_feature(struct virtio_hw *hw, uint32_t feature)
> +vtpci_with_feature(struct virtio_hw *hw, uint32_t bit)
> {
> - return (hw->guest_features & feature) != 0;
> + return (hw->guest_features & (1u << bit)) != 0;
> }
>
> /*
> diff --git a/lib/librte_pmd_virtio/virtqueue.h b/lib/librte_pmd_virtio/virtqueue.h
> index 41dda50..5509173 100644
> --- a/lib/librte_pmd_virtio/virtqueue.h
> +++ b/lib/librte_pmd_virtio/virtqueue.h
> @@ -201,18 +201,12 @@ struct virtqueue {
> };
>
> /* If multiqueue is provided by host, then we suppport it. */
> -#ifndef VIRTIO_NET_F_MQ
> -/* Device supports Receive Flow Steering */
> -#define VIRTIO_NET_F_MQ 0x400000
> #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
> -#endif
> -#ifndef VIRTIO_NET_F_CTRL_MAC_ADDR
> -#define VIRTIO_NET_F_CTRL_MAC_ADDR 0x800000
> +
> #define VIRTIO_NET_CTRL_MAC_ADDR_SET 1
> -#endif
>
> /**
> * This is the first element of the scatter-gather list. If you don't
Why are all these virtio patches stuck in the DPDK dead zone.
It makes me frustrated that no update to virtio has been done for 2.1
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Stephen
> Hemminger
> Sent: Wednesday, June 10, 2015 8:49 AM
> To: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH 5/5] virtio: clarify feature bit handling
>
> On Wed, 15 Apr 2015 08:20:19 -0700
> Stephen Hemminger <stephen@networkplumber.org> wrote:
>
> > Change the features from bit mask to bit number. This allows the DPDK
> > driver to use the definitions from Linux[1]. This makes doing
> > enhancements to DPDK driver easier when new feature bits are added.
> >
> > More importantly, get rid of the confusing feature bit initialization
> > code. Remove the double negative code in the feature masking.
> > Instead just have a new define with the list of feature bits implemented.
> >
> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > ---
> > lib/librte_pmd_virtio/virtio_ethdev.c | 17 +------
> > lib/librte_pmd_virtio/virtio_ethdev.h | 27 ++++------
> > lib/librte_pmd_virtio/virtio_pci.h | 96 ++++++++++++++++++--------------
As the path for virtio codes is moved to drivers/net/virtio, so need a v2 version to rebase it.
Thanks
Changchun
@@ -807,23 +807,10 @@ virtio_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
static void
virtio_negotiate_features(struct virtio_hw *hw)
{
- uint32_t host_features, mask;
-
- /* checksum offload not implemented */
- mask = VIRTIO_NET_F_CSUM | VIRTIO_NET_F_GUEST_CSUM;
-
- /* TSO and LRO are only available when their corresponding
- * checksum offload feature is also negotiated.
- */
- mask |= VIRTIO_NET_F_HOST_TSO4 | VIRTIO_NET_F_HOST_TSO6 | VIRTIO_NET_F_HOST_ECN;
- mask |= VIRTIO_NET_F_GUEST_TSO4 | VIRTIO_NET_F_GUEST_TSO6 | VIRTIO_NET_F_GUEST_ECN;
- mask |= VTNET_LRO_FEATURES;
-
- /* not negotiating INDIRECT descriptor table support */
- mask |= VIRTIO_RING_F_INDIRECT_DESC;
+ uint32_t host_features;
/* Prepare guest_features: feature that driver wants to support */
- hw->guest_features = VTNET_FEATURES & ~mask;
+ hw->guest_features = VIRTIO_PMD_GUEST_FEATURES;
PMD_INIT_LOG(DEBUG, "guest_features before negotiate = %x",
hw->guest_features);
@@ -56,24 +56,15 @@
#define VIRTIO_MAX_RX_PKTLEN 9728
/* Features desired/implemented by this driver. */
-#define VTNET_FEATURES \
- (VIRTIO_NET_F_MAC | \
- VIRTIO_NET_F_STATUS | \
- VIRTIO_NET_F_MQ | \
- VIRTIO_NET_F_CTRL_MAC_ADDR | \
- VIRTIO_NET_F_CTRL_VQ | \
- VIRTIO_NET_F_CTRL_RX | \
- VIRTIO_NET_F_CTRL_VLAN | \
- VIRTIO_NET_F_CSUM | \
- VIRTIO_NET_F_HOST_TSO4 | \
- VIRTIO_NET_F_HOST_TSO6 | \
- VIRTIO_NET_F_HOST_ECN | \
- VIRTIO_NET_F_GUEST_CSUM | \
- VIRTIO_NET_F_GUEST_TSO4 | \
- VIRTIO_NET_F_GUEST_TSO6 | \
- VIRTIO_NET_F_GUEST_ECN | \
- VIRTIO_NET_F_MRG_RXBUF | \
- VIRTIO_RING_F_INDIRECT_DESC)
+#define VIRTIO_PMD_GUEST_FEATURES \
+ (1u << VIRTIO_NET_F_MAC | \
+ 1u << VIRTIO_NET_F_STATUS | \
+ 1u << VIRTIO_NET_F_MQ | \
+ 1u << VIRTIO_NET_F_CTRL_MAC_ADDR | \
+ 1u << VIRTIO_NET_F_CTRL_VQ | \
+ 1u << VIRTIO_NET_F_CTRL_RX | \
+ 1u << VIRTIO_NET_F_CTRL_VLAN | \
+ 1u << VIRTIO_NET_F_MRG_RXBUF)
/*
* CQ function prototype
@@ -96,26 +96,6 @@ struct virtqueue;
#define VIRTIO_CONFIG_STATUS_FAILED 0x80
/*
- * Generate interrupt when the virtqueue ring is
- * completely used, even if we've suppressed them.
- */
-#define VIRTIO_F_NOTIFY_ON_EMPTY (1 << 24)
-
-/*
- * The guest should never negotiate this feature; it
- * is used to detect faulty drivers.
- */
-#define VIRTIO_F_BAD_FEATURE (1 << 30)
-
-/*
- * Some VirtIO feature bits (currently bits 28 through 31) are
- * reserved for the transport being used (eg. virtio_ring), the
- * rest are per-device feature bits.
- */
-#define VIRTIO_TRANSPORT_F_START 28
-#define VIRTIO_TRANSPORT_F_END 32
-
-/*
* Each virtqueue indirect descriptor list must be physically contiguous.
* To allow us to malloc(9) each list individually, limit the number
* supported to what will fit in one page. With 4KB pages, this is a limit
@@ -128,33 +108,55 @@ struct virtqueue;
#define VIRTIO_MAX_INDIRECT ((int) (PAGE_SIZE / 16))
/* The feature bitmap for virtio net */
-#define VIRTIO_NET_F_CSUM 0x00001 /* Host handles pkts w/ partial csum */
-#define VIRTIO_NET_F_GUEST_CSUM 0x00002 /* Guest handles pkts w/ partial csum*/
-#define VIRTIO_NET_F_MAC 0x00020 /* Host has given MAC address. */
-#define VIRTIO_NET_F_GSO 0x00040 /* Host handles pkts w/ any GSO type */
-#define VIRTIO_NET_F_GUEST_TSO4 0x00080 /* Guest can handle TSOv4 in. */
-#define VIRTIO_NET_F_GUEST_TSO6 0x00100 /* Guest can handle TSOv6 in. */
-#define VIRTIO_NET_F_GUEST_ECN 0x00200 /* Guest can handle TSO[6] w/ ECN in.*/
-#define VIRTIO_NET_F_GUEST_UFO 0x00400 /* Guest can handle UFO in. */
-#define VIRTIO_NET_F_HOST_TSO4 0x00800 /* Host can handle TSOv4 in. */
-#define VIRTIO_NET_F_HOST_TSO6 0x01000 /* Host can handle TSOv6 in. */
-#define VIRTIO_NET_F_HOST_ECN 0x02000 /* Host can handle TSO[6] w/ ECN in. */
-#define VIRTIO_NET_F_HOST_UFO 0x04000 /* Host can handle UFO in. */
-#define VIRTIO_NET_F_MRG_RXBUF 0x08000 /* Host can merge receive buffers. */
-#define VIRTIO_NET_F_STATUS 0x10000 /* virtio_net_config.status available*/
-#define VIRTIO_NET_F_CTRL_VQ 0x20000 /* Control channel available */
-#define VIRTIO_NET_F_CTRL_RX 0x40000 /* Control channel RX mode support */
-#define VIRTIO_NET_F_CTRL_VLAN 0x80000 /* Control channel VLAN filtering */
-#define VIRTIO_NET_F_CTRL_RX_EXTRA 0x100000 /* Extra RX mode control support */
-#define VIRTIO_RING_F_INDIRECT_DESC 0x10000000 /* Support for indirect buffer descriptors. */
-/* The guest publishes the used index for which it expects an interrupt
- * at the end of the avail ring. Host should ignore the avail->flags field.
- * The host publishes the avail index for which it expects a kick
- * at the end of the used ring. Guest should ignore the used->flags field.
+#define VIRTIO_NET_F_CSUM 0 /* Host handles pkts w/ partial csum */
+#define VIRTIO_NET_F_GUEST_CSUM 1 /* Guest handles pkts w/ partial csum */
+#define VIRTIO_NET_F_MAC 5 /* Host has given MAC address. */
+#define VIRTIO_NET_F_GUEST_TSO4 7 /* Guest can handle TSOv4 in. */
+#define VIRTIO_NET_F_GUEST_TSO6 8 /* Guest can handle TSOv6 in. */
+#define VIRTIO_NET_F_GUEST_ECN 9 /* Guest can handle TSO[6] w/ ECN in. */
+#define VIRTIO_NET_F_GUEST_UFO 10 /* Guest can handle UFO in. */
+#define VIRTIO_NET_F_HOST_TSO4 11 /* Host can handle TSOv4 in. */
+#define VIRTIO_NET_F_HOST_TSO6 12 /* Host can handle TSOv6 in. */
+#define VIRTIO_NET_F_HOST_ECN 13 /* Host can handle TSO[6] w/ ECN in. */
+#define VIRTIO_NET_F_HOST_UFO 14 /* Host can handle UFO in. */
+#define VIRTIO_NET_F_MRG_RXBUF 15 /* Host can merge receive buffers. */
+#define VIRTIO_NET_F_STATUS 16 /* virtio_net_config.status available */
+#define VIRTIO_NET_F_CTRL_VQ 17 /* Control channel available */
+#define VIRTIO_NET_F_CTRL_RX 18 /* Control channel RX mode support */
+#define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */
+#define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */
+#define VIRTIO_NET_F_GUEST_ANNOUNCE 21 /* Guest can announce device on the
+ * network */
+#define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow
+ * Steering */
+#define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */
+
+/* Do we get callbacks when the ring is completely used, even if we've
+ * suppressed them? */
+#define VIRTIO_F_NOTIFY_ON_EMPTY 24
+
+/* Can the device handle any descriptor layout? */
+#define VIRTIO_F_ANY_LAYOUT 27
+
+/* We support indirect buffer descriptors */
+#define VIRTIO_RING_F_INDIRECT_DESC 28
+
+/*
+ * Some VirtIO feature bits (currently bits 28 through 31) are
+ * reserved for the transport being used (eg. virtio_ring), the
+ * rest are per-device feature bits.
*/
-#define VIRTIO_RING_F_EVENT_IDX 0x20000000
+#define VIRTIO_TRANSPORT_F_START 28
+#define VIRTIO_TRANSPORT_F_END 32
+
+/* The Guest publishes the used index for which it expects an interrupt
+ * at the end of the avail ring. Host should ignore the avail->flags field. */
+/* The Host publishes the avail index for which it expects a kick
+ * at the end of the used ring. Guest should ignore the used->flags field. */
+#define VIRTIO_RING_F_EVENT_IDX 29
-#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
+#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
+#define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */
/*
* Maximum number of virtqueues per device.
@@ -243,9 +245,9 @@ outl_p(unsigned int data, unsigned int port)
outl_p((unsigned int)(value), (VIRTIO_PCI_REG_ADDR((hw), (reg))))
static inline int
-vtpci_with_feature(struct virtio_hw *hw, uint32_t feature)
+vtpci_with_feature(struct virtio_hw *hw, uint32_t bit)
{
- return (hw->guest_features & feature) != 0;
+ return (hw->guest_features & (1u << bit)) != 0;
}
/*
@@ -201,18 +201,12 @@ struct virtqueue {
};
/* If multiqueue is provided by host, then we suppport it. */
-#ifndef VIRTIO_NET_F_MQ
-/* Device supports Receive Flow Steering */
-#define VIRTIO_NET_F_MQ 0x400000
#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
-#endif
-#ifndef VIRTIO_NET_F_CTRL_MAC_ADDR
-#define VIRTIO_NET_F_CTRL_MAC_ADDR 0x800000
+
#define VIRTIO_NET_CTRL_MAC_ADDR_SET 1
-#endif
/**
* This is the first element of the scatter-gather list. If you don't