misc: refactor calc_checksums
[vpp.git] / src / vnet / ip / ip4_forward.c
index b8defc5..952915f 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))
@@ -900,20 +903,6 @@ VNET_FEATURE_INIT (ip4_inacl, static) =
 {
   .arc_name = "ip4-unicast",
   .node_name = "ip4-inacl",
-  .runs_before = VNET_FEATURES ("ip4-source-check-via-rx"),
-};
-
-VNET_FEATURE_INIT (ip4_source_check_1, static) =
-{
-  .arc_name = "ip4-unicast",
-  .node_name = "ip4-source-check-via-rx",
-  .runs_before = VNET_FEATURES ("ip4-source-check-via-any"),
-};
-
-VNET_FEATURE_INIT (ip4_source_check_2, static) =
-{
-  .arc_name = "ip4-unicast",
-  .node_name = "ip4-source-check-via-any",
   .runs_before = VNET_FEATURES ("ip4-policer-classify"),
 };
 
@@ -1060,6 +1049,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,
@@ -1695,7 +1685,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 +1814,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 =
   {
@@ -1984,10 +1976,7 @@ ip4_ttl_inc (vlib_buffer_t * b, ip4_header_t * ip)
   i32 ttl;
   u32 checksum;
   if (PREDICT_FALSE (b->flags & VNET_BUFFER_F_LOCALLY_ORIGINATED))
-    {
-      b->flags &= ~VNET_BUFFER_F_LOCALLY_ORIGINATED;
-      return;
-    }
+    return;
 
   ttl = ip->ttl;
 
@@ -2010,10 +1999,7 @@ ip4_ttl_and_checksum_check (vlib_buffer_t * b, ip4_header_t * ip, u16 * next,
   i32 ttl;
   u32 checksum;
   if (PREDICT_FALSE (b->flags & VNET_BUFFER_F_LOCALLY_ORIGINATED))
-    {
-      b->flags &= ~VNET_BUFFER_F_LOCALLY_ORIGINATED;
-      return;
-    }
+    return;
 
   ttl = ip->ttl;
 
@@ -2175,7 +2161,9 @@ ip4_rewrite_inline_with_gso (vlib_main_t * vm,
                                    tx_sw_if_index0, &next_index, b[0]);
          next[0] = next_index;
          if (is_midchain)
-           calc_checksums (vm, b[0]);
+           vnet_calc_checksums_inline (vm, b[0], 1 /* is_ip4 */ ,
+                                       0 /* is_ip6 */ ,
+                                       0 /* with gso */ );
        }
       else
        {
@@ -2197,7 +2185,9 @@ ip4_rewrite_inline_with_gso (vlib_main_t * vm,
                                    tx_sw_if_index1, &next_index, b[1]);
          next[1] = next_index;
          if (is_midchain)
-           calc_checksums (vm, b[1]);
+           vnet_calc_checksums_inline (vm, b[0], 1 /* is_ip4 */ ,
+                                       0 /* is_ip6 */ ,
+                                       0 /* with gso */ );
        }
       else
        {
@@ -2341,7 +2331,9 @@ ip4_rewrite_inline_with_gso (vlib_main_t * vm,
          next[0] = next_index;
 
          if (is_midchain)
-           calc_checksums (vm, b[0]);
+           vnet_calc_checksums_inline (vm, b[0], 1 /* is_ip4 */ ,
+                                       0 /* is_ip6 */ ,
+                                       0 /* with gso */ );
 
          /* Guess we are only writing on simple Ethernet header. */
          vnet_rewrite_one_header (adj0[0], ip0, sizeof (ethernet_header_t));
@@ -2440,7 +2432,9 @@ ip4_rewrite_inline_with_gso (vlib_main_t * vm,
 
          if (is_midchain)
            /* this acts on the packet that is about to be encapped */
-           calc_checksums (vm, b[0]);
+           vnet_calc_checksums_inline (vm, b[0], 1 /* is_ip4 */ ,
+                                       0 /* is_ip6 */ ,
+                                       0 /* with gso */ );
 
          /* Guess we are only writing on simple Ethernet header. */
          vnet_rewrite_one_header (adj0[0], ip0, sizeof (ethernet_header_t));