session: api to add new transport types
[vpp.git] / src / vnet / ip / ip4_forward.c
index aa554ea..7471a00 100644 (file)
@@ -49,6 +49,7 @@
 #include <vnet/fib/fib_entry.h>        /* for FIB table and entry creation */
 #include <vnet/fib/fib_urpf_list.h>    /* for FIB uRPF check */
 #include <vnet/fib/ip4_fib.h>
+#include <vnet/mfib/ip4_mfib.h>
 #include <vnet/dpo/load_balance.h>
 #include <vnet/dpo/load_balance_map.h>
 #include <vnet/dpo/classify_dpo.h>
@@ -56,6 +57,7 @@
 
 #include <vnet/ip/ip4_forward.h>
 #include <vnet/interface_output.h>
+#include <vnet/classify/vnet_classify.h>
 
 /** @brief IPv4 lookup node.
     @node ip4-lookup
@@ -760,6 +762,7 @@ ip4_add_del_interface_address_internal (vlib_main_t * vm,
     goto done;
 
   ip4_sw_interface_enable_disable (sw_if_index, !is_del);
+  ip4_mfib_interface_enable_disable (sw_if_index, !is_del);
 
   /* intf addr routes are added/deleted on admin up/down */
   if (vnet_sw_interface_is_admin_up (vnm, sw_if_index))
@@ -1060,6 +1063,7 @@ ip4_sw_interface_add_del (vnet_main_t * vnm, u32 sw_if_index, u32 is_add)
         ip4_add_del_interface_address(vm, sw_if_index, address, ia->address_length, 1);
       }));
       /* *INDENT-ON* */
+      ip4_mfib_interface_enable_disable (sw_if_index, 0);
     }
 
   vnet_feature_enable_disable ("ip4-unicast", "ip4-not-enabled", sw_if_index,
@@ -1504,8 +1508,8 @@ ip4_local_check_src (vlib_buffer_t * b, ip4_header_t * ip0,
    * vnet_buffer()->ip.adj_index[VLIB_TX] will be set to the index of the
    *  adjacency for the source address (the remote sender's address)
    */
-  if (PREDICT_FALSE (last_check->first ||
-                    (last_check->src.as_u32 != ip0->src_address.as_u32)))
+  if (PREDICT_TRUE (last_check->src.as_u32 != ip0->src_address.as_u32) ||
+      last_check->first)
     {
       mtrie0 = &ip4_fib_get (vnet_buffer (b)->ip.fib_index)->mtrie;
       leaf0 = ip4_fib_mtrie_lookup_step_one (mtrie0, &ip0->src_address);
@@ -1542,6 +1546,7 @@ ip4_local_check_src (vlib_buffer_t * b, ip4_header_t * ip0,
       last_check->src.as_u32 = ip0->src_address.as_u32;
       last_check->lbi = lbi0;
       last_check->error = *error0;
+      last_check->first = 0;
     }
   else
     {
@@ -1549,7 +1554,6 @@ ip4_local_check_src (vlib_buffer_t * b, ip4_header_t * ip0,
        vnet_buffer (b)->ip.adj_index[VLIB_TX];
       vnet_buffer (b)->ip.adj_index[VLIB_TX] = last_check->lbi;
       *error0 = last_check->error;
-      last_check->first = 0;
     }
 }
 
@@ -1584,7 +1588,7 @@ ip4_local_check_src_x2 (vlib_buffer_t ** b, ip4_header_t ** ip,
    * vnet_buffer()->ip.adj_index[VLIB_TX] will be set to the index of the
    *  adjacency for the source address (the remote sender's address)
    */
-  if (PREDICT_FALSE (not_last_hit))
+  if (PREDICT_TRUE (not_last_hit))
     {
       mtrie[0] = &ip4_fib_get (vnet_buffer (b[0])->ip.fib_index)->mtrie;
       mtrie[1] = &ip4_fib_get (vnet_buffer (b[1])->ip.fib_index)->mtrie;
@@ -1638,6 +1642,7 @@ ip4_local_check_src_x2 (vlib_buffer_t ** b, ip4_header_t ** ip,
       last_check->src.as_u32 = ip[1]->src_address.as_u32;
       last_check->lbi = lbi[1];
       last_check->error = error[1];
+      last_check->first = 0;
     }
   else
     {
@@ -1651,7 +1656,6 @@ ip4_local_check_src_x2 (vlib_buffer_t ** b, ip4_header_t ** ip,
 
       error[0] = last_check->error;
       error[1] = last_check->error;
-      last_check->first = 0;
     }
 }
 
@@ -1695,7 +1699,7 @@ ip4_local_inline (vlib_main_t * vm,
 {
   u32 *from, n_left_from;
   vlib_node_runtime_t *error_node =
-    vlib_node_get_runtime (vm, ip4_input_node.index);
+    vlib_node_get_runtime (vm, ip4_local_node.index);
   u16 nexts[VLIB_FRAME_SIZE], *next;
   vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b;
   ip4_header_t *ip[2];
@@ -1824,6 +1828,8 @@ VLIB_REGISTER_NODE (ip4_local_node) =
   .name = "ip4-local",
   .vector_size = sizeof (u32),
   .format_trace = format_ip4_forward_next_trace,
+  .n_errors = IP4_N_ERROR,
+  .error_strings = ip4_error_strings,
   .n_next_nodes = IP_LOCAL_N_NEXT,
   .next_nodes =
   {