From: Chas Williams <3chas3@gmail.com> Subject: [PATCH 2/2] net/vhost: insert/strip VLAN header in software Date: Thu, 29 Mar 2018 12:05:07 -0400 Message-ID: <20180329160507.25081-2-3chas3@gmail.com> References: <20180329160507.25081-1-3chas3@gmail.com> Cc: mtetsuyah@gmail.com, yliu@fridaylinux.org, maxime.coquelin@redhat.com, Jan Blunck To: dev@dpdk.org Return-path: Received: from mail-qk0-f196.google.com (mail-qk0-f196.google.com [209.85.220.196]) by dpdk.org (Postfix) with ESMTP id B04F02965 for ; Thu, 29 Mar 2018 18:05:16 +0200 (CEST) Received: by mail-qk0-f196.google.com with SMTP id o64so6488285qkl.7 for ; Thu, 29 Mar 2018 09:05:16 -0700 (PDT) In-Reply-To: <20180329160507.25081-1-3chas3@gmail.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Jan Blunck This lets the vhost driver handle the VLAN header like the virtio driver in software. Signed-off-by: Jan Blunck --- drivers/net/vhost/rte_eth_vhost.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 453d9bee1..0beb28e94 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -119,6 +119,7 @@ struct pmd_internal { uint16_t max_queues; rte_atomic32_t started; int vid; + uint8_t vlan_strip; }; struct internal_list { @@ -422,6 +423,12 @@ eth_vhost_rx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs) for (i = 0; likely(i < nb_rx); i++) { bufs[i]->port = r->port; + bufs[i]->ol_flags = 0; + bufs[i]->vlan_tci = 0; + + if (r->internal->vlan_strip) + rte_vlan_strip(bufs[i]); + r->stats.bytes += bufs[i]->pkt_len; } @@ -438,7 +445,7 @@ eth_vhost_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs) { struct vhost_queue *r = q; uint16_t i, nb_tx = 0; - uint16_t nb_send = nb_bufs; + uint16_t nb_send = 0; if (unlikely(rte_atomic32_read(&r->allow_queuing) == 0)) return 0; @@ -448,6 +455,22 @@ eth_vhost_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs) if (unlikely(rte_atomic32_read(&r->allow_queuing) == 0)) goto out; + for (i = 0; i < nb_bufs; i++) { + struct rte_mbuf *m = bufs[i]; + + /* Do VLAN tag insertion */ + if (m->ol_flags & PKT_TX_VLAN_PKT) { + int error = rte_vlan_insert(&m); + if (unlikely(error)) { + rte_pktmbuf_free(m); + continue; + } + } + + bufs[nb_send] = m; + ++nb_send; + } + /* Enqueue packets to guest RX queue */ while (nb_send) { uint16_t nb_pkts; @@ -489,6 +512,16 @@ eth_vhost_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs) static int eth_dev_configure(struct rte_eth_dev *dev __rte_unused) { + struct pmd_internal *internal = dev->data->dev_private; + const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; + + internal->vlan_strip = rxmode->hw_vlan_strip; + + if (rxmode->hw_vlan_filter) + RTE_LOG(WARNING, PMD, + "vhost(%s): vlan filtering not available\n", + internal->dev_name); + return 0; } -- 2.13.6