Add support for multiple microarchitectures in single binary
[vpp.git] / vnet / vnet / interface_output.c
index 033e9fc..9f9fb70 100644 (file)
@@ -41,7 +41,7 @@
 
 typedef struct {
   u32 sw_if_index;
-  u8 data[64 - sizeof (u32)];
+  u8 data[128 - sizeof (u32)];
 } interface_output_trace_t;
 
 u8 * format_vnet_interface_output_trace (u8 * s, va_list * va)
@@ -98,14 +98,14 @@ 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];
-         memcpy (t0->data, vlib_buffer_get_current (b0),
+         clib_memcpy (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];
-         memcpy (t1->data, vlib_buffer_get_current (b1),
+         clib_memcpy (t1->data, vlib_buffer_get_current (b1),
                  sizeof (t1->data));
        }
       from += 2;
@@ -126,7 +126,7 @@ 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];
-         memcpy (t0->data, vlib_buffer_get_current (b0),
+         clib_memcpy (t0->data, vlib_buffer_get_current (b0),
                  sizeof (t0->data));
        }
       from += 1;
@@ -495,9 +495,10 @@ vnet_interface_output_node_no_flatten (vlib_main_t * vm,
          n_packets += 2;
 
           if (PREDICT_FALSE(si->output_feature_bitmap &&
-              vnet_buffer(b0)->output_features.bitmap != (1 << INTF_OUTPUT_FEAT_DONE)))
+              ((b0->flags & BUFFER_OUTPUT_FEAT_DONE) == 0)))
             {
               u32 next0;
+              b0->flags |= BUFFER_OUTPUT_FEAT_DONE;
               vnet_buffer(b0)->output_features.bitmap = si->output_feature_bitmap;
               count_trailing_zeros(next0, vnet_buffer(b0)->output_features.bitmap);
               vnet_buffer(b0)->output_features.bitmap &= ~(1 << next0);
@@ -521,9 +522,10 @@ vnet_interface_output_node_no_flatten (vlib_main_t * vm,
             }
 
           if (PREDICT_FALSE(si->output_feature_bitmap &&
-              vnet_buffer(b1)->output_features.bitmap != (1 << INTF_OUTPUT_FEAT_DONE)))
+              ((b1->flags & BUFFER_OUTPUT_FEAT_DONE) == 0)))
             {
               u32 next1;
+              b1->flags |= BUFFER_OUTPUT_FEAT_DONE;
               vnet_buffer(b1)->output_features.bitmap = si->output_feature_bitmap;
               count_trailing_zeros(next1, vnet_buffer(b1)->output_features.bitmap);
               vnet_buffer(b1)->output_features.bitmap &= ~(1 << next1);
@@ -573,9 +575,10 @@ vnet_interface_output_node_no_flatten (vlib_main_t * vm,
          n_packets += 1;
 
           if (PREDICT_FALSE(si->output_feature_bitmap &&
-              vnet_buffer(b0)->output_features.bitmap != (1 << INTF_OUTPUT_FEAT_DONE)))
+              ((b0->flags & BUFFER_OUTPUT_FEAT_DONE) == 0)))
             {
               u32 next0;
+              b0->flags |= BUFFER_OUTPUT_FEAT_DONE;
               vnet_buffer(b0)->output_features.bitmap = si->output_feature_bitmap;
               count_trailing_zeros(next0, vnet_buffer(b0)->output_features.bitmap);
               vnet_buffer(b0)->output_features.bitmap &= ~(1 << next0);
@@ -1137,6 +1140,8 @@ VLIB_REGISTER_NODE (drop_buffers,static) = {
   .validate_frame = validate_error_frame,
 };
 
+VLIB_NODE_FUNCTION_MULTIARCH (drop_buffers, process_drop)
+
 VLIB_REGISTER_NODE (punt_buffers,static) = {
   .function = process_punt,
   .flags = (VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH
@@ -1147,12 +1152,16 @@ VLIB_REGISTER_NODE (punt_buffers,static) = {
   .validate_frame = validate_error_frame,
 };
 
+VLIB_NODE_FUNCTION_MULTIARCH (punt_buffers, process_punt)
+
 VLIB_REGISTER_NODE (vnet_per_buffer_interface_output_node,static) = {
   .function = vnet_per_buffer_interface_output,
   .name = "interface-output",
   .vector_size = sizeof (u32),
 };
 
+VLIB_NODE_FUNCTION_MULTIARCH (vnet_per_buffer_interface_output_node, vnet_per_buffer_interface_output)
+
 clib_error_t *
 vnet_per_buffer_interface_output_hw_interface_add_del (vnet_main_t * vnm,
                                                       u32 hw_if_index,