{
clib_bihash_kv_8_8_t *v = va_arg (*args, clib_bihash_kv_8_8_t *);
- s = format (s, "%U session-index %llu", format_snat_key, v->key, v->value);
+ s = format (s, "%U thread-index %llu session-index %llu", format_snat_key,
+ v->key, nat_value_get_thread_index (v),
+ nat_value_get_session_index (v));
return s;
}
u8 is_ha)
{
clib_bihash_kv_8_8_t kv;
- snat_main_per_thread_data_t *tsm =
- vec_elt_at_index (sm->per_thread_data, thread_index);
if (is_ed_session (s))
{
else
{
init_nat_i2o_k (&kv, s);
- if (clib_bihash_add_del_8_8 (&tsm->in2out, &kv, 0))
+ if (clib_bihash_add_del_8_8 (&sm->in2out, &kv, 0))
nat_elog_warn ("in2out key del failed");
init_nat_o2i_k (&kv, s);
- if (clib_bihash_add_del_8_8 (&tsm->out2in, &kv, 0))
+ if (clib_bihash_add_del_8_8 (&sm->out2in, &kv, 0))
nat_elog_warn ("out2in key del failed");
if (!is_ha)
local->fib_index =
fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP4, vrf_id,
sm->fib_src_low);
- init_nat_kv (&kv, m->local_addr, m->local_port,
- local->fib_index, m->proto,
- m - sm->static_mappings);
+ init_nat_kv (&kv, m->local_addr, m->local_port, local->fib_index,
+ m->proto, 0, m - sm->static_mappings);
clib_bihash_add_del_8_8 (&sm->static_mapping_by_local, &kv, 1);
return 0;
}
if (!out2in_only)
{
init_nat_kv (&kv, m->local_addr, m->local_port, fib_index, m->proto,
- m - sm->static_mappings);
+ 0, m - sm->static_mappings);
clib_bihash_add_del_8_8 (&sm->static_mapping_by_local, &kv, 1);
}
- init_nat_kv (&kv, m->external_addr, m->external_port, 0, m->proto,
+ init_nat_kv (&kv, m->external_addr, m->external_port, 0, m->proto, 0,
m - sm->static_mappings);
clib_bihash_add_del_8_8 (&sm->static_mapping_by_external, &kv, 1);
else
m->affinity_per_service_list_head_index = ~0;
- init_nat_kv (&kv, m->external_addr, m->external_port, 0, m->proto,
+ init_nat_kv (&kv, m->external_addr, m->external_port, 0, m->proto, 0,
m - sm->static_mappings);
if (clib_bihash_add_del_8_8 (&sm->static_mapping_by_external, &kv, 1))
{
if (!out2in_only)
{
init_nat_kv (&kv, locals[i].addr, locals[i].port,
- locals[i].fib_index, m->proto,
+ locals[i].fib_index, m->proto, 0,
m - sm->static_mappings);
clib_bihash_add_del_8_8 (&sm->static_mapping_by_local, &kv, 1);
}
if (!is_out2in_only_static_mapping (m))
{
- init_nat_kv (&kv, l_addr, l_port, local->fib_index, proto,
+ init_nat_kv (&kv, l_addr, l_port, local->fib_index, proto, 0,
m - sm->static_mappings);
if (clib_bihash_add_del_8_8 (&sm->static_mapping_by_local, &kv, 1))
nat_elog_err ("static_mapping_by_local key add failed");
vec_free (a->busy_##n##_ports_per_thread);
foreach_nat_protocol
#undef _
+
if (twice_nat)
- {
- vec_del1 (sm->twice_nat_addresses, i);
- return 0;
- }
- else
- vec_del1 (sm->addresses, i);
+ {
+ vec_del1 (sm->twice_nat_addresses, i);
+ return 0;
+ }
+ else vec_del1 (sm->addresses, i);
/* Delete external address from FIB */
- /* *INDENT-OFF* */
pool_foreach (interface, sm->interfaces)
- {
- if (nat_interface_is_inside(interface) || sm->out2in_dpo)
- continue;
+ {
+ if (nat_interface_is_inside (interface) || sm->out2in_dpo)
+ continue;
+
+ snat_add_del_addr_to_fib (&addr, 32, interface->sw_if_index, 0);
+ break;
+ }
- snat_add_del_addr_to_fib(&addr, 32, interface->sw_if_index, 0);
- break;
- }
pool_foreach (interface, sm->output_feature_interfaces)
{
if (nat_interface_is_inside(interface) || sm->out2in_dpo)
snat_add_del_addr_to_fib(&addr, 32, interface->sw_if_index, 0);
break;
}
- /* *INDENT-ON* */
return 0;
}
typedef struct
{
- /* Main lookup tables */
- clib_bihash_8_8_t out2in;
- clib_bihash_8_8_t in2out;
-
/* Find-a-user => src address lookup */
clib_bihash_8_8_t user_hash;
/* Static mapping pool */
snat_static_mapping_t *static_mappings;
+ /* Endpoint independent lookup tables */
+ clib_bihash_8_8_t in2out;
+ clib_bihash_8_8_t out2in;
+
/* Endpoint dependent lookup table */
clib_bihash_16_8_t flow_hash;
{
clib_bihash_kv_8_8_t kv;
- snat_main_per_thread_data_t *tsm =
- vec_elt_at_index (sm->per_thread_data, thread_index);
-
init_nat_i2o_k (&kv, s);
- if (clib_bihash_add_del_8_8 (&tsm->in2out, &kv, 0))
+ if (clib_bihash_add_del_8_8 (&sm->in2out, &kv, 0))
nat_elog_warn ("in2out key del failed");
init_nat_o2i_k (&kv, s);
- if (clib_bihash_add_del_8_8 (&tsm->out2in, &kv, 0))
+ if (clib_bihash_add_del_8_8 (&sm->out2in, &kv, 0))
nat_elog_warn ("out2in key del failed");
if (!is_ha)
tsm = vec_elt_at_index (sm->per_thread_data, sm->num_workers);
init_nat_k (&kv, *addr, port, fib_index, proto);
- t = is_in ? &tsm->in2out : &tsm->out2in;
+ t = is_in ? &sm->in2out : &sm->out2in;
if (!clib_bihash_search_8_8 (t, &kv, &value))
{
if (pool_is_free_index (tsm->sessions, value.value))
local->fib_index = fib_table_find_or_create_and_lock (
FIB_PROTOCOL_IP4, vrf_id, sm->fib_src_low);
init_nat_kv (&kv, m->local_addr, m->local_port, local->fib_index,
- m->proto, m - sm->static_mappings);
+ m->proto, 0, m - sm->static_mappings);
clib_bihash_add_del_8_8 (&sm->static_mapping_by_local, &kv, 1);
return 0;
}
else
tsm = vec_elt_at_index (sm->per_thread_data, sm->num_workers);
- init_nat_kv (&kv, m->local_addr, m->local_port, fib_index, m->proto,
+ init_nat_kv (&kv, m->local_addr, m->local_port, fib_index, m->proto, 0,
m - sm->static_mappings);
clib_bihash_add_del_8_8 (&sm->static_mapping_by_local, &kv, 1);
- init_nat_kv (&kv, m->external_addr, m->external_port, 0, m->proto,
+ init_nat_kv (&kv, m->external_addr, m->external_port, 0, m->proto, 0,
m - sm->static_mappings);
clib_bihash_add_del_8_8 (&sm->static_mapping_by_external, &kv, 1);
pool_free (tsm->sessions);
pool_free (tsm->users);
- clib_bihash_free_8_8 (&tsm->in2out);
- clib_bihash_free_8_8 (&tsm->out2in);
clib_bihash_free_8_8 (&tsm->user_hash);
}
pool_alloc (tsm->lru_pool, translations);
pool_alloc (tsm->sessions, translations);
- clib_bihash_init_8_8 (&tsm->in2out, "in2out", translation_buckets, 0);
- clib_bihash_init_8_8 (&tsm->out2in, "out2in", translation_buckets, 0);
clib_bihash_init_8_8 (&tsm->user_hash, "users", user_buckets, 0);
- clib_bihash_set_kvp_format_fn_8_8 (&tsm->in2out, format_session_kvp);
- clib_bihash_set_kvp_format_fn_8_8 (&tsm->out2in, format_session_kvp);
clib_bihash_set_kvp_format_fn_8_8 (&tsm->user_hash, format_user_kvp);
pool_get (tsm->lru_pool, head);
if (sm->pat)
{
+ clib_bihash_free_8_8 (&sm->in2out);
+ clib_bihash_free_8_8 (&sm->out2in);
vec_foreach (tsm, sm->per_thread_data)
{
nat44_ei_worker_db_free (tsm);
if (sm->pat)
{
+ clib_bihash_init_8_8 (&sm->in2out, "in2out", translation_buckets, 0);
+ clib_bihash_init_8_8 (&sm->out2in, "out2in", translation_buckets, 0);
+ clib_bihash_set_kvp_format_fn_8_8 (&sm->in2out, format_session_kvp);
+ clib_bihash_set_kvp_format_fn_8_8 (&sm->out2in, format_session_kvp);
vec_foreach (tsm, sm->per_thread_data)
{
nat44_ei_worker_db_init (tsm, translations, translation_buckets,
if (sm->pat)
{
+ clib_bihash_free_8_8 (&sm->in2out);
+ clib_bihash_free_8_8 (&sm->out2in);
+ clib_bihash_init_8_8 (&sm->in2out, "in2out", nm->translation_buckets, 0);
+ clib_bihash_init_8_8 (&sm->out2in, "out2in", nm->translation_buckets, 0);
+ clib_bihash_set_kvp_format_fn_8_8 (&sm->in2out, format_session_kvp);
+ clib_bihash_set_kvp_format_fn_8_8 (&sm->out2in, format_session_kvp);
vec_foreach (tsm, sm->per_thread_data)
{
nat44_ei_worker_db_free (tsm);
}
break;
}
- init_nat_o2i_kv (&kv, s, s - tsm->sessions);
- if (clib_bihash_add_del_8_8 (&tsm->out2in, &kv, 1))
+ init_nat_o2i_kv (&kv, s, thread_index, s - tsm->sessions);
+ if (clib_bihash_add_del_8_8 (&sm->out2in, &kv, 1))
nat_elog_warn ("out2in key add failed");
s->in2out.addr.as_u32 = in_addr->as_u32;
s->in2out.port = in_port;
s->in2out.fib_index = fib_index;
- init_nat_i2o_kv (&kv, s, s - tsm->sessions);
- if (clib_bihash_add_del_8_8 (&tsm->in2out, &kv, 1))
+ init_nat_i2o_kv (&kv, s, thread_index, s - tsm->sessions);
+ if (clib_bihash_add_del_8_8 (&sm->in2out, &kv, 1))
nat_elog_warn ("in2out key add failed");
}
tsm = vec_elt_at_index (sm->per_thread_data, thread_index);
init_nat_k (&kv, *out_addr, out_port, fib_index, proto);
- if (clib_bihash_search_8_8 (&tsm->out2in, &kv, &value))
+ if (clib_bihash_search_8_8 (&sm->out2in, &kv, &value))
return;
- s = pool_elt_at_index (tsm->sessions, value.value);
+ s = pool_elt_at_index (tsm->sessions, nat_value_get_session_index (&value));
nat_free_session_data (sm, s, thread_index, 1);
nat44_delete_session (sm, s, thread_index);
}
tsm = vec_elt_at_index (sm->per_thread_data, thread_index);
init_nat_k (&kv, *out_addr, out_port, fib_index, proto);
- if (clib_bihash_search_8_8 (&tsm->out2in, &kv, &value))
+ if (clib_bihash_search_8_8 (&sm->out2in, &kv, &value))
return;
- s = pool_elt_at_index (tsm->sessions, value.value);
+ s = pool_elt_at_index (tsm->sessions, nat_value_get_session_index (&value));
s->total_pkts = total_pkts;
s->total_bytes = total_bytes;
}
/* NAT packet aimed at external address if */
/* has active sessions */
- if (clib_bihash_search_8_8 (&sm->per_thread_data[thread_index].out2in, &kv0,
- &value0))
+ if (clib_bihash_search_8_8 (&sm->out2in, &kv0, &value0))
{
/* or is static mappings */
ip4_address_t placeholder_addr;
init_nat_k (&kv0, ip0->src_address, src_port,
ip4_fib_table_get_index_for_sw_if_index (sw_if_index), proto0);
- if (!clib_bihash_search_8_8
- (&sm->per_thread_data[thread_index].out2in, &kv0, &value0))
+ if (!clib_bihash_search_8_8 (&sm->out2in, &kv0, &value0))
return 1;
/* dst NAT check */
init_nat_k (&kv0, ip0->dst_address, dst_port,
ip4_fib_table_get_index_for_sw_if_index (sw_if_index), proto0);
- if (!clib_bihash_search_8_8
- (&sm->per_thread_data[thread_index].in2out, &kv0, &value0))
+ if (!clib_bihash_search_8_8 (&sm->in2out, &kv0, &value0))
{
/* hairpinning */
/* *INDENT-OFF* */
if (ctx->now >= sess_timeout_time)
{
init_nat_o2i_k (&s_kv, s);
- if (clib_bihash_add_del_8_8 (&tsm->out2in, &s_kv, 0))
+ if (clib_bihash_add_del_8_8 (&sm->out2in, &s_kv, 0))
nat_elog_warn ("out2in key del failed");
nat_ipfix_logging_nat44_ses_delete (ctx->thread_index,
/* Add to translation hashes */
ctx0.now = now;
ctx0.thread_index = thread_index;
- init_nat_i2o_kv (&kv0, s, s - sm->per_thread_data[thread_index].sessions);
- if (clib_bihash_add_or_overwrite_stale_8_8
- (&sm->per_thread_data[thread_index].in2out, &kv0,
- nat44_i2o_is_idle_session_cb, &ctx0))
+ init_nat_i2o_kv (&kv0, s, thread_index,
+ s - sm->per_thread_data[thread_index].sessions);
+ if (clib_bihash_add_or_overwrite_stale_8_8 (
+ &sm->in2out, &kv0, nat44_i2o_is_idle_session_cb, &ctx0))
nat_elog_notice ("in2out key add failed");
- init_nat_o2i_kv (&kv0, s, s - sm->per_thread_data[thread_index].sessions);
- if (clib_bihash_add_or_overwrite_stale_8_8
- (&sm->per_thread_data[thread_index].out2in, &kv0,
- nat44_o2i_is_idle_session_cb, &ctx0))
+ init_nat_o2i_kv (&kv0, s, thread_index,
+ s - sm->per_thread_data[thread_index].sessions);
+ if (clib_bihash_add_or_overwrite_stale_8_8 (
+ &sm->out2in, &kv0, nat44_o2i_is_idle_session_cb, &ctx0))
nat_elog_notice ("out2in key add failed");
/* log NAT event */
}
init_nat_k (&kv0, *addr, *port, *fib_index, *proto);
- if (clib_bihash_search_8_8 (&tsm->in2out, &kv0, &value0))
+ if (clib_bihash_search_8_8 (&sm->in2out, &kv0, &value0))
{
if (vnet_buffer (b0)->sw_if_index[VLIB_TX] != ~0)
{
goto out;
}
- s0 = pool_elt_at_index (tsm->sessions, value0.value);
+ s0 = pool_elt_at_index (tsm->sessions,
+ nat_value_get_session_index (&value0));
}
out:
init_nat_k (&kv0, ip0->src_address,
vnet_buffer (b0)->ip.reass.l4_src_port, rx_fib_index0,
proto0);
- if (PREDICT_FALSE
- (clib_bihash_search_8_8
- (&sm->per_thread_data[thread_index].in2out, &kv0, &value0) != 0))
+ if (PREDICT_FALSE (clib_bihash_search_8_8 (&sm->in2out, &kv0, &value0) !=
+ 0))
{
if (is_slow_path)
{
}
}
else
- s0 =
- pool_elt_at_index (sm->per_thread_data[thread_index].sessions,
- value0.value);
+ s0 = pool_elt_at_index (sm->per_thread_data[thread_index].sessions,
+ nat_value_get_session_index (&value0));
b0->flags |= VNET_BUFFER_F_IS_NATED;
init_nat_k (&kv1, ip1->src_address,
vnet_buffer (b1)->ip.reass.l4_src_port, rx_fib_index1,
proto1);
- if (PREDICT_FALSE
- (clib_bihash_search_8_8
- (&sm->per_thread_data[thread_index].in2out, &kv1, &value1) != 0))
+ if (PREDICT_FALSE (clib_bihash_search_8_8 (&sm->in2out, &kv1, &value1) !=
+ 0))
{
if (is_slow_path)
{
}
}
else
- s1 =
- pool_elt_at_index (sm->per_thread_data[thread_index].sessions,
- value1.value);
+ s1 = pool_elt_at_index (sm->per_thread_data[thread_index].sessions,
+ nat_value_get_session_index (&value1));
b1->flags |= VNET_BUFFER_F_IS_NATED;
vnet_buffer (b0)->ip.reass.l4_src_port, rx_fib_index0,
proto0);
- if (clib_bihash_search_8_8
- (&sm->per_thread_data[thread_index].in2out, &kv0, &value0))
+ if (clib_bihash_search_8_8 (&sm->in2out, &kv0, &value0))
{
if (is_slow_path)
{
}
}
else
- s0 =
- pool_elt_at_index (sm->per_thread_data[thread_index].sessions,
- value0.value);
+ s0 = pool_elt_at_index (sm->per_thread_data[thread_index].sessions,
+ nat_value_get_session_index (&value0));
b0->flags |= VNET_BUFFER_F_IS_NATED;
if (ctx->now >= sess_timeout_time)
{
init_nat_i2o_k (&s_kv, s);
- if (clib_bihash_add_del_8_8 (&tsm->in2out, &s_kv, 0))
+ if (clib_bihash_add_del_8_8 (&sm->in2out, &s_kv, 0))
nat_elog_warn ("out2in key del failed");
nat_ipfix_logging_nat44_ses_delete (ctx->thread_index,
/* Add to translation hashes */
ctx0.now = now;
ctx0.thread_index = thread_index;
- init_nat_i2o_kv (&kv0, s, s - sm->per_thread_data[thread_index].sessions);
- if (clib_bihash_add_or_overwrite_stale_8_8
- (&sm->per_thread_data[thread_index].in2out, &kv0,
- nat44_i2o_is_idle_session_cb, &ctx0))
+ init_nat_i2o_kv (&kv0, s, thread_index,
+ s - sm->per_thread_data[thread_index].sessions);
+ if (clib_bihash_add_or_overwrite_stale_8_8 (
+ &sm->in2out, &kv0, nat44_i2o_is_idle_session_cb, &ctx0))
nat_elog_notice ("in2out key add failed");
- init_nat_o2i_kv (&kv0, s, s - sm->per_thread_data[thread_index].sessions);
- if (clib_bihash_add_or_overwrite_stale_8_8
- (&sm->per_thread_data[thread_index].out2in, &kv0,
- nat44_o2i_is_idle_session_cb, &ctx0))
+ init_nat_o2i_kv (&kv0, s, thread_index,
+ s - sm->per_thread_data[thread_index].sessions);
+ if (clib_bihash_add_or_overwrite_stale_8_8 (
+ &sm->out2in, &kv0, nat44_o2i_is_idle_session_cb, &ctx0))
nat_elog_notice ("out2in key add failed");
/* log NAT event */
u32 mapping_fib_index;
init_nat_k (&kv0, *addr, *port, *fib_index, *proto);
- if (clib_bihash_search_8_8 (&tsm->out2in, &kv0, &value0))
+ if (clib_bihash_search_8_8 (&sm->out2in, &kv0, &value0))
{
/* Try to match static mapping by external address and port,
destination address and port in packet */
goto out;
}
- s0 = pool_elt_at_index (tsm->sessions, value0.value);
+ s0 = pool_elt_at_index (tsm->sessions,
+ nat_value_get_session_index (&value0));
}
out:
init_nat_k (&kv0, ip0->dst_address,
vnet_buffer (b0)->ip.reass.l4_dst_port, rx_fib_index0,
proto0);
- if (clib_bihash_search_8_8
- (&sm->per_thread_data[thread_index].out2in, &kv0, &value0))
+ if (clib_bihash_search_8_8 (&sm->out2in, &kv0, &value0))
{
/* Try to match static mapping by external address and port,
destination address and port in packet */
}
}
else
- s0 = pool_elt_at_index (tsm->sessions, value0.value);
+ s0 = pool_elt_at_index (tsm->sessions,
+ nat_value_get_session_index (&value0));
old_addr0 = ip0->dst_address.as_u32;
ip0->dst_address = s0->in2out.addr;
init_nat_k (&kv1, ip1->dst_address,
vnet_buffer (b1)->ip.reass.l4_dst_port, rx_fib_index1,
proto1);
- if (clib_bihash_search_8_8
- (&sm->per_thread_data[thread_index].out2in, &kv1, &value1))
+ if (clib_bihash_search_8_8 (&sm->out2in, &kv1, &value1))
{
/* Try to match static mapping by external address and port,
destination address and port in packet */
}
}
else
- s1 =
- pool_elt_at_index (sm->per_thread_data[thread_index].sessions,
- value1.value);
+ s1 = pool_elt_at_index (sm->per_thread_data[thread_index].sessions,
+ nat_value_get_session_index (&value1));
old_addr1 = ip1->dst_address.as_u32;
ip1->dst_address = s1->in2out.addr;
vnet_buffer (b0)->ip.reass.l4_dst_port, rx_fib_index0,
proto0);
- if (clib_bihash_search_8_8
- (&sm->per_thread_data[thread_index].out2in, &kv0, &value0))
+ if (clib_bihash_search_8_8 (&sm->out2in, &kv0, &value0))
{
/* Try to match static mapping by external address and port,
destination address and port in packet */
}
}
else
- s0 =
- pool_elt_at_index (sm->per_thread_data[thread_index].sessions,
- value0.value);
+ s0 = pool_elt_at_index (sm->per_thread_data[thread_index].sessions,
+ nat_value_get_session_index (&value0));
old_addr0 = ip0->dst_address.as_u32;
ip0->dst_address = s0->in2out.addr;
vlib_cli_output (vm, "%U",
format_bihash_8_8, &sm->static_mapping_by_external,
verbose);
- vlib_cli_output (vm, "%U", format_bihash_16_8, &sm->flow_hash, verbose);
+ if (sm->endpoint_dependent)
+ {
+ vlib_cli_output (vm, "%U", format_bihash_16_8, &sm->flow_hash, verbose);
+ }
+ else
+ {
+ vlib_cli_output (vm, "%U", format_bihash_8_8, &sm->in2out, verbose);
+ vlib_cli_output (vm, "%U", format_bihash_8_8, &sm->out2in, verbose);
+ }
vec_foreach_index (i, sm->per_thread_data)
{
tsm = vec_elt_at_index (sm->per_thread_data, i);
vlib_cli_output (vm, "-------- thread %d %s --------\n",
i, vlib_worker_threads[i].name);
- if (sm->endpoint_dependent)
- {
- vlib_cli_output (vm, "%U", format_bihash_16_8, &sm->flow_hash,
- verbose);
- }
- else
- {
- vlib_cli_output (vm, "%U", format_bihash_8_8, &tsm->in2out, verbose);
- vlib_cli_output (vm, "%U", format_bihash_8_8, &tsm->out2in, verbose);
- }
vlib_cli_output (vm, "%U", format_bihash_8_8, &tsm->user_hash, verbose);
}
init_nat_k (&kv0, ip0->dst_address, udp0->dst_port,
sm->outside_fib_index, proto0);
- rv = clib_bihash_search_8_8 (&sm->per_thread_data[ti].out2in, &kv0,
- &value0);
+ rv = clib_bihash_search_8_8 (&sm->out2in, &kv0, &value0);
if (rv)
{
rv = 0;
goto trace;
}
- si = value0.value;
+ si = nat_value_get_session_index (&value0);
s0 = pool_elt_at_index (sm->per_thread_data[ti].sessions, si);
new_dst_addr0 = s0->in2out.addr.as_u32;
new_dst_port0 = s0->in2out.port;
init_nat_k (&kv0, ip0->dst_address, l4_header->src_port,
sm->outside_fib_index, protocol);
- if (clib_bihash_search_8_8 (&sm->per_thread_data[ti].out2in, &kv0,
- &value0))
+ if (clib_bihash_search_8_8 (&sm->out2in, &kv0, &value0))
return 1;
- si = value0.value;
+ si = nat_value_get_session_index (&value0);
s0 = pool_elt_at_index (sm->per_thread_data[ti].sessions, si);
new_dst_addr0 = s0->in2out.addr.as_u32;
vnet_buffer (b0)->sw_if_index[VLIB_TX] = s0->in2out.fib_index;
else
{
init_nat_k (&kv0, ip0->dst_address, 0, sm->outside_fib_index, 0);
- if (clib_bihash_search_8_8
- (&sm->static_mapping_by_external, &kv0, &value0))
+ if (clib_bihash_search_8_8 (&sm->static_mapping_by_external, &kv0,
+ &value0))
{
icmp_echo_header_t *echo0 = (icmp_echo_header_t *) (icmp0 + 1);
u16 icmp_id0 = echo0->identifier;
(clib_net_to_host_u16 (icmp_id0) - 1024) / sm->port_per_thread;
else
ti = sm->num_workers;
- int rv = clib_bihash_search_8_8 (&sm->per_thread_data[ti].out2in,
- &kv0, &value0);
+ int rv = clib_bihash_search_8_8 (&sm->out2in, &kv0, &value0);
if (!rv)
{
- si = value0.value;
+ si = nat_value_get_session_index (&value0);
s0 = pool_elt_at_index (sm->per_thread_data[ti].sessions, si);
new_dst_addr0 = s0->in2out.addr.as_u32;
vnet_buffer (b0)->sw_if_index[VLIB_TX] = s0->in2out.fib_index;
}
always_inline void
-init_nat_kv (clib_bihash_kv_8_8_t * kv, ip4_address_t addr, u16 port,
- u32 fib_index, nat_protocol_t proto, u64 value)
+init_nat_kv (clib_bihash_kv_8_8_t *kv, ip4_address_t addr, u16 port,
+ u32 fib_index, nat_protocol_t proto, u32 thread_index,
+ u32 session_index)
{
init_nat_k (kv, addr, port, fib_index, proto);
- kv->value = value;
+ kv->value = (u64) thread_index << 32 | session_index;
}
always_inline void
}
always_inline void
-init_nat_i2o_kv (clib_bihash_kv_8_8_t * kv, snat_session_t * s, u64 value)
+init_nat_i2o_kv (clib_bihash_kv_8_8_t *kv, snat_session_t *s, u32 thread_index,
+ u32 session_index)
{
init_nat_k (kv, s->in2out.addr, s->in2out.port, s->in2out.fib_index,
s->nat_proto);
- kv->value = value;
+ kv->value = (u64) thread_index << 32 | session_index;
}
always_inline void
}
always_inline void
-init_nat_o2i_kv (clib_bihash_kv_8_8_t * kv, snat_session_t * s, u64 value)
+init_nat_o2i_kv (clib_bihash_kv_8_8_t *kv, snat_session_t *s, u32 thread_index,
+ u32 session_index)
{
init_nat_k (kv, s->out2in.addr, s->out2in.port, s->out2in.fib_index,
s->nat_proto);
- kv->value = value;
+ kv->value = (u64) thread_index << 32 | session_index;
+}
+
+always_inline u32
+nat_value_get_thread_index (clib_bihash_kv_8_8_t *value)
+{
+ return value->value >> 32;
+}
+
+always_inline u32
+nat_value_get_session_index (clib_bihash_kv_8_8_t *value)
+{
+ return value->value & ~(u32) 0;
}
static inline uword