X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdpo%2Flookup_dpo.c;h=9ce94eebe5c93c4eb42fd1f015369ab2ab8565bb;hb=e8ea6be8dfb626b5bb4ff3355ce8037724ce1d83;hp=ec2cd02653b0e9b82af2e568708fecae657d36b2;hpb=e7eba48937c52478d3844745ebb63a4b9ce8d681;p=vpp.git diff --git a/src/vnet/dpo/lookup_dpo.c b/src/vnet/dpo/lookup_dpo.c index ec2cd02653b..9ce94eebe5c 100644 --- a/src/vnet/dpo/lookup_dpo.c +++ b/src/vnet/dpo/lookup_dpo.c @@ -63,8 +63,12 @@ static lookup_dpo_t * lookup_dpo_alloc (void) { lookup_dpo_t *lkd; + vlib_main_t *vm; + u8 did_barrier_sync; + dpo_pool_barrier_sync (vm, lookup_dpo_pool, did_barrier_sync); pool_get_aligned(lookup_dpo_pool, lkd, CLIB_CACHE_LINE_BYTES); + dpo_pool_barrier_release (vm, did_barrier_sync); return (lkd); } @@ -264,50 +268,6 @@ lookup_dpo_unlock (dpo_id_t *dpo) } } -always_inline void -ip4_src_fib_lookup_one (u32 src_fib_index0, - const ip4_address_t * addr0, - u32 * src_adj_index0) -{ - ip4_fib_mtrie_leaf_t leaf0; - ip4_fib_mtrie_t * mtrie0; - - mtrie0 = &ip4_fib_get (src_fib_index0)->mtrie; - - leaf0 = ip4_fib_mtrie_lookup_step_one (mtrie0, addr0); - leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, addr0, 2); - leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, addr0, 3); - - src_adj_index0[0] = ip4_fib_mtrie_leaf_get_adj_index (leaf0); -} - -always_inline void -ip4_src_fib_lookup_two (u32 src_fib_index0, - u32 src_fib_index1, - const ip4_address_t * addr0, - const ip4_address_t * addr1, - u32 * src_adj_index0, - u32 * src_adj_index1) -{ - ip4_fib_mtrie_leaf_t leaf0, leaf1; - ip4_fib_mtrie_t * mtrie0, * mtrie1; - - mtrie0 = &ip4_fib_get (src_fib_index0)->mtrie; - mtrie1 = &ip4_fib_get (src_fib_index1)->mtrie; - - leaf0 = ip4_fib_mtrie_lookup_step_one (mtrie0, addr0); - leaf1 = ip4_fib_mtrie_lookup_step_one (mtrie1, addr1); - - leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, addr0, 2); - leaf1 = ip4_fib_mtrie_lookup_step (mtrie1, leaf1, addr1, 2); - - leaf0 = ip4_fib_mtrie_lookup_step (mtrie0, leaf0, addr0, 3); - leaf1 = ip4_fib_mtrie_lookup_step (mtrie1, leaf1, addr1, 3); - - src_adj_index0[0] = ip4_fib_mtrie_leaf_get_adj_index (leaf0); - src_adj_index1[0] = ip4_fib_mtrie_leaf_get_adj_index (leaf1); -} - /** * @brief Lookup trace data */ @@ -373,8 +333,8 @@ lookup_dpo_ip4_inline (vlib_main_t * vm, vlib_prefetch_buffer_header (p2, LOAD); vlib_prefetch_buffer_header (p3, LOAD); - CLIB_PREFETCH (p2->data, CLIB_CACHE_LINE_BYTES, STORE); - CLIB_PREFETCH (p3->data, CLIB_CACHE_LINE_BYTES, STORE); + clib_prefetch_store (p2->data); + clib_prefetch_store (p3->data); } bi0 = from[0]; @@ -431,9 +391,8 @@ lookup_dpo_ip4_inline (vlib_main_t * vm, } /* do lookup */ - ip4_src_fib_lookup_two (fib_index0, fib_index1, - input_addr0, input_addr1, - &lbi0, &lbi1); + ip4_fib_forwarding_lookup_x2 (fib_index0, fib_index1, input_addr0, + input_addr1, &lbi0, &lbi1); lb0 = load_balance_get(lbi0); lb1 = load_balance_get(lbi1); @@ -569,7 +528,7 @@ lookup_dpo_ip4_inline (vlib_main_t * vm, } /* do lookup */ - ip4_src_fib_lookup_one (fib_index0, input_addr, &lbi0); + lbi0 = ip4_fib_forwarding_lookup (fib_index0, input_addr); lb0 = load_balance_get(lbi0); vnet_buffer(b0)->sw_if_index[VLIB_TX] = fib_index0; @@ -730,8 +689,8 @@ lookup_dpo_ip6_inline (vlib_main_t * vm, vlib_prefetch_buffer_header (p2, LOAD); vlib_prefetch_buffer_header (p3, LOAD); - CLIB_PREFETCH (p2->data, CLIB_CACHE_LINE_BYTES, STORE); - CLIB_PREFETCH (p3->data, CLIB_CACHE_LINE_BYTES, STORE); + clib_prefetch_store (p2->data); + clib_prefetch_store (p3->data); } bi0 = from[0]; @@ -1076,7 +1035,7 @@ lookup_dpo_mpls_inline (vlib_main_t * vm, */ if (table_from_interface) { - fib_index0 = + fib_index0 = mpls_fib_table_get_index_for_sw_if_index( vnet_buffer(b0)->sw_if_index[VLIB_RX]); } @@ -1142,9 +1101,9 @@ lookup_dpo_mpls_inline (vlib_main_t * vm, if (PREDICT_FALSE(vnet_buffer2(b0)->loop_counter > MAX_LUKPS_PER_PACKET)) next0 = MPLS_LOOKUP_NEXT_DROP; - if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED)) + if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED)) { - lookup_trace_t *tr = vlib_add_trace (vm, node, + lookup_trace_t *tr = vlib_add_trace (vm, node, b0, sizeof (*tr)); tr->fib_index = fib_index0; tr->lbi = lbi0; @@ -1467,19 +1426,22 @@ lookup_dpo_show (vlib_main_t * vm, if (INDEX_INVALID != lkdi) { - vlib_cli_output (vm, "%U", format_lookup_dpo, lkdi); + if (pool_is_free_index(lookup_dpo_pool, lkdi)) + vlib_cli_output (vm, "no such index %d", lkdi); + else + vlib_cli_output (vm, "%U", format_lookup_dpo, lkdi); } else { lookup_dpo_t *lkd; - pool_foreach(lkd, lookup_dpo_pool, - ({ + pool_foreach (lkd, lookup_dpo_pool) + { vlib_cli_output (vm, "[@%d] %U", lookup_dpo_get_index(lkd), format_lookup_dpo, lookup_dpo_get_index(lkd)); - })); + } } return 0;