VPP-106: Patch e40i driver to support VLAN sub-interface 65/1365/1
authorJohn Lo <loj@cisco.com>
Thu, 2 Jun 2016 19:52:21 +0000 (15:52 -0400)
committerJohn Lo <loj@cisco.com>
Thu, 2 Jun 2016 19:52:21 +0000 (15:52 -0400)
Check packet for presence of VLAN tag in the MAC header and set
the PKT_RX_VLAN_PKT flag to trigger sub-interface lookup in VPP
ethernet-input node.

Change-Id: Iadbfc59d08ef85efb936c88323a90194f3cd656f
Signed-off-by: John Lo <loj@cisco.com>
dpdk/dpdk-16.04_patches/0017-i40e-Set-PKT_RX_VLAN_PKT-flag-for-VLAN-packets.patch [new file with mode: 0755]

diff --git a/dpdk/dpdk-16.04_patches/0017-i40e-Set-PKT_RX_VLAN_PKT-flag-for-VLAN-packets.patch b/dpdk/dpdk-16.04_patches/0017-i40e-Set-PKT_RX_VLAN_PKT-flag-for-VLAN-packets.patch
new file mode 100755 (executable)
index 0000000..f8f69b0
--- /dev/null
@@ -0,0 +1,41 @@
+From af8bfd030fdaa0acb3222296ab7a24bc4ac196f5 Mon Sep 17 00:00:00 2001
+From: Georgi Savov <gsavov@cisco.com>
+Date: Tue, 10 May 2016 10:59:55 -0400
+Subject: [PATCH 30/31] i40e Set PKT_RX_VLAN_PKT flag for VLAN packets
+
+---
+ drivers/net/i40e/i40e_rxtx.c | 18 +++++++++++++++++-
+ 1 file changed, 17 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
+index 39d94ec..07341df 100644
+--- a/drivers/net/i40e/i40e_rxtx.c
++++ b/drivers/net/i40e/i40e_rxtx.c
+@@ -99,7 +99,23 @@ i40e_rxd_to_vlan_tci(struct rte_mbuf *mb, volatile union i40e_rx_desc *rxdp)
+               PMD_RX_LOG(DEBUG, "Descriptor l2tag1: %u",
+                          rte_le_to_cpu_16(rxdp->wb.qword0.lo_dword.l2tag1));
+       } else {
+-              mb->vlan_tci = 0;
++              struct ether_hdr *eth_hdr = rte_pktmbuf_mtod(mb, struct ether_hdr *);
++              u16 eth_type = eth_hdr->ether_type;
++
++              // The i40e firmware does not flag VLAN tagged packets if
++              // VLAN stripping is disabled so we need to check the
++              // ethernet header to find out if the received packet
++              // is a VLAN packet
++              if ((eth_type == rte_be_to_cpu_16(ETHER_TYPE_VLAN))      ||
++                  (eth_type == rte_be_to_cpu_16(ETHER_TYPE_VLAN_AD))   ||
++                  (eth_type == rte_be_to_cpu_16(ETHER_TYPE_VLAN_9100)) ||
++                  (eth_type == rte_be_to_cpu_16(ETHER_TYPE_VLAN_9200))) {
++                      struct vlan_hdr *vhdr = (struct vlan_hdr *)(eth_hdr+1);
++                      mb->ol_flags |= PKT_RX_VLAN_PKT;
++                      mb->vlan_tci = rte_be_to_cpu_16(vhdr->vlan_tci);
++              } else {
++                      mb->vlan_tci = 0;
++              }
+       }
+ #ifndef RTE_LIBRTE_I40E_16BYTE_RX_DESC
+       if (rte_le_to_cpu_16(rxdp->wb.qword2.ext_status) &
+-- 
+1.9.1
+