vlib: refactor checksum offload support
[vpp.git] / src / vnet / interface_output.c
index 52c07ac..ff315f6 100644 (file)
@@ -91,6 +91,7 @@ format_vnet_interface_output_trace (u8 * s, va_list * va)
     }
   return s;
 }
+#endif /* CLIB_MARCH_VARIANT */
 
 static void
 vnet_interface_output_trace (vlib_main_t * vm,
@@ -336,28 +337,24 @@ vnet_interface_output_node_inline (vlib_main_t * vm,
 
          if (do_tx_offloads)
            {
-             u32 vnet_buffer_offload_flags =
-               (VNET_BUFFER_F_OFFLOAD_TCP_CKSUM |
-                VNET_BUFFER_F_OFFLOAD_UDP_CKSUM |
-                VNET_BUFFER_F_OFFLOAD_IP_CKSUM);
-             if (or_flags & vnet_buffer_offload_flags)
+             if (or_flags & VNET_BUFFER_F_OFFLOAD)
                {
-                 if (b[0]->flags & vnet_buffer_offload_flags)
+                 if (b[0]->flags & VNET_BUFFER_F_OFFLOAD)
                    vnet_calc_checksums_inline
                      (vm, b[0],
                       b[0]->flags & VNET_BUFFER_F_IS_IP4,
                       b[0]->flags & VNET_BUFFER_F_IS_IP6);
-                 if (b[1]->flags & vnet_buffer_offload_flags)
+                 if (b[1]->flags & VNET_BUFFER_F_OFFLOAD)
                    vnet_calc_checksums_inline
                      (vm, b[1],
                       b[1]->flags & VNET_BUFFER_F_IS_IP4,
                       b[1]->flags & VNET_BUFFER_F_IS_IP6);
-                 if (b[2]->flags & vnet_buffer_offload_flags)
+                 if (b[2]->flags & VNET_BUFFER_F_OFFLOAD)
                    vnet_calc_checksums_inline
                      (vm, b[2],
                       b[2]->flags & VNET_BUFFER_F_IS_IP4,
                       b[2]->flags & VNET_BUFFER_F_IS_IP6);
-                 if (b[3]->flags & vnet_buffer_offload_flags)
+                 if (b[3]->flags & VNET_BUFFER_F_OFFLOAD)
                    vnet_calc_checksums_inline
                      (vm, b[3],
                       b[3]->flags & VNET_BUFFER_F_IS_IP4,
@@ -405,10 +402,7 @@ vnet_interface_output_node_inline (vlib_main_t * vm,
 
          if (do_tx_offloads)
            {
-             if (b[0]->flags &
-                 (VNET_BUFFER_F_OFFLOAD_TCP_CKSUM |
-                  VNET_BUFFER_F_OFFLOAD_UDP_CKSUM |
-                  VNET_BUFFER_F_OFFLOAD_IP_CKSUM))
+             if (b[0]->flags & VNET_BUFFER_F_OFFLOAD)
                vnet_calc_checksums_inline
                  (vm, b[0],
                   b[0]->flags & VNET_BUFFER_F_IS_IP4,
@@ -427,7 +421,6 @@ vnet_interface_output_node_inline (vlib_main_t * vm,
                                   rt->sw_if_index, n_packets, n_bytes);
   return n_buffers;
 }
-#endif /* CLIB_MARCH_VARIANT */
 
 static_always_inline void vnet_interface_pcap_tx_trace
   (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame,
@@ -486,11 +479,12 @@ static_always_inline void vnet_interface_pcap_tx_trace
     }
 }
 
-#ifndef CLIB_MARCH_VARIANT
+static vlib_node_function_t CLIB_MULTIARCH_FN (vnet_interface_output_node);
 
-uword
-vnet_interface_output_node (vlib_main_t * vm, vlib_node_runtime_t * node,
-                           vlib_frame_t * frame)
+static uword
+CLIB_MULTIARCH_FN (vnet_interface_output_node) (vlib_main_t * vm,
+                                               vlib_node_runtime_t * node,
+                                               vlib_frame_t * frame)
 {
   vnet_main_t *vnm = vnet_get_main ();
   vnet_hw_interface_t *hi;
@@ -507,6 +501,15 @@ vnet_interface_output_node (vlib_main_t * vm, vlib_node_runtime_t * node,
     return vnet_interface_output_node_inline (vm, node, frame, vnm, hi,
                                              /* do_tx_offloads */ 1);
 }
+
+CLIB_MARCH_FN_REGISTRATION (vnet_interface_output_node);
+
+#ifndef CLIB_MARCH_VARIANT
+vlib_node_function_t *
+vnet_interface_output_node_get (void)
+{
+  return CLIB_MARCH_FN_POINTER (vnet_interface_output_node);
+}
 #endif /* CLIB_MARCH_VARIANT */
 
 /* Use buffer's sw_if_index[VNET_TX] to choose output interface. */
@@ -800,19 +803,21 @@ interface_drop_punt (vlib_main_t * vm,
          node->flags |= VLIB_NODE_FLAG_TRACE;
          while (n_trace && n_left)
            {
-             vlib_trace_buffer (vm, node, 0 /* next_index */ ,
-                                b[0], 0 /* follow chain */ );
-             /*
-              * Here we have a wireshark dissector problem.
-              * Packets may be well-formed, or not. We
-              * must not blow chunks in any case.
-              *
-              * Try to produce trace records which will help
-              * folks understand what's going on.
-              */
-             drop_catchup_trace (vm, node, b[0]);
-
-             n_trace--;
+             if (PREDICT_TRUE
+                 (vlib_trace_buffer (vm, node, 0 /* next_index */ , b[0],
+                                     0 /* follow chain */ )))
+               {
+                 /*
+                  * Here we have a wireshark dissector problem.
+                  * Packets may be well-formed, or not. We
+                  * must not blow chunks in any case.
+                  *
+                  * Try to produce trace records which will help
+                  * folks understand what's going on.
+                  */
+                 drop_catchup_trace (vm, node, b[0]);
+                 n_trace--;
+               }
              n_left--;
              b++;
            }