+ vlib_get_buffers (vm, from, bufs, n_buffers);
+
+ si = vnet_get_sw_interface (vnm, sw_if_index);
+ hi = vnet_get_sup_hw_interface (vnm, sw_if_index);
+
+ if (!(si->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) ||
+ !(hi->flags & VNET_HW_INTERFACE_FLAG_LINK_UP))
+ {
+ vlib_simple_counter_main_t *cm;
+
+ cm = vec_elt_at_index (vnm->interface_main.sw_if_counters,
+ VNET_INTERFACE_COUNTER_TX_ERROR);
+ vlib_increment_simple_counter (cm, ti, sw_if_index, n_buffers);
+
+ return vlib_error_drop_buffers (
+ vm, node, from,
+ /* buffer stride */ 1, n_buffers, VNET_INTERFACE_OUTPUT_NEXT_DROP,
+ node->node_index, VNET_INTERFACE_OUTPUT_ERROR_INTERFACE_DOWN);
+ }
+
+ /* interface-output feature arc handling */
+ if (PREDICT_FALSE (vnet_have_features (arc, sw_if_index)))
+ {
+ vnet_feature_config_main_t *fcm;
+ fcm = vnet_feature_get_config_main (arc);
+ config_index = vnet_get_feature_config_index (arc, sw_if_index);
+ vnet_get_config_data (&fcm->config_main, &config_index, &next_index, 0);
+ arc_or_subif = 1;
+ }
+ else if (hash_elts (hi->sub_interface_sw_if_index_by_id))
+ arc_or_subif = 1;
+
+ ccm = im->combined_sw_if_counters + VNET_INTERFACE_COUNTER_TX;
+
+ if ((hi->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TX_CKSUM) == 0)
+ do_tx_offloads = 1;
+
+ if (do_tx_offloads == 0 && arc_or_subif == 0)
+ n_bytes = vnet_interface_output_node_inline (
+ vm, sw_if_index, ccm, bufs, config_index, arc, n_buffers, 0, 0);
+ else if (do_tx_offloads == 0 && arc_or_subif == 1)
+ n_bytes = vnet_interface_output_node_inline (
+ vm, sw_if_index, ccm, bufs, config_index, arc, n_buffers, 0, 1);
+ else if (do_tx_offloads == 1 && arc_or_subif == 0)
+ n_bytes = vnet_interface_output_node_inline (
+ vm, sw_if_index, ccm, bufs, config_index, arc, n_buffers, 1, 0);