summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/snat-plugin/snat/in2out.c2
-rw-r--r--plugins/snat-plugin/snat/out2in.c4
-rw-r--r--plugins/snat-plugin/snat/snat.c6
3 files changed, 10 insertions, 2 deletions
diff --git a/plugins/snat-plugin/snat/in2out.c b/plugins/snat-plugin/snat/in2out.c
index e1edbb81581..43ee2d0e75a 100644
--- a/plugins/snat-plugin/snat/in2out.c
+++ b/plugins/snat-plugin/snat/in2out.c
@@ -1047,6 +1047,8 @@ snat_in2out_worker_handoff_fn (vlib_main_t * vm,
u32 current_worker_index = ~0;
u32 cpu_index = os_get_cpu_number ();
+ ASSERT (vec_len (sm->workers));
+
if (PREDICT_FALSE (handoff_queue_elt_by_worker_index == 0))
{
vec_validate (handoff_queue_elt_by_worker_index, tm->n_vlib_mains - 1);
diff --git a/plugins/snat-plugin/snat/out2in.c b/plugins/snat-plugin/snat/out2in.c
index a4641d3a71e..13e596b9a0d 100644
--- a/plugins/snat-plugin/snat/out2in.c
+++ b/plugins/snat-plugin/snat/out2in.c
@@ -830,6 +830,8 @@ snat_out2in_worker_handoff_fn (vlib_main_t * vm,
u32 current_worker_index = ~0;
u32 cpu_index = os_get_cpu_number ();
+ ASSERT (vec_len (sm->workers));
+
if (PREDICT_FALSE (handoff_queue_elt_by_worker_index == 0))
{
vec_validate (handoff_queue_elt_by_worker_index, tm->n_vlib_mains - 1);
@@ -888,6 +890,8 @@ snat_out2in_worker_handoff_fn (vlib_main_t * vm,
if (PREDICT_FALSE (next_worker_index != cpu_index))
{
+ do_handoff = 1;
+
if (next_worker_index != current_worker_index)
{
if (hf)
diff --git a/plugins/snat-plugin/snat/snat.c b/plugins/snat-plugin/snat/snat.c
index 70df44ea1d4..02077c329f0 100644
--- a/plugins/snat-plugin/snat/snat.c
+++ b/plugins/snat-plugin/snat/snat.c
@@ -494,8 +494,10 @@ int snat_add_static_mapping(ip4_address_t l_addr, ip4_address_t e_addr,
if (!clib_bihash_search_8_8 (&sm->user_hash, &kv, &value))
{
user_index = value.value;
- clib_bihash_search_8_8 (&sm->worker_by_in, &kv, &value);
- tsm = vec_elt_at_index (sm->per_thread_data, value.value);
+ if (!clib_bihash_search_8_8 (&sm->worker_by_in, &kv, &value))
+ tsm = vec_elt_at_index (sm->per_thread_data, value.value);
+ else
+ tsm = vec_elt_at_index (sm->per_thread_data, sm->num_workers);
u = pool_elt_at_index (tsm->users, user_index);
if (u->nstaticsessions)
{