ip nat: use ip rx sw_if_index in ip-local arc start
This also changes the behavior of the nat44-ei hairpinning feature. Rather then enabling the feature on every nat interface, it is enabled only on local0. Type: improvement Signed-off-by: Filip Varga <fivarga@cisco.com> Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: I4e16a83c9e328aa75fc61df508b620ef743ca775
This commit is contained in:
@ -576,10 +576,34 @@ nat44_ei_get_interface (nat44_ei_interface_t *interfaces, u32 sw_if_index)
|
||||
}
|
||||
|
||||
static_always_inline int
|
||||
nat44_ei_hairpinning_enable (u32 sw_if_index, u8 is_enable)
|
||||
nat44_ei_hairpinning_enable (u8 is_enable)
|
||||
{
|
||||
return vnet_feature_enable_disable ("ip4-local", "nat44-ei-hairpinning",
|
||||
sw_if_index, is_enable, 0, 0);
|
||||
nat44_ei_main_t *nm = &nat44_ei_main;
|
||||
u32 sw_if_index = 0; // local0
|
||||
|
||||
if (is_enable)
|
||||
{
|
||||
nm->hairpin_reg += 1;
|
||||
if (1 == nm->hairpin_reg)
|
||||
{
|
||||
return vnet_feature_enable_disable (
|
||||
"ip4-local", "nat44-ei-hairpinning", sw_if_index, is_enable, 0, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (0 == nm->hairpin_reg)
|
||||
return 1;
|
||||
|
||||
nm->hairpin_reg -= 1;
|
||||
if (0 == nm->hairpin_reg)
|
||||
{
|
||||
return vnet_feature_enable_disable (
|
||||
"ip4-local", "nat44-ei-hairpinning", sw_if_index, is_enable, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
@ -648,7 +672,7 @@ nat44_ei_add_interface (u32 sw_if_index, u8 is_inside)
|
||||
}
|
||||
if (!is_inside)
|
||||
{
|
||||
rv = nat44_ei_hairpinning_enable (sw_if_index, 0);
|
||||
rv = nat44_ei_hairpinning_enable (0);
|
||||
if (rv)
|
||||
{
|
||||
return rv;
|
||||
@ -681,7 +705,7 @@ nat44_ei_add_interface (u32 sw_if_index, u8 is_inside)
|
||||
}
|
||||
if (is_inside && !nm->out2in_dpo)
|
||||
{
|
||||
rv = nat44_ei_hairpinning_enable (sw_if_index, 1);
|
||||
rv = nat44_ei_hairpinning_enable (1);
|
||||
if (rv)
|
||||
{
|
||||
return rv;
|
||||
@ -786,7 +810,7 @@ nat44_ei_del_interface (u32 sw_if_index, u8 is_inside)
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = nat44_ei_hairpinning_enable (sw_if_index, 1);
|
||||
rv = nat44_ei_hairpinning_enable (1);
|
||||
if (rv)
|
||||
{
|
||||
return rv;
|
||||
@ -819,7 +843,7 @@ nat44_ei_del_interface (u32 sw_if_index, u8 is_inside)
|
||||
}
|
||||
if (is_inside)
|
||||
{
|
||||
rv = nat44_ei_hairpinning_enable (sw_if_index, 0);
|
||||
rv = nat44_ei_hairpinning_enable (0);
|
||||
if (rv)
|
||||
{
|
||||
return rv;
|
||||
|
@ -1508,9 +1508,8 @@ ip4_local_set_next_and_error (vlib_node_runtime_t * error_node,
|
||||
next_index = *next;
|
||||
if (PREDICT_TRUE (error == (u8) IP4_ERROR_UNKNOWN_PROTOCOL))
|
||||
{
|
||||
vnet_feature_arc_start (arc_index,
|
||||
vnet_buffer (b)->sw_if_index[VLIB_RX],
|
||||
&next_index, b);
|
||||
vnet_feature_arc_start (
|
||||
arc_index, vnet_buffer (b)->ip.rx_sw_if_index, &next_index, b);
|
||||
*next = next_index;
|
||||
}
|
||||
}
|
||||
|
@ -1513,16 +1513,16 @@ ip6_local_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
|
||||
{
|
||||
u32 next32 = next[0];
|
||||
vnet_feature_arc_start (arc_index,
|
||||
vnet_buffer (b[0])->sw_if_index
|
||||
[VLIB_RX], &next32, b[0]);
|
||||
vnet_buffer (b[0])->ip.rx_sw_if_index,
|
||||
&next32, b[0]);
|
||||
next[0] = next32;
|
||||
}
|
||||
if (PREDICT_TRUE (ip6_unknown[1]))
|
||||
{
|
||||
u32 next32 = next[1];
|
||||
vnet_feature_arc_start (arc_index,
|
||||
vnet_buffer (b[1])->sw_if_index
|
||||
[VLIB_RX], &next32, b[1]);
|
||||
vnet_buffer (b[1])->ip.rx_sw_if_index,
|
||||
&next32, b[1]);
|
||||
next[1] = next32;
|
||||
}
|
||||
}
|
||||
@ -1642,8 +1642,8 @@ ip6_local_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
|
||||
{
|
||||
u32 next32 = next[0];
|
||||
vnet_feature_arc_start (arc_index,
|
||||
vnet_buffer (b[0])->sw_if_index
|
||||
[VLIB_RX], &next32, b[0]);
|
||||
vnet_buffer (b[0])->ip.rx_sw_if_index,
|
||||
&next32, b[0]);
|
||||
next[0] = next32;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user