From c085c9f9a7332c63d002169581edc89ef99fdbb1 Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Wed, 16 Dec 2015 03:21:21 +0100 Subject: [PATCH 1/6] 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 4a987e3..d6a4ce5 100644 --- a/drivers/net/e1000/igb_rxtx.c +++ b/drivers/net/e1000/igb_rxtx.c @@ -904,6 +904,21 @@ eth_igb_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(rxq, 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; rxm->packet_type = igb_rxd_pkt_info_to_pkt_type(rxd.wb.lower. lo_dword.hs_rss.pkt_info); @@ -1140,6 +1155,21 @@ eth_igb_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(rxq, 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; first_seg->packet_type = igb_rxd_pkt_info_to_pkt_type(rxd.wb. lower.lo_dword.hs_rss.pkt_info); diff --git a/lib/librte_ether/rte_ether.h b/lib/librte_ether/rte_ether.h index 1d62d8e..341121a 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.7.4