summaryrefslogtreecommitdiffstats
path: root/dpdk/dpdk-16.04_patches/0017-i40e-Set-PKT_RX_VLAN_PKT-flag-for-VLAN-packets.patch
blob: f8f69b0f2741664369217fca324b86ef2a673d6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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