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)) {

Reply via email to