Use actual thread index from hash table instead of doing calculation.
Calculated index might be different and could lead to crash.
Type: fix
Change-Id: Iede9a67fbe541cb44eccd0d6ddf4e2c51eb35423
Signed-off-by: Klement Sekera <ksekera@cisco.com>
static_always_inline void
nat44_ei_ha_sdel (ip4_address_t *out_addr, u16 out_port,
ip4_address_t *eh_addr, u16 eh_port, u8 proto, u32 fib_index,
static_always_inline void
nat44_ei_ha_sdel (ip4_address_t *out_addr, u16 out_port,
ip4_address_t *eh_addr, u16 eh_port, u8 proto, u32 fib_index,
{
nat44_ei_main_t *nm = &nat44_ei_main;
clib_bihash_kv_8_8_t kv, value;
{
nat44_ei_main_t *nm = &nat44_ei_main;
clib_bihash_kv_8_8_t kv, value;
nat44_ei_session_t *s;
nat44_ei_main_per_thread_data_t *tnm;
nat44_ei_session_t *s;
nat44_ei_main_per_thread_data_t *tnm;
- if (nm->num_workers > 1)
- thread_index = nm->first_worker_index +
- (nm->workers[(clib_net_to_host_u16 (out_port) - 1024) /
- nm->port_per_thread]);
- else
- thread_index = nm->num_workers;
- tnm = vec_elt_at_index (nm->per_thread_data, thread_index);
-
init_nat_k (&kv, *out_addr, out_port, fib_index, proto);
if (clib_bihash_search_8_8 (&nm->out2in, &kv, &value))
return;
init_nat_k (&kv, *out_addr, out_port, fib_index, proto);
if (clib_bihash_search_8_8 (&nm->out2in, &kv, &value))
return;
+ ASSERT (thread_index == nat_value_get_thread_index (&value));
+ tnm = vec_elt_at_index (nm->per_thread_data, thread_index);
s = pool_elt_at_index (tnm->sessions, nat_value_get_session_index (&value));
nat44_ei_free_session_data_v2 (nm, s, thread_index, 1);
nat44_ei_delete_session (nm, s, thread_index);
s = pool_elt_at_index (tnm->sessions, nat_value_get_session_index (&value));
nat44_ei_free_session_data_v2 (nm, s, thread_index, 1);
nat44_ei_delete_session (nm, s, thread_index);
vec_elt_at_index (nm->per_thread_data, ctx->thread_index);
clib_bihash_kv_8_8_t s_kv;
vec_elt_at_index (nm->per_thread_data, ctx->thread_index);
clib_bihash_kv_8_8_t s_kv;
- s = pool_elt_at_index (tnm->sessions, kv->value);
+ if (ctx->thread_index != nat_value_get_thread_index (kv))
+ {
+ return 0;
+ }
+
+ s = pool_elt_at_index (tnm->sessions, nat_value_get_session_index (kv));
sess_timeout_time = s->last_heard + (f64) nat_session_get_timeout (
&nm->timeouts, s->nat_proto, s->state);
if (ctx->now >= sess_timeout_time)
sess_timeout_time = s->last_heard + (f64) nat_session_get_timeout (
&nm->timeouts, s->nat_proto, s->state);
if (ctx->now >= sess_timeout_time)
vec_elt_at_index (nm->per_thread_data, ctx->thread_index);
clib_bihash_kv_8_8_t s_kv;
vec_elt_at_index (nm->per_thread_data, ctx->thread_index);
clib_bihash_kv_8_8_t s_kv;
- s = pool_elt_at_index (tnm->sessions, kv->value);
+ if (ctx->thread_index != nat_value_get_thread_index (kv))
+ {
+ return 0;
+ }
+
+ s = pool_elt_at_index (tnm->sessions, nat_value_get_session_index (kv));
sess_timeout_time = s->last_heard + (f64) nat_session_get_timeout (
&nm->timeouts, s->nat_proto, s->state);
if (ctx->now >= sess_timeout_time)
sess_timeout_time = s->last_heard + (f64) nat_session_get_timeout (
&nm->timeouts, s->nat_proto, s->state);
if (ctx->now >= sess_timeout_time)