DVR: run L3 output features
[vpp.git] / src / vnet / ip / ip4_forward.c
index d7afc84..201d391 100755 (executable)
@@ -1113,7 +1113,7 @@ VNET_FEATURE_INIT (ip4_lookup_mc, static) =
 VNET_FEATURE_ARC_INIT (ip4_output, static) =
 {
   .arc_name = "ip4-output",
-  .start_nodes = VNET_FEATURES ("ip4-rewrite", "ip4-midchain"),
+  .start_nodes = VNET_FEATURES ("ip4-rewrite", "ip4-midchain", "ip4-dvr-dpo"),
   .arc_index_ptr = &ip4_main.lookup_main.output_feature_arc_index,
 };
 
@@ -1189,6 +1189,12 @@ ip4_lookup_init (vlib_main_t * vm)
 
   if ((error = vlib_call_init_function (vm, vnet_feature_init)))
     return error;
+  if ((error = vlib_call_init_function (vm, ip4_mtrie_module_init)))
+    return (error);
+  if ((error = vlib_call_init_function (vm, fib_module_init)))
+    return error;
+  if ((error = vlib_call_init_function (vm, mfib_module_init)))
+    return error;
 
   for (i = 0; i < ARRAY_LEN (im->fib_masks); i++)
     {
@@ -2471,6 +2477,16 @@ ip4_rewrite_inline (vlib_main_t * vm,
             rewrite_header.max_l3_packet_bytes ? IP4_ERROR_MTU_EXCEEDED :
             error1);
 
+         if (is_mcast)
+           {
+             error0 = ((adj0[0].rewrite_header.sw_if_index ==
+                        vnet_buffer (p0)->sw_if_index[VLIB_RX]) ?
+                       IP4_ERROR_SAME_INTERFACE : error0);
+             error1 = ((adj1[0].rewrite_header.sw_if_index ==
+                        vnet_buffer (p1)->sw_if_index[VLIB_RX]) ?
+                       IP4_ERROR_SAME_INTERFACE : error1);
+           }
+
          /* Don't adjust the buffer for ttl issue; icmp-error node wants
           * to see the IP headerr */
          if (PREDICT_TRUE (error0 == IP4_ERROR_NONE))
@@ -2630,7 +2646,12 @@ ip4_rewrite_inline (vlib_main_t * vm,
          error0 = (vlib_buffer_length_in_chain (vm, p0)
                    > adj0[0].rewrite_header.max_l3_packet_bytes
                    ? IP4_ERROR_MTU_EXCEEDED : error0);
-
+         if (is_mcast)
+           {
+             error0 = ((adj0[0].rewrite_header.sw_if_index ==
+                        vnet_buffer (p0)->sw_if_index[VLIB_RX]) ?
+                       IP4_ERROR_SAME_INTERFACE : error0);
+           }
          p0->error = error_node->errors[error0];
 
          /* Don't adjust the buffer for ttl issue; icmp-error node wants
@@ -2706,7 +2727,7 @@ ip4_rewrite_inline (vlib_main_t * vm,
 
     <em>Next Indices:</em>
     - <code> adj->rewrite_header.next_index </code>
-      or @c error-drop
+      or @c ip4-drop
 */
 static uword
 ip4_rewrite (vlib_main_t * vm,
@@ -2758,7 +2779,7 @@ VLIB_REGISTER_NODE (ip4_rewrite_node) = {
 
   .n_next_nodes = 2,
   .next_nodes = {
-    [IP4_REWRITE_NEXT_DROP] = "error-drop",
+    [IP4_REWRITE_NEXT_DROP] = "ip4-drop",
     [IP4_REWRITE_NEXT_ICMP_ERROR] = "ip4-icmp-error",
   },
 };
@@ -3166,6 +3187,29 @@ VLIB_CLI_COMMAND (set_ip_classify_command, static) =
 };
 /* *INDENT-ON* */
 
+static clib_error_t *
+ip4_config (vlib_main_t * vm, unformat_input_t * input)
+{
+  ip4_main_t *im = &ip4_main;
+  uword heapsize = 0;
+
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "heap-size %U", unformat_memory_size, &heapsize))
+       ;
+      else
+       return clib_error_return (0,
+                                 "invalid heap-size parameter `%U'",
+                                 format_unformat_error, input);
+    }
+
+  im->mtrie_heap_size = heapsize;
+
+  return 0;
+}
+
+VLIB_EARLY_CONFIG_FUNCTION (ip4_config, "ip");
+
 /*
  * fd.io coding-style-patch-verification: ON
  *