X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fvxlan-gpe%2Fdecap.c;h=aea793b82b646c7e25cb958beff9bdfccf7fae33;hb=b040f98a88954ccf2e63fd7b2676865a2dbe0078;hp=b852704f6b4b2c90b4e84bfefd65389b2e441934;hpb=e1714d3ba2fa91db5fcede631e2acafca899604c;p=vpp.git diff --git a/src/vnet/vxlan-gpe/decap.c b/src/vnet/vxlan-gpe/decap.c index b852704f6b4..aea793b82b6 100644 --- a/src/vnet/vxlan-gpe/decap.c +++ b/src/vnet/vxlan-gpe/decap.c @@ -21,7 +21,7 @@ */ #include -#include +#include #include /** @@ -114,8 +114,7 @@ vxlan_gpe_input (vlib_main_t * vm, u32 last_tunnel_index = ~0; vxlan4_gpe_tunnel_key_t last_key4; vxlan6_gpe_tunnel_key_t last_key6; - u32 ip4_pkts_decapsulated = 0; - u32 ip6_pkts_decapsulated = 0; + u32 pkts_decapsulated = 0; u32 thread_index = vm->thread_index; u32 stats_sw_if_index, stats_n_packets, stats_n_bytes; @@ -345,11 +344,7 @@ vxlan_gpe_input (vlib_main_t * vm, */ vnet_buffer (b0)->sw_if_index[VLIB_TX] = t0->decap_fib_index; - if (is_ip4) - ip4_pkts_decapsulated++; - else - ip6_pkts_decapsulated++; - + pkts_decapsulated++; stats_n_packets += 1; stats_n_bytes += len0; @@ -440,11 +435,7 @@ vxlan_gpe_input (vlib_main_t * vm, */ vnet_buffer (b1)->sw_if_index[VLIB_TX] = t1->decap_fib_index; - if (is_ip4) - ip4_pkts_decapsulated++; - else - ip6_pkts_decapsulated++; - + pkts_decapsulated++; stats_n_packets += 1; stats_n_bytes += len1; @@ -616,11 +607,7 @@ vxlan_gpe_input (vlib_main_t * vm, */ vnet_buffer (b0)->sw_if_index[VLIB_TX] = t0->decap_fib_index; - if (is_ip4) - ip4_pkts_decapsulated++; - else - ip6_pkts_decapsulated++; - + pkts_decapsulated++; stats_n_packets += 1; stats_n_bytes += len0; @@ -658,12 +645,13 @@ vxlan_gpe_input (vlib_main_t * vm, vlib_put_next_frame (vm, node, next_index, n_left_to_next); } - vlib_node_increment_counter (vm, vxlan4_gpe_input_node.index, - VXLAN_GPE_ERROR_DECAPSULATED, - ip4_pkts_decapsulated); - vlib_node_increment_counter (vm, vxlan6_gpe_input_node.index, + + vlib_node_increment_counter (vm, + is_ip4 ? vxlan4_gpe_input_node.index : + vxlan6_gpe_input_node.index, VXLAN_GPE_ERROR_DECAPSULATED, - ip6_pkts_decapsulated); + pkts_decapsulated); + /* Increment any remaining batch stats */ if (stats_n_packets) { @@ -789,7 +777,7 @@ typedef enum IP_VXLAN_BYPASS_NEXT_DROP, IP_VXLAN_BYPASS_NEXT_VXLAN, IP_VXLAN_BYPASS_N_NEXT, -} ip_vxan_bypass_next_t; +} ip_vxlan_bypass_next_t; always_inline uword ip_vxlan_gpe_bypass_inline (vlib_main_t * vm, @@ -800,20 +788,29 @@ ip_vxlan_gpe_bypass_inline (vlib_main_t * vm, u32 *from, *to_next, n_left_from, n_left_to_next, next_index; vlib_node_runtime_t *error_node = vlib_node_get_runtime (vm, ip4_input_node.index); - ip4_address_t addr4; /* last IPv4 address matching a local VTEP address */ - ip6_address_t addr6; /* last IPv6 address matching a local VTEP address */ + vtep4_key_t last_vtep4; /* last IPv4 address / fib index + matching a local VTEP address */ + vtep6_key_t last_vtep6; /* last IPv6 address / fib index + matching a local VTEP address */ + vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b = bufs; +#ifdef CLIB_HAVE_VEC512 + vtep4_cache_t vtep4_u512; + clib_memset (&vtep4_u512, 0, sizeof (vtep4_u512)); +#endif from = vlib_frame_vector_args (frame); n_left_from = frame->n_vectors; next_index = node->cached_next_index; + vlib_get_buffers (vm, from, bufs, n_left_from); + if (node->flags & VLIB_NODE_FLAG_TRACE) ip4_forward_next_trace (vm, node, frame, VLIB_TX); if (is_ip4) - addr4.data_u32 = ~0; + vtep4_key_init (&last_vtep4); else - ip6_address_set_zero (&addr6); + vtep6_key_init (&last_vtep6); while (n_left_from > 0) { @@ -833,16 +830,11 @@ ip_vxlan_gpe_bypass_inline (vlib_main_t * vm, /* Prefetch next iteration. */ { - vlib_buffer_t *p2, *p3; - - p2 = vlib_get_buffer (vm, from[2]); - p3 = vlib_get_buffer (vm, from[3]); - - vlib_prefetch_buffer_header (p2, LOAD); - vlib_prefetch_buffer_header (p3, LOAD); + vlib_prefetch_buffer_header (b[2], LOAD); + vlib_prefetch_buffer_header (b[3], LOAD); - CLIB_PREFETCH (p2->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD); - CLIB_PREFETCH (p3->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD); + CLIB_PREFETCH (b[2]->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD); + CLIB_PREFETCH (b[3]->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD); } bi0 = to_next[0] = from[0]; @@ -852,8 +844,9 @@ ip_vxlan_gpe_bypass_inline (vlib_main_t * vm, to_next += 2; n_left_to_next -= 2; - b0 = vlib_get_buffer (vm, bi0); - b1 = vlib_get_buffer (vm, bi1); + b0 = b[0]; + b1 = b[1]; + b += 2; if (is_ip4) { ip40 = vlib_buffer_get_current (b0); @@ -895,21 +888,18 @@ ip_vxlan_gpe_bypass_inline (vlib_main_t * vm, /* Validate DIP against VTEPs */ if (is_ip4) { - if (addr4.as_u32 != ip40->dst_address.as_u32) - { - if (!hash_get (ngm->vtep4, ip40->dst_address.as_u32)) - goto exit0; /* no local VTEP for VXLAN packet */ - addr4 = ip40->dst_address; - } +#ifdef CLIB_HAVE_VEC512 + if (!vtep4_check_vector + (&ngm->vtep_table, b0, ip40, &last_vtep4, &vtep4_u512)) +#else + if (!vtep4_check (&ngm->vtep_table, b0, ip40, &last_vtep4)) +#endif + goto exit0; /* no local VTEP for VXLAN packet */ } else { - if (!ip6_address_is_equal (&addr6, &ip60->dst_address)) - { - if (!hash_get_mem (ngm->vtep6, &ip60->dst_address)) - goto exit0; /* no local VTEP for VXLAN packet */ - addr6 = ip60->dst_address; - } + if (!vtep6_check (&ngm->vtep_table, b0, ip60, &last_vtep6)) + goto exit0; /* no local VTEP for VXLAN packet */ } flags0 = b0->flags; @@ -981,21 +971,18 @@ ip_vxlan_gpe_bypass_inline (vlib_main_t * vm, /* Validate DIP against VTEPs */ if (is_ip4) { - if (addr4.as_u32 != ip41->dst_address.as_u32) - { - if (!hash_get (ngm->vtep4, ip41->dst_address.as_u32)) - goto exit1; /* no local VTEP for VXLAN packet */ - addr4 = ip41->dst_address; - } +#ifdef CLIB_HAVE_VEC512 + if (!vtep4_check_vector + (&ngm->vtep_table, b1, ip41, &last_vtep4, &vtep4_u512)) +#else + if (!vtep4_check (&ngm->vtep_table, b1, ip41, &last_vtep4)) +#endif + goto exit1; /* no local VTEP for VXLAN packet */ } else { - if (!ip6_address_is_equal (&addr6, &ip61->dst_address)) - { - if (!hash_get_mem (ngm->vtep6, &ip61->dst_address)) - goto exit1; /* no local VTEP for VXLAN packet */ - addr6 = ip61->dst_address; - } + if (!vtep6_check (&ngm->vtep_table, b1, ip61, &last_vtep6)) + goto exit1; /* no local VTEP for VXLAN packet */ } flags1 = b1->flags; @@ -1073,7 +1060,8 @@ ip_vxlan_gpe_bypass_inline (vlib_main_t * vm, to_next += 1; n_left_to_next -= 1; - b0 = vlib_get_buffer (vm, bi0); + b0 = b[0]; + b++; if (is_ip4) ip40 = vlib_buffer_get_current (b0); else @@ -1099,23 +1087,21 @@ ip_vxlan_gpe_bypass_inline (vlib_main_t * vm, goto exit; /* not VXLAN packet */ /* Validate DIP against VTEPs */ + if (is_ip4) { - if (addr4.as_u32 != ip40->dst_address.as_u32) - { - if (!hash_get (ngm->vtep4, ip40->dst_address.as_u32)) - goto exit; /* no local VTEP for VXLAN packet */ - addr4 = ip40->dst_address; - } +#ifdef CLIB_HAVE_VEC512 + if (!vtep4_check_vector + (&ngm->vtep_table, b0, ip40, &last_vtep4, &vtep4_u512)) +#else + if (!vtep4_check (&ngm->vtep_table, b0, ip40, &last_vtep4)) +#endif + goto exit; /* no local VTEP for VXLAN packet */ } else { - if (!ip6_address_is_equal (&addr6, &ip60->dst_address)) - { - if (!hash_get_mem (ngm->vtep6, &ip60->dst_address)) - goto exit; /* no local VTEP for VXLAN packet */ - addr6 = ip60->dst_address; - } + if (!vtep6_check (&ngm->vtep_table, b0, ip60, &last_vtep6)) + goto exit; /* no local VTEP for VXLAN packet */ } flags0 = b0->flags;