aboutsummaryrefslogtreecommitdiffstats
path: root/dpdk/dpdk-2.1.0_patches/0003-e1000-Set-VLAN-Rx-Offload-tag-correctly.patch
blob: d1ea27ad7788a4e52493c41feb9bc3a177f11a62 (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
From 699252f0b685db4cd298e90f0e1d64e4792356f2 Mon Sep 17 00:00:00 2001
From: Damjan Marion <damarion@cisco.com>
Date: Wed, 21 Oct 2015 14:46:12 +0200
Subject: [PATCH 3/9] e1000: Set VLAN Rx Offload tag correctly

---
 drivers/net/e1000/igb_rxtx.c | 30 ++++++++++++++++++++++++++++++
 lib/librte_ether/rte_ether.h |  3 +++
 2 files changed, 33 insertions(+)

diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
index b13930e..7fe76c8 100644
--- a/drivers/net/e1000/igb_rxtx.c
+++ b/drivers/net/e1000/igb_rxtx.c
@@ -885,6 +885,21 @@ eth_igb_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss);
 		pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr);
 		pkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr);
+		{
+		  /*
+		   * Check packet for VLAN ethernet types and set
+		   * RX Offload flag PKT_RX_VLAN_PKT accordingly.
+		   */
+		  struct ether_hdr *eth_hdr = 
+              rte_pktmbuf_mtod(rxm, struct ether_hdr *);
+		  u16 eth_type = rte_be_to_cpu_16(eth_hdr->ether_type);
+
+		  if ((eth_type == ETHER_TYPE_VLAN) ||
+		      (eth_type == ETHER_TYPE_VLAN_AD) ||
+		      (eth_type == ETHER_TYPE_VLAN_9100) ||
+		      (eth_type == ETHER_TYPE_VLAN_9200))
+		    pkt_flags |= PKT_RX_VLAN_PKT;
+		}
 		rxm->ol_flags = pkt_flags;
 #ifdef RTE_NEXT_ABI
 		rxm->packet_type = igb_rxd_pkt_info_to_pkt_type(rxd.wb.lower.
@@ -1123,6 +1138,21 @@ eth_igb_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss);
 		pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr);
 		pkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr);
+		{
+		  /*
+		   * Check packet for VLAN ethernet types and set
+		   * RX Offload flag PKT_RX_VLAN_PKT accordingly.
+		   */
+		  struct ether_hdr *eth_hdr = 
+              rte_pktmbuf_mtod(rxm, struct ether_hdr *);
+		  u16 eth_type = rte_be_to_cpu_16(eth_hdr->ether_type);
+
+		  if ((eth_type == ETHER_TYPE_VLAN) ||
+		      (eth_type == ETHER_TYPE_VLAN_AD) ||
+		      (eth_type == ETHER_TYPE_VLAN_9100) ||
+		      (eth_type == ETHER_TYPE_VLAN_9200))
+		    pkt_flags |= PKT_RX_VLAN_PKT;
+		}
 		first_seg->ol_flags = pkt_flags;
 #ifdef RTE_NEXT_ABI
 		first_seg->packet_type = igb_rxd_pkt_info_to_pkt_type(rxd.wb.
diff --git a/lib/librte_ether/rte_ether.h b/lib/librte_ether/rte_ether.h
index 07c17d7..fd646ec 100644
--- a/lib/librte_ether/rte_ether.h
+++ b/lib/librte_ether/rte_ether.h
@@ -332,6 +332,9 @@ struct vxlan_hdr {
 #define ETHER_TYPE_1588 0x88F7 /**< IEEE 802.1AS 1588 Precise Time Protocol. */
 #define ETHER_TYPE_SLOW 0x8809 /**< Slow protocols (LACP and Marker). */
 #define ETHER_TYPE_TEB  0x6558 /**< Transparent Ethernet Bridging. */
+#define ETHER_TYPE_VLAN_AD     0x88a8 /**< IEEE 802.1AD VLAN tagging. */
+#define ETHER_TYPE_VLAN_9100   0x9100 /**< VLAN 0x9100 tagging. */
+#define ETHER_TYPE_VLAN_9200   0x9200 /**< VLAN 0x9200 tagging. */
 
 #define ETHER_VXLAN_HLEN (sizeof(struct udp_hdr) + sizeof(struct vxlan_hdr))
 /**< VXLAN tunnel header length. */
-- 
2.5.0