+#ifndef CLIB_MARCH_VARIANT
+static_always_inline uword
+vnet_interface_output_node_inline (vlib_main_t * vm,
+ vlib_node_runtime_t * node,
+ vlib_frame_t * frame, vnet_main_t * vnm,
+ vnet_hw_interface_t * hi,
+ int do_tx_offloads)
+{
+ /*
+ * The 3-headed "if" is here because we want to err on the side
+ * of not impacting the non-GSO performance - so for the more
+ * common case of no GSO interfaces we want to prevent the
+ * segmentation codepath from being there altogether.
+ */
+ if (PREDICT_TRUE (vnm->interface_main.gso_interface_count == 0))
+ return vnet_interface_output_node_inline_gso (vm, node, frame, vnm, hi,
+ do_tx_offloads,
+ /* do_segmentation */ 0);
+ else if (hi->flags & VNET_HW_INTERFACE_FLAG_SUPPORTS_GSO)
+ return vnet_interface_output_node_inline_gso (vm, node, frame, vnm, hi,
+ do_tx_offloads,
+ /* do_segmentation */ 0);
+ else
+ return vnet_interface_output_node_inline_gso (vm, node, frame, vnm, hi,
+ do_tx_offloads,
+ /* do_segmentation */ 1);
+}
+
+uword
+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;
+ vnet_interface_output_runtime_t *rt = (void *) node->runtime_data;
+ hi = vnet_get_sup_hw_interface (vnm, rt->sw_if_index);
+
+ vnet_interface_pcap_tx_trace (vm, node, frame,
+ 0 /* sw_if_index_from_buffer */ );
+
+ if (hi->flags & VNET_HW_INTERFACE_FLAG_SUPPORTS_TX_L4_CKSUM_OFFLOAD)
+ return vnet_interface_output_node_inline (vm, node, frame, vnm, hi,
+ /* do_tx_offloads */ 0);
+ else
+ return vnet_interface_output_node_inline (vm, node, frame, vnm, hi,
+ /* do_tx_offloads */ 1);
+}
+#endif /* CLIB_MARCH_VARIANT */