npt66: add show command and rx/tx counters
[vpp.git] / src / plugins / nat / nat64 / nat64.c
index 240f3ef..79e9da0 100644 (file)
@@ -135,6 +135,20 @@ nat64_get_worker_in2out (ip6_address_t * addr)
   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)
 {
@@ -202,7 +216,7 @@ 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 ();
 }
@@ -283,10 +297,10 @@ nat64_init (vlib_main_t * vm)
        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);
@@ -423,14 +437,14 @@ nat64_add_del_pool_addr (u32 thread_index,
 
   /* 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;
@@ -547,14 +561,14 @@ nat64_interface_add_del (u32 sw_if_index, u8 is_inside, u8 is_add)
 
   /* 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)
@@ -642,11 +656,11 @@ nat64_interfaces_walk (nat64_interface_walk_fn_t fn, void *ctx)
   nat64_interface_t *i = 0;
 
   /* *INDENT-OFF* */
-  pool_foreach (i, nm->interfaces,
-  ({
+  pool_foreach (i, nm->interfaces)
+   {
     if (fn (i, ctx))
       break;
-  }));
+  }
   /* *INDENT-ON* */
 }
 
@@ -823,8 +837,8 @@ nat64_static_bib_worker_fn (vlib_main_t * vm, vlib_node_runtime_t * rt,
   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;
 
@@ -858,7 +872,7 @@ nat64_static_bib_worker_fn (vlib_main_t * vm, vlib_node_runtime_t * rt,
       }
 
       static_bib->done = 1;
-  }));
+  }
   /* *INDENT-ON* */
 
   return 0;
@@ -916,7 +930,7 @@ nat64_add_del_static_bib_entry (ip6_address_t * in_addr,
       /* 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;
        }
 
@@ -978,11 +992,11 @@ nat64_add_del_static_bib_entry (ip6_address_t * in_addr,
   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* */
@@ -998,7 +1012,7 @@ nat64_add_del_static_bib_entry (ip6_address_t * in_addr,
       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);
@@ -1452,13 +1466,13 @@ nat64_expire_walk_fn (vlib_main_t * vm, vlib_node_runtime_t * rt,
   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);
        }
@@ -1567,10 +1581,10 @@ nat64_plugin_disable ()
   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)
   {