tcp: avoid fr segments less than mss if possible
[vpp.git] / src / vnet / dpo / lookup_dpo.c
index 3bda3b8..9ce94ee 100644 (file)
@@ -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;
@@ -637,8 +596,7 @@ format_lookup_trace (u8 * s, va_list * args)
     return s;
 }
 
-static uword
-lookup_ip4_dst (vlib_main_t * vm,
+VLIB_NODE_FN (lookup_ip4_dst_node) (vlib_main_t * vm,
                 vlib_node_runtime_t * node,
                 vlib_frame_t * from_frame)
 {
@@ -646,16 +604,13 @@ lookup_ip4_dst (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (lookup_ip4_dst_node) = {
-    .function = lookup_ip4_dst,
     .name = "lookup-ip4-dst",
     .vector_size = sizeof (u32),
     .sibling_of = "ip4-lookup",
     .format_trace = format_lookup_trace,
 };
-VLIB_NODE_FUNCTION_MULTIARCH (lookup_ip4_dst_node, lookup_ip4_dst)
 
-static uword
-lookup_ip4_dst_itf (vlib_main_t * vm,
+VLIB_NODE_FN (lookup_ip4_dst_itf_node) (vlib_main_t * vm,
                     vlib_node_runtime_t * node,
                     vlib_frame_t * from_frame)
 {
@@ -663,16 +618,13 @@ lookup_ip4_dst_itf (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (lookup_ip4_dst_itf_node) = {
-    .function = lookup_ip4_dst_itf,
     .name = "lookup-ip4-dst-itf",
     .vector_size = sizeof (u32),
     .sibling_of = "ip4-lookup",
     .format_trace = format_lookup_trace,
 };
-VLIB_NODE_FUNCTION_MULTIARCH (lookup_ip4_dst_itf_node, lookup_ip4_dst_itf)
 
-static uword
-lookup_ip4_src (vlib_main_t * vm,
+VLIB_NODE_FN (lookup_ip4_src_node) (vlib_main_t * vm,
                 vlib_node_runtime_t * node,
                 vlib_frame_t * from_frame)
 {
@@ -680,13 +632,11 @@ lookup_ip4_src (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (lookup_ip4_src_node) = {
-    .function = lookup_ip4_src,
     .name = "lookup-ip4-src",
     .vector_size = sizeof (u32),
     .format_trace = format_lookup_trace,
     .sibling_of = "ip4-lookup",
 };
-VLIB_NODE_FUNCTION_MULTIARCH (lookup_ip4_src_node, lookup_ip4_src)
 
 always_inline uword
 lookup_dpo_ip6_inline (vlib_main_t * vm,
@@ -739,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];
@@ -797,10 +747,10 @@ lookup_dpo_ip6_inline (vlib_main_t * vm,
            }
 
            /* do src lookup */
-           lbi0 = ip6_fib_table_fwding_lookup(&ip6_main,
+           lbi0 = ip6_fib_table_fwding_lookup(
                                               fib_index0,
                                               input_addr0);
-           lbi1 = ip6_fib_table_fwding_lookup(&ip6_main,
+           lbi1 = ip6_fib_table_fwding_lookup(
                                               fib_index1,
                                               input_addr1);
            lb0 = load_balance_get(lbi0);
@@ -936,7 +886,7 @@ lookup_dpo_ip6_inline (vlib_main_t * vm,
            }
 
            /* do src lookup */
-           lbi0 = ip6_fib_table_fwding_lookup(&ip6_main,
+           lbi0 = ip6_fib_table_fwding_lookup(
                                               fib_index0,
                                               input_addr0);
            lb0 = load_balance_get(lbi0);
@@ -990,8 +940,7 @@ lookup_dpo_ip6_inline (vlib_main_t * vm,
     return from_frame->n_vectors;
 }
 
-static uword
-lookup_ip6_dst (vlib_main_t * vm,
+VLIB_NODE_FN (lookup_ip6_dst_node) (vlib_main_t * vm,
                 vlib_node_runtime_t * node,
                 vlib_frame_t * from_frame)
 {
@@ -999,16 +948,13 @@ lookup_ip6_dst (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (lookup_ip6_dst_node) = {
-    .function = lookup_ip6_dst,
     .name = "lookup-ip6-dst",
     .vector_size = sizeof (u32),
     .format_trace = format_lookup_trace,
     .sibling_of = "ip6-lookup",
 };
-VLIB_NODE_FUNCTION_MULTIARCH (lookup_ip6_dst_node, lookup_ip6_dst)
 
-static uword
-lookup_ip6_dst_itf (vlib_main_t * vm,
+VLIB_NODE_FN (lookup_ip6_dst_itf_node) (vlib_main_t * vm,
                    vlib_node_runtime_t * node,
                    vlib_frame_t * from_frame)
 {
@@ -1016,16 +962,13 @@ lookup_ip6_dst_itf (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (lookup_ip6_dst_itf_node) = {
-    .function = lookup_ip6_dst_itf,
     .name = "lookup-ip6-dst-itf",
     .vector_size = sizeof (u32),
     .format_trace = format_lookup_trace,
     .sibling_of = "ip6-lookup",
 };
-VLIB_NODE_FUNCTION_MULTIARCH (lookup_ip6_dst_itf_node, lookup_ip6_dst_itf)
 
-static uword
-lookup_ip6_src (vlib_main_t * vm,
+VLIB_NODE_FN (lookup_ip6_src_node) (vlib_main_t * vm,
                 vlib_node_runtime_t * node,
                 vlib_frame_t * from_frame)
 {
@@ -1033,13 +976,11 @@ lookup_ip6_src (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (lookup_ip6_src_node) = {
-    .function = lookup_ip6_src,
     .name = "lookup-ip6-src",
     .vector_size = sizeof (u32),
     .format_trace = format_lookup_trace,
     .sibling_of = "ip6-lookup",
 };
-VLIB_NODE_FUNCTION_MULTIARCH (lookup_ip6_src_node, lookup_ip6_src)
 
 always_inline uword
 lookup_dpo_mpls_inline (vlib_main_t * vm,
@@ -1094,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]);
             }
@@ -1160,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;
@@ -1196,8 +1137,7 @@ format_lookup_mpls_trace (u8 * s, va_list * args)
     return s;
 }
 
-static uword
-lookup_mpls_dst (vlib_main_t * vm,
+VLIB_NODE_FN (lookup_mpls_dst_node) (vlib_main_t * vm,
                 vlib_node_runtime_t * node,
                 vlib_frame_t * from_frame)
 {
@@ -1205,17 +1145,14 @@ lookup_mpls_dst (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (lookup_mpls_dst_node) = {
-    .function = lookup_mpls_dst,
     .name = "lookup-mpls-dst",
     .vector_size = sizeof (u32),
     .sibling_of = "mpls-lookup",
     .format_trace = format_lookup_mpls_trace,
     .n_next_nodes = 0,
 };
-VLIB_NODE_FUNCTION_MULTIARCH (lookup_mpls_dst_node, lookup_mpls_dst)
 
-static uword
-lookup_mpls_dst_itf (vlib_main_t * vm,
+VLIB_NODE_FN (lookup_mpls_dst_itf_node) (vlib_main_t * vm,
                     vlib_node_runtime_t * node,
                     vlib_frame_t * from_frame)
 {
@@ -1223,14 +1160,12 @@ lookup_mpls_dst_itf (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (lookup_mpls_dst_itf_node) = {
-    .function = lookup_mpls_dst_itf,
     .name = "lookup-mpls-dst-itf",
     .vector_size = sizeof (u32),
     .sibling_of = "mpls-lookup",
     .format_trace = format_lookup_mpls_trace,
     .n_next_nodes = 0,
 };
-VLIB_NODE_FUNCTION_MULTIARCH (lookup_mpls_dst_itf_node, lookup_mpls_dst_itf)
 
 typedef enum lookup_ip_dst_mcast_next_t_ {
     LOOKUP_IP_DST_MCAST_NEXT_DROP,
@@ -1338,8 +1273,7 @@ lookup_dpo_ip_dst_mcast_inline (vlib_main_t * vm,
     return from_frame->n_vectors;
 }
 
-static uword
-lookup_ip4_dst_mcast (vlib_main_t * vm,
+VLIB_NODE_FN (lookup_ip4_dst_mcast_node) (vlib_main_t * vm,
                       vlib_node_runtime_t * node,
                       vlib_frame_t * from_frame)
 {
@@ -1347,7 +1281,6 @@ lookup_ip4_dst_mcast (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (lookup_ip4_dst_mcast_node) = {
-    .function = lookup_ip4_dst_mcast,
     .name = "lookup-ip4-dst-mcast",
     .vector_size = sizeof (u32),
 
@@ -1358,11 +1291,8 @@ VLIB_REGISTER_NODE (lookup_ip4_dst_mcast_node) = {
         [LOOKUP_IP_DST_MCAST_NEXT_RPF] = "ip4-mfib-forward-rpf",
     },
 };
-VLIB_NODE_FUNCTION_MULTIARCH (lookup_ip4_dst_mcast_node,
-                              lookup_ip4_dst_mcast)
 
-static uword
-lookup_ip6_dst_mcast (vlib_main_t * vm,
+VLIB_NODE_FN (lookup_ip6_dst_mcast_node) (vlib_main_t * vm,
                       vlib_node_runtime_t * node,
                       vlib_frame_t * from_frame)
 {
@@ -1370,7 +1300,6 @@ lookup_ip6_dst_mcast (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (lookup_ip6_dst_mcast_node) = {
-    .function = lookup_ip6_dst_mcast,
     .name = "lookup-ip6-dst-mcast",
     .vector_size = sizeof (u32),
 
@@ -1381,8 +1310,6 @@ VLIB_REGISTER_NODE (lookup_ip6_dst_mcast_node) = {
         [LOOKUP_IP_DST_MCAST_NEXT_RPF] = "ip6-mfib-forward-rpf",
     },
 };
-VLIB_NODE_FUNCTION_MULTIARCH (lookup_ip6_dst_mcast_node,
-                              lookup_ip6_dst_mcast)
 
 static void
 lookup_dpo_mem_show (void)
@@ -1499,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;