BD ARP entry use common API types
[vpp.git] / src / vnet / interface_output.c
index 06f1c7d..f858564 100644 (file)
@@ -59,7 +59,7 @@ format_vnet_interface_output_trace (u8 * s, va_list * va)
   interface_output_trace_t *t = va_arg (*va, interface_output_trace_t *);
   vnet_main_t *vnm = vnet_get_main ();
   vnet_sw_interface_t *si;
-  uword indent;
+  u32 indent;
 
   if (t->sw_if_index != (u32) ~ 0)
     {
@@ -328,10 +328,10 @@ vnet_interface_output_node_inline (vlib_main_t * vm,
 
          if (PREDICT_FALSE (current_config_index != ~0))
            {
-             b0->feature_arc_index = arc;
-             b1->feature_arc_index = arc;
-             b2->feature_arc_index = arc;
-             b3->feature_arc_index = arc;
+             vnet_buffer (b0)->feature_arc_index = arc;
+             vnet_buffer (b1)->feature_arc_index = arc;
+             vnet_buffer (b2)->feature_arc_index = arc;
+             vnet_buffer (b3)->feature_arc_index = arc;
              b0->current_config_index = current_config_index;
              b1->current_config_index = current_config_index;
              b2->current_config_index = current_config_index;
@@ -415,7 +415,7 @@ vnet_interface_output_node_inline (vlib_main_t * vm,
 
          if (PREDICT_FALSE (current_config_index != ~0))
            {
-             b0->feature_arc_index = arc;
+             vnet_buffer (b0)->feature_arc_index = arc;
              b0->current_config_index = current_config_index;
            }
 
@@ -443,7 +443,7 @@ vnet_interface_output_node_inline (vlib_main_t * vm,
   return n_buffers;
 }
 
-static_always_inline uword
+static uword
 vnet_interface_output_node (vlib_main_t * vm, vlib_node_runtime_t * node,
                            vlib_frame_t * frame)
 {
@@ -513,8 +513,8 @@ vnet_per_buffer_interface_output (vlib_main_t * vm,
                                       vnet_buffer (b1)->sw_if_index
                                       [VLIB_TX]);
 
-         next0 = hi0->hw_if_index;
-         next1 = hi1->hw_if_index;
+         next0 = hi0->output_node_next_index;
+         next1 = hi1->output_node_next_index;
 
          vlib_validate_buffer_enqueue_x2 (vm, node, next_index, to_next,
                                           n_left_to_next, bi0, bi1, next0,
@@ -541,7 +541,7 @@ vnet_per_buffer_interface_output (vlib_main_t * vm,
                                       vnet_buffer (b0)->sw_if_index
                                       [VLIB_TX]);
 
-         next0 = hi0->hw_if_index;
+         next0 = hi0->output_node_next_index;
 
          vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
                                           n_left_to_next, bi0, next0);
@@ -1089,6 +1089,12 @@ VNET_FEATURE_INIT (span_tx, static) = {
   .runs_before = VNET_FEATURES ("interface-tx"),
 };
 
+VNET_FEATURE_INIT (ipsec_if_tx, static) = {
+  .arc_name = "interface-output",
+  .node_name = "ipsec-if-output",
+  .runs_before = VNET_FEATURES ("interface-tx"),
+};
+
 VNET_FEATURE_INIT (interface_tx, static) = {
   .arc_name = "interface-output",
   .node_name = "interface-tx",
@@ -1104,12 +1110,13 @@ vnet_per_buffer_interface_output_hw_interface_add_del (vnet_main_t * vnm,
   vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, hw_if_index);
   u32 next_index;
 
-  next_index = vlib_node_add_next_with_slot
-    (vnm->vlib_main, vnet_per_buffer_interface_output_node.index,
-     hi->output_node_index,
-     /* next_index */ hw_if_index);
+  if (hi->output_node_index == 0)
+    return 0;
 
-  ASSERT (next_index == hw_if_index);
+  next_index = vlib_node_add_next
+    (vnm->vlib_main, vnet_per_buffer_interface_output_node.index,
+     hi->output_node_index);
+  hi->output_node_next_index = next_index;
 
   return 0;
 }
@@ -1117,6 +1124,18 @@ vnet_per_buffer_interface_output_hw_interface_add_del (vnet_main_t * vnm,
 VNET_HW_INTERFACE_ADD_DEL_FUNCTION
   (vnet_per_buffer_interface_output_hw_interface_add_del);
 
+void
+vnet_set_interface_output_node (vnet_main_t * vnm,
+                               u32 hw_if_index, u32 node_index)
+{
+  ASSERT (node_index);
+  vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, hw_if_index);
+  u32 next_index = vlib_node_add_next
+    (vnm->vlib_main, vnet_per_buffer_interface_output_node.index, node_index);
+  hi->output_node_next_index = next_index;
+  hi->output_node_index = node_index;
+}
+
 static clib_error_t *
 pcap_drop_trace_command_fn (vlib_main_t * vm,
                            unformat_input_t * input,
@@ -1138,7 +1157,7 @@ pcap_drop_trace_command_fn (vlib_main_t * vm,
              if (im->pcap_filename == 0)
                im->pcap_filename = format (0, "/tmp/drop.pcap%c", 0);
 
-             memset (&im->pcap_main, 0, sizeof (im->pcap_main));
+             clib_memset (&im->pcap_main, 0, sizeof (im->pcap_main));
              im->pcap_main.file_name = (char *) im->pcap_filename;
              im->pcap_main.n_packets_to_capture = 100;
              if (im->pcap_pkts_to_capture)