[dpdk-dev] [RFC 06/10] virtio: use software vlan stripping

Stephen Hemminger stephen at networkplumber.org
Tue Aug 26 04:07:52 CEST 2014


Implement VLAN stripping in software. This allows application
to be device independent.

Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>


---
 lib/librte_pmd_virtio/virtio_ethdev.c |    2 ++
 lib/librte_pmd_virtio/virtio_pci.h    |    1 +
 lib/librte_pmd_virtio/virtio_rxtx.c   |   20 ++++++++++++++++++--
 3 files changed, 21 insertions(+), 2 deletions(-)

--- a/lib/librte_pmd_virtio/virtio_ethdev.c	2014-08-25 19:00:07.574537243 -0700
+++ b/lib/librte_pmd_virtio/virtio_ethdev.c	2014-08-25 19:00:07.574537243 -0700
@@ -976,6 +976,8 @@ virtio_dev_configure(struct rte_eth_dev
 		return (-EINVAL);
 	}
 
+	hw->vlan_strip = rxmode->hw_vlan_strip;
+
 	ret = vtpci_irq_config(hw, 0);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "failed to set config vector");
--- a/lib/librte_pmd_virtio/virtio_pci.h	2014-08-25 19:00:07.574537243 -0700
+++ b/lib/librte_pmd_virtio/virtio_pci.h	2014-08-25 19:00:07.574537243 -0700
@@ -168,6 +168,7 @@ struct virtio_hw {
 	uint32_t    max_tx_queues;
 	uint32_t    max_rx_queues;
 	uint16_t    vtnet_hdr_size;
+	uint8_t	    vlan_strip;
 	uint8_t	    use_msix;
 	uint8_t     mac_addr[ETHER_ADDR_LEN];
 };
--- a/lib/librte_pmd_virtio/virtio_rxtx.c	2014-08-25 19:00:07.574537243 -0700
+++ b/lib/librte_pmd_virtio/virtio_rxtx.c	2014-08-25 19:00:07.574537243 -0700
@@ -49,6 +49,7 @@
 #include <rte_prefetch.h>
 #include <rte_string_fns.h>
 #include <rte_errno.h>
+#include <rte_byteorder.h>
 
 #include "virtio_logs.h"
 #include "virtio_ethdev.h"
@@ -406,8 +407,8 @@ virtio_dev_tx_queue_setup(struct rte_eth
 
 	PMD_INIT_FUNC_TRACE();
 
-	if ((tx_conf->txq_flags & ETH_TXQ_FLAGS_NOOFFLOADS)
-	    != ETH_TXQ_FLAGS_NOOFFLOADS) {
+	if ((tx_conf->txq_flags & ETH_TXQ_FLAGS_NOXSUMS)
+	    != ETH_TXQ_FLAGS_NOXSUMS) {
 		PMD_INIT_LOG(ERR, "TX checksum offload not supported\n");
 		return -EINVAL;
 	}
@@ -444,6 +445,7 @@ uint16_t
 virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 {
 	struct virtqueue *rxvq = rx_queue;
+	struct virtio_hw *hw = rxvq->hw;
 	struct rte_mbuf *rxm, *new_mbuf;
 	uint16_t nb_used, num, nb_rx = 0;
 	uint32_t len[VIRTIO_MBUF_BURST_SZ];
@@ -487,6 +489,9 @@ virtio_recv_pkts(void *rx_queue, struct
 		rxm->pkt.pkt_len = (uint32_t)(len[i] - hdr_size);
 		rxm->pkt.data_len = (uint16_t)(len[i] - hdr_size);
 
+		if (hw->vlan_strip)
+			rte_vlan_strip(rxm);
+
 		VIRTIO_DUMP_PACKET(rxm, rxm->pkt.data_len);
 
 		rx_pkts[nb_rx++] = rxm;
@@ -711,6 +716,17 @@ virtio_xmit_pkts(void *tx_queue, struct
 
 		if (tx_pkts[nb_tx]->pkt.nb_segs <= txvq->vq_free_cnt) {
 			txm = tx_pkts[nb_tx];
+
+			/* Do VLAN tag insertion */
+			if (txm->ol_flags & PKT_TX_VLAN_PKT) {
+				error = rte_vlan_insert(txm);
+				if (unlikely(error)) {
+					rte_pktmbuf_free(txm);
+					++nb_tx;
+					continue;
+				}
+			}
+
 			/* Enqueue Packet buffers */
 			error = virtqueue_enqueue_xmit(txvq, txm);
 			if (unlikely(error)) {



More information about the dev mailing list