BD ARP entry use common API types
[vpp.git] / src / vnet / interface_output.c
index c95f08b..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)
     {
@@ -188,7 +188,6 @@ calc_checksums (vlib_main_t * vm, vlib_buffer_t * b)
   if (is_ip6)
     {
       int bogus;
-      ASSERT (b->flags & VNET_BUFFER_F_OFFLOAD_IP_CKSUM);
       if (b->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM)
        th->checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b, ip6, &bogus);
       if (b->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM)
@@ -329,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;
@@ -416,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;
            }
 
@@ -444,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)
 {
@@ -514,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,
@@ -542,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);
@@ -1090,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",
@@ -1105,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;
 }
@@ -1118,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,
@@ -1139,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)