From patchwork Tue Aug 26 02:07:52 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 214 Return-Path: Received: from mail-pd0-f175.google.com (mail-pd0-f175.google.com [209.85.192.175]) by dpdk.org (Postfix) with ESMTP id 5742C6A98 for ; Tue, 26 Aug 2014 04:04:54 +0200 (CEST) Received: by mail-pd0-f175.google.com with SMTP id r10so21550610pdi.34 for ; Mon, 25 Aug 2014 19:08:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:user-agent:date:from:to:cc:subject :references:mime-version:content-type:content-disposition; bh=xzBwBw2nnpClwbt7Dndma1vn3EYoYFfFLtK59LqcF1U=; b=CopndA5KfhKkDavmw8L2oGKVnzp2M+1/6biXry808vhMDvJgnjcVCjxxxkAp4V2J5T Y59mK59A6UIM/zVI/Bv7zfOzNVa20PMpud2GvRIb8odF4OrmG8UnAEdcVODMfWSh9RB6 +ERwsxIsI9Qy/aZpTxdAydm/DO6OUuMN3IrKfsDy2RouNo8s+epiNQBtM5BJZzuvCu7D iqxs4FknyE58JRb9f1pLqOl9KRgjl8fOf8rHSzQOJHdF84xQLcre/Dz6Udf0tLBzH3wS TWtYIXeHRhPcoWyqrs+dTK1sElKtwoqmyTg0u++wlFdlLFHZddHSsumJRJqJ59ANJ2QB zTQw== X-Gm-Message-State: ALoCoQmiT7c3NkpgnL6tckjJtbUM/auM0hCtCQWVa73ORofEhiMoUUOtu0kCekBg3nrVKxcADJ7I X-Received: by 10.66.157.40 with SMTP id wj8mr33314863pab.42.1409018931426; Mon, 25 Aug 2014 19:08:51 -0700 (PDT) Received: from localhost (static-50-53-65-80.bvtn.or.frontiernet.net. [50.53.65.80]) by mx.google.com with ESMTPSA id bq17sm4462556pac.47.2014.08.25.19.08.49 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Aug 2014 19:08:49 -0700 (PDT) Message-Id: <20140826020848.386074683@networkplumber.org> User-Agent: quilt/0.63-1 Date: Mon, 25 Aug 2014 19:07:52 -0700 From: Stephen Hemminger To: Ouyang Changchun References: <20140826020746.062748014@networkplumber.org> MIME-Version: 1.0 Content-Disposition: inline; filename=virtio-vlan-tag.patch Cc: dev@dpdk.org Subject: [dpdk-dev] [RFC 06/10] virtio: use software vlan stripping X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Aug 2014 02:04:55 -0000 Implement VLAN stripping in software. This allows application to be device independent. Signed-off-by: Stephen Hemminger --- 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 #include #include +#include #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)) {