return next_worker_index;
}
+static u32
+get_thread_idx_by_port (u16 e_port)
+{
+ nat64_main_t *nm = &nat64_main;
+ u32 thread_idx = nm->num_workers;
+ if (nm->num_workers > 1)
+ {
+ thread_idx = nm->first_worker_index +
+ nm->workers[(e_port - 1024) / nm->port_per_thread %
+ _vec_len (nm->workers)];
+ }
+ return thread_idx;
+}
+
u32
nat64_get_worker_out2in (vlib_buffer_t * b, ip4_header_t * ip)
{
/* worker by outside port (TCP/UDP) */
port = clib_net_to_host_u16 (port);
if (port > 1024)
- return nm->first_worker_index + ((port - 1024) / nm->port_per_thread);
+ return get_thread_idx_by_port (port);
return vlib_get_thread_index ();
}
bitmap = clib_bitmap_set (bitmap, i, 1);
/* *INDENT-OFF* */
- clib_bitmap_foreach (i, bitmap,
- ({
+ clib_bitmap_foreach (i, bitmap)
+ {
vec_add1(nm->workers, i);
- }));
+ }
/* *INDENT-ON* */
clib_bitmap_free (bitmap);
/* Add/del external address to FIB */
/* *INDENT-OFF* */
- pool_foreach (interface, nm->interfaces,
- ({
+ pool_foreach (interface, nm->interfaces)
+ {
if (nat64_interface_is_inside(interface))
continue;
nat64_add_del_addr_to_fib (addr, 32, interface->sw_if_index, is_add);
break;
- }));
+ }
/* *INDENT-ON* */
return 0;
/* Check if interface already exists */
/* *INDENT-OFF* */
- pool_foreach (i, nm->interfaces,
- ({
+ pool_foreach (i, nm->interfaces)
+ {
if (i->sw_if_index == sw_if_index)
{
interface = i;
break;
}
- }));
+ }
/* *INDENT-ON* */
if (is_add)
nat64_interface_t *i = 0;
/* *INDENT-OFF* */
- pool_foreach (i, nm->interfaces,
- ({
+ pool_foreach (i, nm->interfaces)
+ {
if (fn (i, ctx))
break;
- }));
+ }
/* *INDENT-ON* */
}
ip46_address_t addr;
/* *INDENT-OFF* */
- pool_foreach (static_bib, nm->static_bibs,
- ({
+ pool_foreach (static_bib, nm->static_bibs)
+ {
if ((static_bib->thread_index != thread_index) || (static_bib->done))
continue;
}
static_bib->done = 1;
- }));
+ }
/* *INDENT-ON* */
return 0;
/* outside port must be assigned to same thread as internall address */
if ((out_port > 1024) && (nm->num_workers > 1))
{
- if (thread_index != ((out_port - 1024) / nm->port_per_thread))
+ if (thread_index != get_thread_idx_by_port (out_port))
return VNET_API_ERROR_INVALID_VALUE_2;
}
if (nm->num_workers)
{
/* *INDENT-OFF* */
- pool_foreach (static_bib, nm->static_bibs,
- ({
+ pool_foreach (static_bib, nm->static_bibs)
+ {
if (static_bib->done)
vec_add1 (to_be_free, static_bib - nm->static_bibs);
- }));
+ }
vec_foreach (index, to_be_free)
pool_put_index (nm->static_bibs, index[0]);
/* *INDENT-ON* */
static_bib->is_add = is_add;
static_bib->thread_index = thread_index;
static_bib->done = 0;
- worker_vm = vlib_mains[thread_index];
+ worker_vm = vlib_get_main_by_index (thread_index);
if (worker_vm)
vlib_node_set_interrupt_pending (worker_vm,
nat64_static_bib_worker_node.index);
int i;
uword event_type, *event_data = 0;
- if (vec_len (vlib_mains) == 0)
+ if (vlib_get_n_threads () == 0)
vec_add1 (worker_vms, vm);
else
{
- for (i = 0; i < vec_len (vlib_mains); i++)
+ for (i = 0; i < vlib_get_n_threads (); i++)
{
- worker_vm = vlib_mains[i];
+ worker_vm = vlib_get_main_by_index (i);
if (worker_vm)
vec_add1 (worker_vms, worker_vm);
}
nm->enabled = 0;
/* *INDENT-OFF* */
- pool_foreach (i, nm->interfaces,
- ({
+ pool_foreach (i, nm->interfaces)
+ {
vec_add1 (interfaces, *i);
- }));
+ }
/* *INDENT-ON* */
vec_foreach (i, interfaces)
{