- if (PREDICT_FALSE(si->output_feature_bitmap &&
- ((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);
- vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_tx,
- n_left_to_tx, bi0, next0);
- }
- else
- {
- vnet_buffer(b0)->output_features.bitmap = 0;
-
- if (PREDICT_FALSE(tx_swif0 != rt->sw_if_index))
- {
- /* update vlan subif tx counts, if required */
- vlib_increment_combined_counter (im->combined_sw_if_counters
- + VNET_INTERFACE_COUNTER_TX,
- cpu_index,
- tx_swif0,
- 1,
- n_bytes_b0);
- }
- }
-
- if (PREDICT_FALSE(si->output_feature_bitmap &&
- ((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);
- vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_tx,
- n_left_to_tx, bi1, next1);
- }
- else
- {
- vnet_buffer(b1)->output_features.bitmap = 0;
-
- /* update vlan subif tx counts, if required */
- if (PREDICT_FALSE(tx_swif1 != rt->sw_if_index))
- {
-
- vlib_increment_combined_counter (im->combined_sw_if_counters
- + VNET_INTERFACE_COUNTER_TX,
- cpu_index,
- tx_swif1,
- 1,
- n_bytes_b1);
- }
- }
+ if (with_features)
+ {
+ 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);
+ }
+ else
+ {
+ next1 = VNET_INTERFACE_OUTPUT_NEXT_TX;
+ vnet_buffer (b1)->output_features.bitmap = 0;
+
+ /* update vlan subif tx counts, if required */
+ if (PREDICT_FALSE (tx_swif1 != rt->sw_if_index))
+ {