vlib_buffer_t *b0;
u32 next0;
nat44_ei_interface_t *i;
- u32 sw_if_index0;
+ u32 rx_sw_if_index0;
+ u32 tx_sw_if_index0;
/* speculatively enqueue b0 to the current next frame */
bi0 = from[0];
n_left_to_next -= 1;
b0 = vlib_get_buffer (vm, bi0);
- sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
- vnet_feature_next (&next0, b0);
+ rx_sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
+ tx_sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_TX];
pool_foreach (i, nm->output_feature_interfaces)
{
/* Only packets from NAT inside interface */
if ((nat44_ei_interface_is_inside (i)) &&
- (sw_if_index0 == i->sw_if_index))
+ (rx_sw_if_index0 == i->sw_if_index))
{
if (PREDICT_FALSE ((vnet_buffer (b0)->snat.flags) &
NAT44_EI_FLAG_HAIRPINNING))
{
if (PREDICT_TRUE (nm->num_workers > 1))
- next0 = NAT44_EI_HAIRPIN_SRC_NEXT_SNAT_IN2OUT_WH;
+ {
+ next0 = NAT44_EI_HAIRPIN_SRC_NEXT_SNAT_IN2OUT_WH;
+ goto skip_feature_next;
+ }
else
- next0 = NAT44_EI_HAIRPIN_SRC_NEXT_SNAT_IN2OUT;
+ {
+ next0 = NAT44_EI_HAIRPIN_SRC_NEXT_SNAT_IN2OUT;
+ goto skip_feature_next;
+ }
}
break;
}
}
+ vnet_feature_next (&next0, b0);
+ skip_feature_next:
+
if (next0 != NAT44_EI_HAIRPIN_SRC_NEXT_DROP)
{
- vlib_increment_simple_counter (
- &nm->counters.hairpinning, vm->thread_index, sw_if_index0, 1);
+ vlib_increment_simple_counter (&nm->counters.hairpinning,
+ vm->thread_index, tx_sw_if_index0,
+ 1);
}
/* verify speculative enqueue, maybe switch current next frame */