aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/snat-plugin/snat/out2in.c
diff options
context:
space:
mode:
authorMatus Fabian <matfabia@cisco.com>2016-12-01 01:32:03 -0800
committerDamjan Marion <dmarion.lists@gmail.com>2016-12-02 14:42:26 +0000
commit4933168df31b88c24f03b467cae81a06b784813d (patch)
tree643266e220280a61974bb8b059236ffbaaa0173e /plugins/snat-plugin/snat/out2in.c
parentdcbc86a8afd3b928ffe5bd5a5d15da31ee762b4f (diff)
snat: fix 1:1 NAT with multiple workers
Assign worker when static mapping is created. Change-Id: I204e486e2ba5d1ef8e357759c35ba92a25a9a097 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.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/plugins/snat-plugin/snat/out2in.c b/plugins/snat-plugin/snat/out2in.c
index 13e596b9a0d..f1f4159cdce 100644
--- a/plugins/snat-plugin/snat/out2in.c
+++ b/plugins/snat-plugin/snat/out2in.c
@@ -877,9 +877,20 @@ snat_out2in_worker_handoff_fn (vlib_main_t * vm,
/* Ever heard of of the "user" before? */
if (clib_bihash_search_8_8 (&sm->worker_by_out, &kv0, &value0))
{
- /* No, assign next available worker (RR) */
- next_worker_index = sm->first_worker_index +
- sm->workers[sm->next_worker++ % vec_len (sm->workers)];
+ key0.port = 0;
+ kv0.key = key0.as_u64;
+
+ if (clib_bihash_search_8_8 (&sm->worker_by_out, &kv0, &value0))
+ {
+ /* No, assign next available worker (RR) */
+ next_worker_index = sm->first_worker_index +
+ sm->workers[sm->next_worker++ % vec_len (sm->workers)];
+ }
+ else
+ {
+ /* Static mapping without port */
+ next_worker_index = value0.value;
+ }
/* Add to translated packets worker lookup */
kv0.value = next_worker_index;