NAT: fixed get_worker_out2in bug (VPP-1116)
Change-Id: I5e080d69f28661cc0b1846885d5001526b54fbd9
Signed-off-by: Matus Fabian <matfabia@cisco.com>
diff --git a/src/plugins/nat/nat.c b/src/plugins/nat/nat.c
index 721ad16..9993de0 100644
--- a/src/plugins/nat/nat.c
+++ b/src/plugins/nat/nat.c
@@ -1586,7 +1586,7 @@
clib_bitmap_foreach (i, bitmap,
({
vec_add1(sm->workers, i);
- sm->per_thread_data[i].snat_thread_index = j;
+ sm->per_thread_data[sm->first_worker_index + i].snat_thread_index = j;
j++;
}));
@@ -2758,6 +2758,7 @@
snat_session_t *s;
int i;
u32 proto;
+ u32 next_worker_index = 0;
/* first try static mappings without port */
if (PREDICT_FALSE (pool_elts (sm->static_mappings)))
@@ -2873,7 +2874,10 @@
}
/* worker by outside port */
- return (u32) ((clib_net_to_host_u16 (port) - 1024) / sm->port_per_thread);
+ next_worker_index = sm->first_worker_index;
+ next_worker_index +=
+ sm->workers[(clib_net_to_host_u16 (port) - 1024) / sm->port_per_thread];
+ return next_worker_index;
}
static clib_error_t *
diff --git a/src/plugins/nat/nat64.c b/src/plugins/nat/nat64.c
index e60d9ec..571e071 100644
--- a/src/plugins/nat/nat64.c
+++ b/src/plugins/nat/nat64.c
@@ -202,7 +202,7 @@
/* worker by outside port (TCP/UDP) */
port = clib_net_to_host_u16 (port);
if (port > 1024)
- return (u32) ((port - 1024) / sm->port_per_thread);
+ return nm->sm->first_worker_index + ((port - 1024) / sm->port_per_thread);
return vlib_get_thread_index ();
}
@@ -497,13 +497,17 @@
snat_main_t *sm = nm->sm;
snat_session_key_t k;
u32 ai;
+ u32 worker_index = 0;
int rv;
k.protocol = proto;
+ if (sm->num_workers > 1)
+ worker_index = thread_index - sm->first_worker_index;
+
rv =
sm->alloc_addr_and_port (nm->addr_pool, fib_index, thread_index, &k, &ai,
- sm->port_per_thread, thread_index);
+ sm->port_per_thread, worker_index);
if (!rv)
{