IPSEC: SPD counters in the stats sgement
[vpp.git] / src / vnet / interface_output.c
index be4ab7d..beeb62a 100644 (file)
@@ -121,15 +121,15 @@ vnet_interface_output_trace (vlib_main_t * vm,
        {
          t0 = vlib_add_trace (vm, node, b0, sizeof (t0[0]));
          t0->sw_if_index = vnet_buffer (b0)->sw_if_index[VLIB_TX];
-         clib_memcpy (t0->data, vlib_buffer_get_current (b0),
-                      sizeof (t0->data));
+         clib_memcpy_fast (t0->data, vlib_buffer_get_current (b0),
+                           sizeof (t0->data));
        }
       if (b1->flags & VLIB_BUFFER_IS_TRACED)
        {
          t1 = vlib_add_trace (vm, node, b1, sizeof (t1[0]));
          t1->sw_if_index = vnet_buffer (b1)->sw_if_index[VLIB_TX];
-         clib_memcpy (t1->data, vlib_buffer_get_current (b1),
-                      sizeof (t1->data));
+         clib_memcpy_fast (t1->data, vlib_buffer_get_current (b1),
+                           sizeof (t1->data));
        }
       from += 2;
       n_left -= 2;
@@ -149,8 +149,8 @@ vnet_interface_output_trace (vlib_main_t * vm,
        {
          t0 = vlib_add_trace (vm, node, b0, sizeof (t0[0]));
          t0->sw_if_index = vnet_buffer (b0)->sw_if_index[VLIB_TX];
-         clib_memcpy (t0->data, vlib_buffer_get_current (b0),
-                      sizeof (t0->data));
+         clib_memcpy_fast (t0->data, vlib_buffer_get_current (b0),
+                           sizeof (t0->data));
        }
       from += 1;
       n_left -= 1;
@@ -181,7 +181,10 @@ calc_checksums (vlib_main_t * vm, vlib_buffer_t * b)
       if (b->flags & VNET_BUFFER_F_OFFLOAD_IP_CKSUM)
        ip4->checksum = ip4_header_checksum (ip4);
       if (b->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM)
-       th->checksum = ip4_tcp_udp_compute_checksum (vm, b, ip4);
+       {
+         th->checksum = 0;
+         th->checksum = ip4_tcp_udp_compute_checksum (vm, b, ip4);
+       }
       if (b->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM)
        uh->checksum = ip4_tcp_udp_compute_checksum (vm, b, ip4);
     }
@@ -443,7 +446,7 @@ vnet_interface_output_node_inline (vlib_main_t * vm,
   return n_buffers;
 }
 
-static uword
+uword
 vnet_interface_output_node (vlib_main_t * vm, vlib_node_runtime_t * node,
                            vlib_frame_t * frame)
 {
@@ -460,9 +463,6 @@ vnet_interface_output_node (vlib_main_t * vm, vlib_node_runtime_t * node,
                                              /* do_tx_offloads */ 1);
 }
 
-VLIB_NODE_FUNCTION_MULTIARCH_CLONE (vnet_interface_output_node);
-CLIB_MULTIARCH_SELECT_FN (vnet_interface_output_node);
-
 /* Use buffer's sw_if_index[VNET_TX] to choose output interface. */
 static uword
 vnet_per_buffer_interface_output (vlib_main_t * vm,
@@ -1016,6 +1016,37 @@ VLIB_REGISTER_NODE (vnet_per_buffer_interface_output_node,static) = {
 };
 /* *INDENT-ON* */
 
+/* Convenience node to drop a vector of buffers with a "misc error". */
+static uword
+misc_drop_buffers (vlib_main_t * vm,
+                  vlib_node_runtime_t * node, vlib_frame_t * frame)
+{
+  return vlib_error_drop_buffers (vm, node, vlib_frame_vector_args (frame),
+                                 /* buffer stride */ 1,
+                                 frame->n_vectors,
+                                 /* next */ 0,
+                                 node->node_index,
+                                 /* error */ 0);
+}
+
+static char *misc_drop_buffers_error_strings[] = {
+  [0] = "misc. errors",
+};
+
+/* *INDENT-OFF* */
+VLIB_REGISTER_NODE (misc_drop_buffers_node,static) = {
+  .function = misc_drop_buffers,
+  .name = "misc-drop-buffers",
+  .vector_size = sizeof (u32),
+  .n_errors = 1,
+  .n_next_nodes = 1,
+  .next_nodes = {
+      "error-drop",
+  },
+  .error_strings = misc_drop_buffers_error_strings,
+};
+/* *INDENT-ON* */
+
 VLIB_NODE_FUNCTION_MULTIARCH (vnet_per_buffer_interface_output_node,
                              vnet_per_buffer_interface_output);
 
@@ -1080,6 +1111,7 @@ VNET_FEATURE_ARC_INIT (interface_output, static) =
 {
   .arc_name  = "interface-output",
   .start_nodes = VNET_FEATURES (0),
+  .last_in_arc = "interface-tx",
   .arc_index_ptr = &vnet_main.interface_main.output_feature_arc_index,
 };