From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pd0-f182.google.com (mail-pd0-f182.google.com [209.85.192.182]) by dpdk.org (Postfix) with ESMTP id 9176AB396 for ; Wed, 17 Sep 2014 22:41:13 +0200 (CEST) Received: by mail-pd0-f182.google.com with SMTP id w10so2878165pde.41 for ; Wed, 17 Sep 2014 13:46:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=u1JqXrN5CPX7mh4uJYBv0FkUxgsERusXrqK9u/1T558=; b=YfVyWKvIsikumsgUTSSxaE803eEJsaRmpxZzzhD66vekIHtkHsv3+na0FgR5f0TBo2 JRsrDkoSWElNI+a1WFUaprr8IgWdXFonreQpj1Gnq5oHh2Cb9CjNOHHWlh+bBnR0/CpW w/qbQ8+Z+8k/zt+K9s5RtHRA7LwLVU9vEe9hAJqLuYYntM57AtbGZmt0QQi2atUy+YeF hmJ3U7JtWWqE0h819r086fAiDTdDc31nYT4ZJou5zMy6ARXVzMCSahY1qqjqFee/nIU7 V74YIwGmrWhem2AAakKWARUegSzrUSjTccP/azSkIh9MsR2Q4XEU9eIrfLeCB3Zjr/6j NHrA== X-Gm-Message-State: ALoCoQm+AAjMA+06gYFz2L9l9qa1TOZ7zIbI5toeNrlyQZiKH1klrHT3sLkXGi7waTf2GIXjBNB1 X-Received: by 10.68.203.5 with SMTP id km5mr79097pbc.91.1410986814940; Wed, 17 Sep 2014 13:46:54 -0700 (PDT) Received: from urahara (static-50-53-65-80.bvtn.or.frontiernet.net. [50.53.65.80]) by mx.google.com with ESMTPSA id qp9sm17755493pbc.31.2014.09.17.13.46.52 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Sep 2014 13:46:54 -0700 (PDT) Date: Wed, 17 Sep 2014 13:46:46 -0700 From: Stephen Hemminger To: Bruce Richardson Message-ID: <20140917134646.7a8511f3@urahara> In-Reply-To: <1410948102-12740-6-git-send-email-bruce.richardson@intel.com> References: <1410948102-12740-1-git-send-email-bruce.richardson@intel.com> <1410948102-12740-6-git-send-email-bruce.richardson@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Cc: dev@dpdk.org Subject: Re: [dpdk-dev] [PATCH 5/5] mbuf: Add in second vlan tag field to mbuf 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: Wed, 17 Sep 2014 20:41:14 -0000 On Wed, 17 Sep 2014 11:01:42 +0100 Bruce Richardson wrote: > Packets with double vlan tags are relatively common. Applications can be > written to use these, and some NICs (such as those supported by the i40e > driver) have hardware support for double vlan tags. To support apps and > drivers using double vlan tags, we need to add in a second vlan tag > field into the mbuf. The existing vlan_tci field is renamed vlan_tci0 to > take account of the fact that there is now a vlan_tci1 field. > > Signed-off-by: Bruce Richardson > --- > app/test-pmd/flowgen.c | 2 +- > app/test-pmd/macfwd.c | 2 +- > app/test-pmd/macswap.c | 2 +- > app/test-pmd/rxonly.c | 2 +- > app/test-pmd/testpmd.c | 4 ++-- > app/test-pmd/txonly.c | 2 +- > app/test/packet_burst_generator.c | 4 ++-- > examples/ipv4_multicast/main.c | 3 ++- > examples/vhost/main.c | 2 +- > lib/librte_mbuf/rte_mbuf.h | 10 ++++++---- > lib/librte_pmd_e1000/em_rxtx.c | 8 ++++---- > lib/librte_pmd_e1000/igb_rxtx.c | 6 +++--- > lib/librte_pmd_i40e/i40e_rxtx.c | 8 ++++---- > lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 8 ++++---- > lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c | 4 ++-- > 15 files changed, 35 insertions(+), 32 deletions(-) > > diff --git a/app/test-pmd/flowgen.c b/app/test-pmd/flowgen.c > index 8b4ed9a..cd68916 100644 > --- a/app/test-pmd/flowgen.c > +++ b/app/test-pmd/flowgen.c > @@ -208,7 +208,7 @@ pkt_burst_flow_gen(struct fwd_stream *fs) > pkt->nb_segs = 1; > pkt->pkt_len = pkt_size; > pkt->ol_flags = ol_flags; > - pkt->vlan_tci = vlan_tci; > + pkt->vlan_tci0 = vlan_tci; > pkt->l2_len = sizeof(struct ether_hdr); > pkt->l3_len = sizeof(struct ipv4_hdr); > pkts_burst[nb_pkt] = pkt; > diff --git a/app/test-pmd/macfwd.c b/app/test-pmd/macfwd.c > index 38bae23..3e91050 100644 > --- a/app/test-pmd/macfwd.c > +++ b/app/test-pmd/macfwd.c > @@ -118,7 +118,7 @@ pkt_burst_mac_forward(struct fwd_stream *fs) > mb->ol_flags = txp->tx_ol_flags; > mb->l2_len = sizeof(struct ether_hdr); > mb->l3_len = sizeof(struct ipv4_hdr); > - mb->vlan_tci = txp->tx_vlan_id; > + mb->vlan_tci0 = txp->tx_vlan_id; > } > nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_rx); > fs->tx_packets += nb_tx; > diff --git a/app/test-pmd/macswap.c b/app/test-pmd/macswap.c > index 1786095..02b04d7 100644 > --- a/app/test-pmd/macswap.c > +++ b/app/test-pmd/macswap.c > @@ -120,7 +120,7 @@ pkt_burst_mac_swap(struct fwd_stream *fs) > mb->ol_flags = txp->tx_ol_flags; > mb->l2_len = sizeof(struct ether_hdr); > mb->l3_len = sizeof(struct ipv4_hdr); > - mb->vlan_tci = txp->tx_vlan_id; > + mb->vlan_tci0 = txp->tx_vlan_id; > } > nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_rx); > fs->tx_packets += nb_tx; > diff --git a/app/test-pmd/rxonly.c b/app/test-pmd/rxonly.c > index 98c788b..a4c8797 100644 > --- a/app/test-pmd/rxonly.c > +++ b/app/test-pmd/rxonly.c > @@ -165,7 +165,7 @@ pkt_burst_receive(struct fwd_stream *fs) > printf(" - FDIR hash=0x%x - FDIR id=0x%x ", > mb->hash.fdir.hash, mb->hash.fdir.id); > if (ol_flags & PKT_RX_VLAN_PKT) > - printf(" - VLAN tci=0x%x", mb->vlan_tci); > + printf(" - VLAN tci0=0x%x", mb->vlan_tci0); > printf("\n"); > if (ol_flags != 0) { > int rxf; > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c > index 5751607..fdf3296 100644 > --- a/app/test-pmd/testpmd.c > +++ b/app/test-pmd/testpmd.c > @@ -406,8 +406,8 @@ testpmd_mbuf_ctor(struct rte_mempool *mp, > mb->ol_flags = 0; > mb->data_off = RTE_PKTMBUF_HEADROOM; > mb->nb_segs = 1; > - mb->l2_l3_len = 0; > - mb->vlan_tci = 0; > + mb->l2_l3_len = 0; > + mb->vlan_tci0 = 0; > mb->hash.rss = 0; > } > > diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c > index 3d08005..52b2f06 100644 > --- a/app/test-pmd/txonly.c > +++ b/app/test-pmd/txonly.c > @@ -264,7 +264,7 @@ pkt_burst_transmit(struct fwd_stream *fs) > pkt->nb_segs = tx_pkt_nb_segs; > pkt->pkt_len = tx_pkt_length; > pkt->ol_flags = ol_flags; > - pkt->vlan_tci = vlan_tci; > + pkt->vlan_tci0 = vlan_tci; > pkt->l2_len = sizeof(struct ether_hdr); > pkt->l3_len = sizeof(struct ipv4_hdr); > pkts_burst[nb_pkt] = pkt; > diff --git a/app/test/packet_burst_generator.c b/app/test/packet_burst_generator.c > index 9e747a4..66f2a29 100644 > --- a/app/test/packet_burst_generator.c > +++ b/app/test/packet_burst_generator.c > @@ -264,7 +264,7 @@ nomore_mbuf: > pkt->l2_len = eth_hdr_size; > > if (ipv4) { > - pkt->vlan_tci = ETHER_TYPE_IPv4; > + pkt->vlan_tci0 = ETHER_TYPE_IPv4; > pkt->l3_len = sizeof(struct ipv4_hdr); > > if (vlan_enabled) > @@ -272,7 +272,7 @@ nomore_mbuf: > else > pkt->ol_flags = PKT_RX_IPV4_HDR; > } else { > - pkt->vlan_tci = ETHER_TYPE_IPv6; > + pkt->vlan_tci0 = ETHER_TYPE_IPv6; > pkt->l3_len = sizeof(struct ipv6_hdr); > > if (vlan_enabled) > diff --git a/examples/ipv4_multicast/main.c b/examples/ipv4_multicast/main.c > index 35bd842..54d0782 100644 > --- a/examples/ipv4_multicast/main.c > +++ b/examples/ipv4_multicast/main.c > @@ -338,7 +338,8 @@ mcast_out_pkt(struct rte_mbuf *pkt, int use_clone) > > /* copy metadata from source packet*/ > hdr->port = pkt->port; > - hdr->vlan_tci = pkt->vlan_tci; > + hdr->vlan_tci0 = pkt->vlan_tci0; > + hdr->vlan_tci1 = pkt->vlan_tci1; > hdr->l2_l3_len = pkt->l2_l3_len; > hdr->hash = pkt->hash; > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c > index 85ee8b8..dc2177b 100644 > --- a/examples/vhost/main.c > +++ b/examples/vhost/main.c > @@ -2693,7 +2693,7 @@ virtio_tx_route_zcp(struct virtio_net *dev, struct rte_mbuf *m, > mbuf->buf_addr = m->buf_addr; > } > mbuf->ol_flags = PKT_TX_VLAN_PKT; > - mbuf->vlan_tci = vlan_tag; > + mbuf->vlan_tci0 = vlan_tag; > mbuf->l2_len = sizeof(struct ether_hdr); > mbuf->l3_len = sizeof(struct ipv4_hdr); > MBUF_HEADROOM_UINT32(mbuf) = (uint32_t)desc_idx; > diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h > index b1acfc3..0991788 100644 > --- a/lib/librte_mbuf/rte_mbuf.h > +++ b/lib/librte_mbuf/rte_mbuf.h > @@ -159,8 +159,8 @@ struct rte_mbuf { > uint16_t reserved2; /**< Unused field. Required for padding */ > uint16_t data_len; /**< Amount of data in segment buffer. */ > uint32_t pkt_len; /**< Total pkt len: sum of all segments. */ > - uint16_t reserved; > - uint16_t vlan_tci; /**< VLAN Tag Control Identifier (CPU order) */ > + uint16_t vlan_tci0; /**< VLAN Tag Control Identifier (CPU order) */ > + uint16_t vlan_tci1; /**< Second VLAN Tag Control Identifier */ > union { > uint32_t rss; /**< RSS hash result if RSS enabled */ > struct { > @@ -536,7 +536,8 @@ static inline void rte_pktmbuf_reset(struct rte_mbuf *m) > m->next = NULL; > m->pkt_len = 0; > m->l2_l3_len = 0; > - m->vlan_tci = 0; > + m->vlan_tci0 = 0; > + m->vlan_tci1 = 0; > m->nb_segs = 1; > m->port = 0xff; > > @@ -602,7 +603,8 @@ static inline void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *md) > mi->data_off = md->data_off; > mi->data_len = md->data_len; > mi->port = md->port; > - mi->vlan_tci = md->vlan_tci; > + mi->vlan_tci0 = md->vlan_tci0; > + mi->vlan_tci1 = md->vlan_tci1; > mi->l2_l3_len = md->l2_l3_len; > mi->hash = md->hash; > > diff --git a/lib/librte_pmd_e1000/em_rxtx.c b/lib/librte_pmd_e1000/em_rxtx.c > index b8423b4..3b05a03 100644 > --- a/lib/librte_pmd_e1000/em_rxtx.c > +++ b/lib/librte_pmd_e1000/em_rxtx.c > @@ -440,7 +440,7 @@ eth_em_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, > /* If hardware offload required */ > tx_ol_req = (ol_flags & (PKT_TX_IP_CKSUM | PKT_TX_L4_MASK)); > if (tx_ol_req) { > - hdrlen.f.vlan_tci = tx_pkt->vlan_tci; > + hdrlen.f.vlan_tci = tx_pkt->vlan_tci0; > hdrlen.f.l2_len = tx_pkt->l2_len; > hdrlen.f.l3_len = tx_pkt->l3_len; > /* If new context to be built or reuse the exist ctx. */ > @@ -537,7 +537,7 @@ eth_em_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, > /* Set VLAN Tag offload fields. */ > if (ol_flags & PKT_TX_VLAN_PKT) { > cmd_type_len |= E1000_TXD_CMD_VLE; > - popts_spec = tx_pkt->vlan_tci << E1000_TXD_VLAN_SHIFT; > + popts_spec = tx_pkt->vlan_tci0 << E1000_TXD_VLAN_SHIFT; > } > > if (tx_ol_req) { > @@ -803,7 +803,7 @@ eth_em_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, > rx_desc_error_to_pkt_flags(rxd.errors); > > /* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */ > - rxm->vlan_tci = rte_le_to_cpu_16(rxd.special); > + rxm->vlan_tci0 = rte_le_to_cpu_16(rxd.special); > > /* > * Store the mbuf address into the next entry of the array > @@ -1029,7 +1029,7 @@ eth_em_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, > rx_desc_error_to_pkt_flags(rxd.errors); > > /* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */ > - rxm->vlan_tci = rte_le_to_cpu_16(rxd.special); > + rxm->vlan_tci0 = rte_le_to_cpu_16(rxd.special); > > /* Prefetch data of first segment, if configured to do so. */ > rte_packet_prefetch((char *)first_seg->buf_addr + > diff --git a/lib/librte_pmd_e1000/igb_rxtx.c b/lib/librte_pmd_e1000/igb_rxtx.c > index 56d1dfc..76391d6 100644 > --- a/lib/librte_pmd_e1000/igb_rxtx.c > +++ b/lib/librte_pmd_e1000/igb_rxtx.c > @@ -398,7 +398,7 @@ eth_igb_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, > tx_last = (uint16_t) (tx_id + tx_pkt->nb_segs - 1); > > ol_flags = tx_pkt->ol_flags; > - vlan_macip_lens.f.vlan_tci = tx_pkt->vlan_tci; > + vlan_macip_lens.f.vlan_tci = tx_pkt->vlan_tci0; > vlan_macip_lens.f.l2_l3_len = tx_pkt->l2_l3_len; > tx_ol_req = ol_flags & PKT_TX_OFFLOAD_MASK; > > @@ -781,7 +781,7 @@ eth_igb_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, > rxm->hash.rss = rxd.wb.lower.hi_dword.rss; > hlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data); > /* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */ > - rxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan); > + rxm->vlan_tci0 = rte_le_to_cpu_16(rxd.wb.upper.vlan); > > pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss); > pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr); > @@ -1015,7 +1015,7 @@ eth_igb_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, > * The vlan_tci field is only valid when PKT_RX_VLAN_PKT is > * set in the pkt_flags field. > */ > - first_seg->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan); > + first_seg->vlan_tci0 = rte_le_to_cpu_16(rxd.wb.upper.vlan); > hlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data); > pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss); > pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr); > diff --git a/lib/librte_pmd_i40e/i40e_rxtx.c b/lib/librte_pmd_i40e/i40e_rxtx.c > index cd05654..e753495 100644 > --- a/lib/librte_pmd_i40e/i40e_rxtx.c > +++ b/lib/librte_pmd_i40e/i40e_rxtx.c > @@ -611,7 +611,7 @@ i40e_rx_scan_hw_ring(struct i40e_rx_queue *rxq) > I40E_RXD_QW1_LENGTH_PBUF_SHIFT) - rxq->crc_len; > mb->data_len = pkt_len; > mb->pkt_len = pkt_len; > - mb->vlan_tci = rx_status & > + mb->vlan_tci0 = rx_status & > (1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT) ? > rte_le_to_cpu_16(\ > rxdp[j].wb.qword0.lo_dword.l2tag1) : 0; > @@ -848,7 +848,7 @@ i40e_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) > rxm->data_len = rx_packet_len; > rxm->port = rxq->port_id; > > - rxm->vlan_tci = rx_status & > + rxm->vlan_tci0 = rx_status & > (1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT) ? > rte_le_to_cpu_16(rxd.wb.qword0.lo_dword.l2tag1) : 0; > pkt_flags = i40e_rxd_status_to_pkt_flags(qword1); > @@ -1002,7 +1002,7 @@ i40e_recv_scattered_pkts(void *rx_queue, > } > > first_seg->port = rxq->port_id; > - first_seg->vlan_tci = (rx_status & > + first_seg->vlan_tci0 = (rx_status & > (1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)) ? > rte_le_to_cpu_16(rxd.wb.qword0.lo_dword.l2tag1) : 0; > pkt_flags = i40e_rxd_status_to_pkt_flags(qword1); > @@ -1142,7 +1142,7 @@ i40e_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) > > /* Descriptor based VLAN insertion */ > if (ol_flags & PKT_TX_VLAN_PKT) { > - tx_flags |= tx_pkt->vlan_tci << > + tx_flags |= tx_pkt->vlan_tci0 << > I40E_TX_FLAG_L2TAG1_SHIFT; > tx_flags |= I40E_TX_FLAG_INSERT_VLAN; > td_cmd |= I40E_TX_DESC_CMD_IL2TAG1; > diff --git a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c > index c0bb49f..3a43cb8 100644 > --- a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c > +++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c > @@ -582,7 +582,7 @@ ixgbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, > /* If hardware offload required */ > tx_ol_req = ol_flags & PKT_TX_OFFLOAD_MASK; > if (tx_ol_req) { > - vlan_macip_lens.f.vlan_tci = tx_pkt->vlan_tci; > + vlan_macip_lens.f.vlan_tci = tx_pkt->vlan_tci0; > vlan_macip_lens.f.l2_l3_len = tx_pkt->l2_l3_len; > > /* If new context need be built or reuse the exist ctx. */ > @@ -940,7 +940,7 @@ ixgbe_rx_scan_hw_ring(struct igb_rx_queue *rxq) > rxq->crc_len); > mb->data_len = pkt_len; > mb->pkt_len = pkt_len; > - mb->vlan_tci = rxdp[j].wb.upper.vlan; > + mb->vlan_tci0 = rxdp[j].wb.upper.vlan; > mb->hash.rss = rxdp[j].wb.lower.hi_dword.rss; > > /* convert descriptor fields to rte mbuf flags */ > @@ -1258,7 +1258,7 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, > > hlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data); > /* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */ > - rxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan); > + rxm->vlan_tci0 = rte_le_to_cpu_16(rxd.wb.upper.vlan); > > pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss); > pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr); > @@ -1500,7 +1500,7 @@ ixgbe_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, > * The vlan_tci field is only valid when PKT_RX_VLAN_PKT is > * set in the pkt_flags field. > */ > - first_seg->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan); > + first_seg->vlan_tci0 = rte_le_to_cpu_16(rxd.wb.upper.vlan); > hlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data); > pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss); > pkt_flags = (uint16_t)(pkt_flags | > diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c > index 263f9ce..998c50a 100644 > --- a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c > +++ b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c > @@ -550,7 +550,7 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) > rte_pktmbuf_mtod(rxm, void *)); > #endif > /* Copy vlan tag in packet buffer */ > - rxm->vlan_tci = rte_le_to_cpu_16( > + rxm->vlan_tci0 = rte_le_to_cpu_16( > (uint16_t)rcd->tci); > > } else > @@ -563,7 +563,7 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) > rxm->pkt_len = (uint16_t)rcd->len; > rxm->data_len = (uint16_t)rcd->len; > rxm->port = rxq->port_id; > - rxm->vlan_tci = 0; > + rxm->vlan_tci0 = 0; > rxm->data_off = RTE_PKTMBUF_HEADROOM; > > rx_pkts[nb_rx++] = rxm; You need to add feature flags for when driver is doing offload, and have a software routine to add/delete tag?