diff options
author | Matus Fabian <matfabia@cisco.com> | 2016-10-06 04:28:29 -0700 |
---|---|---|
committer | Ole Trøan <otroan@employees.org> | 2016-10-13 09:54:52 +0000 |
commit | 7e46a4dc841f635e45b8e8739338de407621667d (patch) | |
tree | e4cfcb9eae84267513a0e3b40d6b0986755a5888 /plugins/snat-plugin/snat/out2in.c | |
parent | 724b8159feeb3b4af80cd1e64233d0fae7c54590 (diff) |
VPP-446: 1:1 SNAT Inside overlapping interfaces
Change-Id: Idabf89bd27ee95769da16331a6bd1439497b2765
Signed-off-by: Matus Fabian <matfabia@cisco.com>
Diffstat (limited to 'plugins/snat-plugin/snat/out2in.c')
-rw-r--r-- | plugins/snat-plugin/snat/out2in.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/plugins/snat-plugin/snat/out2in.c b/plugins/snat-plugin/snat/out2in.c index b3497c40..7601eb8d 100644 --- a/plugins/snat-plugin/snat/out2in.c +++ b/plugins/snat-plugin/snat/out2in.c @@ -19,6 +19,7 @@ #include <vnet/ip/ip.h> #include <vnet/ethernet/ethernet.h> +#include <vnet/fib/ip4_fib.h> #include <snat/snat.h> #include <vppinfra/hash.h> @@ -778,7 +779,8 @@ static inline u32 icmp_out2in_fast (snat_main_t *sm, icmp46_header_t * icmp0, u32 sw_if_index0, vlib_node_runtime_t * node, - u32 next0) + u32 next0, + u32 rx_fib_index0) { snat_session_key_t key0, sm0; icmp_echo_header_t *echo0; @@ -791,6 +793,7 @@ static inline u32 icmp_out2in_fast (snat_main_t *sm, key0.addr = ip0->dst_address; key0.port = echo0->identifier; + key0.fib_index = rx_fib_index0; if (snat_static_mapping_match(sm, key0, &sm0, 1)) { @@ -879,6 +882,7 @@ snat_out2in_fast_node_fn (vlib_main_t * vm, icmp46_header_t * icmp0; snat_session_key_t key0, sm0; u32 proto0; + u32 rx_fib_index0; /* speculatively enqueue b0 to the current next frame */ bi0 = from[0]; @@ -896,6 +900,7 @@ snat_out2in_fast_node_fn (vlib_main_t * vm, icmp0 = (icmp46_header_t *) udp0; sw_if_index0 = vnet_buffer(b0)->sw_if_index[VLIB_RX]; + rx_fib_index0 = ip4_fib_table_get_index_for_sw_if_index(sw_if_index0); vnet_get_config_data (&cm->config_main, &b0->current_config_index, @@ -915,12 +920,13 @@ snat_out2in_fast_node_fn (vlib_main_t * vm, if (PREDICT_FALSE (proto0 == SNAT_PROTOCOL_ICMP)) { next0 = icmp_out2in_fast - (sm, b0, ip0, icmp0, sw_if_index0, node, next0); + (sm, b0, ip0, icmp0, sw_if_index0, node, next0, rx_fib_index0); goto trace00; } key0.addr = ip0->dst_address; key0.port = udp0->dst_port; + key0.fib_index = rx_fib_index0; if (snat_static_mapping_match(sm, key0, &sm0, 1)) { |