summaryrefslogtreecommitdiffstats
path: root/vnet/vnet/devices/dpdk/node.c
diff options
context:
space:
mode:
Diffstat (limited to 'vnet/vnet/devices/dpdk/node.c')
-rw-r--r--vnet/vnet/devices/dpdk/node.c114
1 files changed, 76 insertions, 38 deletions
diff --git a/vnet/vnet/devices/dpdk/node.c b/vnet/vnet/devices/dpdk/node.c
index 4e668776530..e541cdbcbd2 100644
--- a/vnet/vnet/devices/dpdk/node.c
+++ b/vnet/vnet/devices/dpdk/node.c
@@ -34,14 +34,61 @@ static char *dpdk_error_strings[] = {
#undef _
};
-#if RTE_VERSION >= RTE_VERSION_NUM(16, 11, 0, 0)
+always_inline int
+vlib_buffer_is_ip4 (vlib_buffer_t * b)
+{
+ ethernet_header_t *h = (ethernet_header_t *) b->data;
+ return (h->type == clib_host_to_net_u16 (ETHERNET_TYPE_IP4));
+}
+
+always_inline int
+vlib_buffer_is_ip6 (vlib_buffer_t * b)
+{
+ ethernet_header_t *h = (ethernet_header_t *) b->data;
+ return (h->type == clib_host_to_net_u16 (ETHERNET_TYPE_IP6));
+}
+
+always_inline int
+vlib_buffer_is_mpls (vlib_buffer_t * b)
+{
+ ethernet_header_t *h = (ethernet_header_t *) b->data;
+ return (h->type == clib_host_to_net_u16 (ETHERNET_TYPE_MPLS_UNICAST));
+}
+
+#if RTE_VERSION < RTE_VERSION_NUM(16, 11, 0, 0)
+/* New ol_flags bits added in DPDK-16.11 */
+#define PKT_RX_IP_CKSUM_GOOD (1ULL << 7)
+#endif
+
+always_inline u32
+dpdk_rx_next_from_etype (struct rte_mbuf * mb, vlib_buffer_t * b0)
+{
+ if (PREDICT_TRUE (vlib_buffer_is_ip4 (b0)))
+ if (PREDICT_TRUE ((mb->ol_flags & PKT_RX_IP_CKSUM_GOOD) != 0))
+ return VNET_DEVICE_INPUT_NEXT_IP4_NCS_INPUT;
+ else
+ return VNET_DEVICE_INPUT_NEXT_IP4_INPUT;
+ else if (PREDICT_TRUE (vlib_buffer_is_ip6 (b0)))
+ return VNET_DEVICE_INPUT_NEXT_IP6_INPUT;
+ else if (PREDICT_TRUE (vlib_buffer_is_mpls (b0)))
+ return VNET_DEVICE_INPUT_NEXT_MPLS_INPUT;
+ else
+ return VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
+}
+
always_inline int
dpdk_mbuf_is_vlan (struct rte_mbuf *mb)
{
+#if RTE_VERSION >= RTE_VERSION_NUM(16, 11, 0, 0)
return (mb->packet_type & RTE_PTYPE_L2_ETHER_VLAN) ==
RTE_PTYPE_L2_ETHER_VLAN;
-}
+#else
+ return
+ (mb->ol_flags &
+ (PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED | PKT_RX_QINQ_STRIPPED)) ==
+ PKT_RX_VLAN_PKT;
#endif
+}
always_inline int
dpdk_mbuf_is_ip4 (struct rte_mbuf *mb)
@@ -55,35 +102,19 @@ dpdk_mbuf_is_ip6 (struct rte_mbuf *mb)
return RTE_ETH_IS_IPV6_HDR (mb->packet_type) != 0;
}
-always_inline int
-vlib_buffer_is_mpls (vlib_buffer_t * b)
-{
- ethernet_header_t *h = (ethernet_header_t *) b->data;
- return (h->type == clib_host_to_net_u16 (ETHERNET_TYPE_MPLS_UNICAST));
-}
-
-always_inline void
-dpdk_rx_next_from_mb (struct rte_mbuf *mb, vlib_buffer_t * b0, u32 * next0)
+always_inline u32
+dpdk_rx_next_from_mb (struct rte_mbuf * mb, vlib_buffer_t * b0)
{
- u32 n0;
-
-#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;
+ return VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
else if (PREDICT_TRUE (dpdk_mbuf_is_ip4 (mb)))
- n0 = VNET_DEVICE_INPUT_NEXT_IP4_INPUT;
+ return VNET_DEVICE_INPUT_NEXT_IP4_NCS_INPUT;
else if (PREDICT_TRUE (dpdk_mbuf_is_ip6 (mb)))
- n0 = VNET_DEVICE_INPUT_NEXT_IP6_INPUT;
+ return VNET_DEVICE_INPUT_NEXT_IP6_INPUT;
else if (PREDICT_TRUE (vlib_buffer_is_mpls (b0)))
- n0 = VNET_DEVICE_INPUT_NEXT_MPLS_INPUT;
+ return VNET_DEVICE_INPUT_NEXT_MPLS_INPUT;
else
- n0 = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
- *next0 = n0;
+ return dpdk_rx_next_from_etype (mb, b0);
}
always_inline void
@@ -127,10 +158,12 @@ dpdk_rx_trace (dpdk_main_t * dm,
if (PREDICT_FALSE (xd->per_interface_next_index != ~0))
next0 = xd->per_interface_next_index;
- else if (PREDICT_FALSE (xd->flags & DPDK_DEVICE_FLAG_HAVE_SUBIF))
- next0 = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
+ else if (PREDICT_TRUE
+ ((xd->flags & DPDK_DEVICE_FLAG_PMD_SUPPORTS_PTYPE) != 0))
+ next0 = dpdk_rx_next_from_mb (mb, b0);
else
- dpdk_rx_next_from_mb (mb, b0, &next0);
+ next0 = dpdk_rx_next_from_etype (mb, b0);
+
dpdk_rx_error_from_mb (mb, &next0, &error0);
vlib_trace_buffer (vm, node, next0, b0, /* follow_chain */ 0);
@@ -350,17 +383,20 @@ dpdk_device_input (dpdk_main_t * dm, dpdk_device_t * xd,
{
next0 = next1 = next2 = next3 = xd->per_interface_next_index;
}
- else if (PREDICT_FALSE (xd->flags & DPDK_DEVICE_FLAG_HAVE_SUBIF))
+ else if (PREDICT_TRUE
+ ((xd->flags & DPDK_DEVICE_FLAG_PMD_SUPPORTS_PTYPE) != 0))
{
- next0 = next1 = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
- next2 = next3 = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
+ next0 = dpdk_rx_next_from_mb (mb0, b0);
+ next1 = dpdk_rx_next_from_mb (mb1, b1);
+ next2 = dpdk_rx_next_from_mb (mb2, b2);
+ next3 = dpdk_rx_next_from_mb (mb3, b3);
}
else
{
- dpdk_rx_next_from_mb (mb0, b0, &next0);
- dpdk_rx_next_from_mb (mb1, b1, &next1);
- dpdk_rx_next_from_mb (mb2, b2, &next2);
- dpdk_rx_next_from_mb (mb3, b3, &next3);
+ next0 = dpdk_rx_next_from_etype (mb0, b0);
+ next1 = dpdk_rx_next_from_etype (mb1, b1);
+ next2 = dpdk_rx_next_from_etype (mb2, b2);
+ next3 = dpdk_rx_next_from_etype (mb3, b3);
}
if (PREDICT_FALSE (or_ol_flags & PKT_RX_IP_CKSUM_BAD))
@@ -475,10 +511,12 @@ dpdk_device_input (dpdk_main_t * dm, dpdk_device_t * xd,
if (PREDICT_FALSE (xd->per_interface_next_index != ~0))
next0 = xd->per_interface_next_index;
- else if (PREDICT_FALSE (xd->flags & DPDK_DEVICE_FLAG_HAVE_SUBIF))
- next0 = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
+ else if (PREDICT_TRUE
+ ((xd->flags & DPDK_DEVICE_FLAG_PMD_SUPPORTS_PTYPE) != 0))
+ next0 = dpdk_rx_next_from_mb (mb0, b0);
else
- dpdk_rx_next_from_mb (mb0, b0, &next0);
+ next0 = dpdk_rx_next_from_etype (mb0, b0);
+
dpdk_rx_error_from_mb (mb0, &next0, &error0);
b0->error = node->errors[error0];