Fix dpdk-input check for VLAN packets including VLAN strip case 55/4355/3
authorJohn Lo <loj@cisco.com>
Fri, 16 Dec 2016 04:25:04 +0000 (23:25 -0500)
committerDave Barach <openvpp@barachs.net>
Fri, 16 Dec 2016 14:29:31 +0000 (14:29 +0000)
For DPDK-16.11 or later, use packet_type to check packets with VLAN
tags. For earlier versions of DPDK, keep using ol_flags but include
PKT_RX_VLAN_STRIPPED bit as part of the VLAN tags check.

Change-Id: Ic4ad8f04e44658dc0a99de0232fdc949cfa13e93
Signed-off-by: John Lo <loj@cisco.com>
vnet/vnet/devices/dpdk/node.c

index 5f9c95a..4e66877 100644 (file)
@@ -34,6 +34,15 @@ static char *dpdk_error_strings[] = {
 #undef _
 };
 
+#if RTE_VERSION >= RTE_VERSION_NUM(16, 11, 0, 0)
+always_inline int
+dpdk_mbuf_is_vlan (struct rte_mbuf *mb)
+{
+  return (mb->packet_type & RTE_PTYPE_L2_ETHER_VLAN) ==
+    RTE_PTYPE_L2_ETHER_VLAN;
+}
+#endif
+
 always_inline int
 dpdk_mbuf_is_ip4 (struct rte_mbuf *mb)
 {
@@ -58,7 +67,13 @@ dpdk_rx_next_from_mb (struct rte_mbuf *mb, vlib_buffer_t * b0, u32 * next0)
 {
   u32 n0;
 
-  if (PREDICT_FALSE ((mb->ol_flags & PKT_RX_VLAN_PKT)))
+#if RTE_VERSION < RTE_VERSION_NUM(16, 11, 0, 0)
+  if (PREDICT_FALSE
+      ((mb->ol_flags & (PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED)) ==
+       PKT_RX_VLAN_PKT))
+#else
+  if (PREDICT_FALSE (dpdk_mbuf_is_vlan (mb)))
+#endif
     n0 = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
   else if (PREDICT_TRUE (dpdk_mbuf_is_ip4 (mb)))
     n0 = VNET_DEVICE_INPUT_NEXT_IP4_INPUT;