vec_add2 (sm->addresses, ap, 1);
ap->addr = *addr;
-
+ clib_bitmap_alloc (ap->busy_port_bitmap, 65535);
}
static int is_snat_address_used_in_static_mapping (snat_main_t *sm,
{
a = sm->addresses + i;
/* External port must be unused */
- if (clib_bitmap_get (a->busy_port_bitmap, e_port))
+ if (clib_bitmap_get_no_check (a->busy_port_bitmap, e_port))
return VNET_API_ERROR_INVALID_VALUE;
- a->busy_port_bitmap = clib_bitmap_set (a->busy_port_bitmap,
- e_port, 1);
+ clib_bitmap_set_no_check (a->busy_port_bitmap, e_port, 1);
if (e_port > 1024)
a->busy_ports++;
kv.key = m_key.as_u64;
kv.value = m - sm->static_mappings;
clib_bihash_add_del_8_8(&sm->static_mapping_by_external, &kv, 1);
+
+ /* Assign worker */
+ if (sm->workers)
+ {
+ snat_user_key_t w_key0;
+ snat_static_mapping_key_t w_key1;
+
+ w_key0.addr = m->local_addr;
+ w_key0.fib_index = m->fib_index;
+ kv.key = w_key0.as_u64;
+
+ if (clib_bihash_search_8_8 (&sm->worker_by_in, &kv, &value))
+ {
+ kv.value = sm->first_worker_index +
+ sm->workers[sm->next_worker++ % vec_len (sm->workers)];
+
+ clib_bihash_add_del_8_8 (&sm->worker_by_in, &kv, 1);
+ }
+ else
+ {
+ kv.value = value.value;
+ }
+
+ w_key1.addr = m->external_addr;
+ w_key1.port = clib_host_to_net_u16 (m->external_port);
+ w_key1.fib_index = sm->outside_fib_index;
+ kv.key = w_key1.as_u64;
+ clib_bihash_add_del_8_8 (&sm->worker_by_out, &kv, 1);
+ }
}
else
{
if (sm->addresses[i].addr.as_u32 == e_addr.as_u32)
{
a = sm->addresses + i;
- a->busy_port_bitmap = clib_bitmap_set (a->busy_port_bitmap,
- e_port, 0);
+ clib_bitmap_set_no_check (a->busy_port_bitmap, e_port, 0);
a->busy_ports--;
break;
REPLY_MACRO2(VL_API_SNAT_SHOW_CONFIG_REPLY,
({
- rmp->translation_buckets = htons (sm->translation_buckets);
- rmp->translation_memory_size = htons (sm->translation_memory_size);
- rmp->user_buckets = htons (sm->user_buckets);
- rmp->user_memory_size = htons (sm->user_memory_size);
- rmp->max_translations_per_user = htons (sm->max_translations_per_user);
- rmp->outside_vrf_id = htons (sm->outside_vrf_id);
- rmp->inside_vrf_id = htons (sm->inside_vrf_id);
+ rmp->translation_buckets = htonl (sm->translation_buckets);
+ rmp->translation_memory_size = htonl (sm->translation_memory_size);
+ rmp->user_buckets = htonl (sm->user_buckets);
+ rmp->user_memory_size = htonl (sm->user_memory_size);
+ rmp->max_translations_per_user = htonl (sm->max_translations_per_user);
+ rmp->outside_vrf_id = htonl (sm->outside_vrf_id);
+ rmp->inside_vrf_id = htonl (sm->inside_vrf_id);
rmp->static_mapping_only = sm->static_mapping_only;
rmp->static_mapping_connection_tracking =
sm->static_mapping_connection_tracking;
a = sm->addresses + address_index;
- ASSERT (clib_bitmap_get (a->busy_port_bitmap, port_host_byte_order) == 1);
+ ASSERT (clib_bitmap_get_no_check (a->busy_port_bitmap,
+ port_host_byte_order) == 1);
- a->busy_port_bitmap = clib_bitmap_set (a->busy_port_bitmap,
- port_host_byte_order, 0);
+ clib_bitmap_set_no_check (a->busy_port_bitmap, port_host_byte_order, 0);
a->busy_ports--;
}
portnum &= 0xFFFF;
if (portnum < 1024)
continue;
- if (clib_bitmap_get (a->busy_port_bitmap, portnum))
+ if (clib_bitmap_get_no_check (a->busy_port_bitmap, portnum))
continue;
- a->busy_port_bitmap = clib_bitmap_set (a->busy_port_bitmap,
- portnum, 1);
+ clib_bitmap_set_no_check (a->busy_port_bitmap, portnum, 1);
a->busy_ports++;
/* Caller sets protocol and fib index */
k->addr = a->addr;
snat_user_t * u;
snat_static_mapping_t *m;
snat_interface_t *i;
+ snat_address_t * ap;
vnet_main_t *vnm = vnet_get_main();
snat_main_per_thread_data_t *tsm;
u32 users_num = 0, sessions_num = 0, *worker;
vnet_get_sw_interface (vnm, i->sw_if_index),
i->is_inside ? "in" : "out");
}));
+
+ vec_foreach (ap, sm->addresses)
+ {
+ u8 * s = format (0, "");
+ vlib_cli_output (vm, "%U", format_ip4_address, &ap->addr);
+ clib_bitmap_foreach (j, ap->busy_port_bitmap,
+ ({
+ s = format (s, " %d", j);
+ }));
+ vlib_cli_output (vm, " %d busy ports:%v", ap->busy_ports, s);
+ }
}
if (sm->num_workers > 1)
{
vlib_worker_thread_t *w =
vlib_worker_threads + *worker + sm->first_worker_index;
- vlib_cli_output (vm, " %s", w->name);
+ vlib_cli_output (vm, " %v", w->name);
}
}
}
continue;
vlib_worker_thread_t *w = vlib_worker_threads + j;
- vlib_cli_output (vm, "Thread %d (%s at lcore %u):", j, w->name,
+ vlib_cli_output (vm, "Thread %d (%v at lcore %u):", j, w->name,
w->lcore_id);
vlib_cli_output (vm, " %d list pool elements",
pool_elts (tsm->list_pool));