NAT: fixed get_worker_out2in bug (VPP-1116) 82/9982/1
authorMatus Fabian <matfabia@cisco.com>
Fri, 5 Jan 2018 13:03:35 +0000 (05:03 -0800)
committerMatus Fabian <matfabia@cisco.com>
Mon, 8 Jan 2018 07:08:09 +0000 (07:08 +0000)
Change-Id: I5e080d69f28661cc0b1846885d5001526b54fbd9
Signed-off-by: Matus Fabian <matfabia@cisco.com>
src/plugins/nat/nat.c
src/plugins/nat/nat64.c

index 721ad16..9993de0 100644 (file)
@@ -1586,7 +1586,7 @@ int snat_set_workers (uword * bitmap)
   clib_bitmap_foreach (i, bitmap,
     ({
       vec_add1(sm->workers, i);
-      sm->per_thread_data[i].snat_thread_index = j;
+      sm->per_thread_data[sm->first_worker_index + i].snat_thread_index = j;
       j++;
     }));
 
@@ -2758,6 +2758,7 @@ snat_get_worker_out2in_cb (ip4_header_t * ip0, u32 rx_fib_index0)
   snat_session_t *s;
   int i;
   u32 proto;
+  u32 next_worker_index = 0;
 
   /* first try static mappings without port */
   if (PREDICT_FALSE (pool_elts (sm->static_mappings)))
@@ -2873,7 +2874,10 @@ snat_get_worker_out2in_cb (ip4_header_t * ip0, u32 rx_fib_index0)
     }
 
   /* worker by outside port */
-  return (u32) ((clib_net_to_host_u16 (port) - 1024) / sm->port_per_thread);
+  next_worker_index = sm->first_worker_index;
+  next_worker_index +=
+    sm->workers[(clib_net_to_host_u16 (port) - 1024) / sm->port_per_thread];
+  return next_worker_index;
 }
 
 static clib_error_t *
index e60d9ec..571e071 100644 (file)
@@ -202,7 +202,7 @@ nat64_get_worker_out2in (ip4_header_t * ip)
   /* worker by outside port  (TCP/UDP) */
   port = clib_net_to_host_u16 (port);
   if (port > 1024)
-    return (u32) ((port - 1024) / sm->port_per_thread);
+    return nm->sm->first_worker_index + ((port - 1024) / sm->port_per_thread);
 
   return vlib_get_thread_index ();
 }
@@ -497,13 +497,17 @@ nat64_alloc_out_addr_and_port (u32 fib_index, snat_protocol_t proto,
   snat_main_t *sm = nm->sm;
   snat_session_key_t k;
   u32 ai;
+  u32 worker_index = 0;
   int rv;
 
   k.protocol = proto;
 
+  if (sm->num_workers > 1)
+    worker_index = thread_index - sm->first_worker_index;
+
   rv =
     sm->alloc_addr_and_port (nm->addr_pool, fib_index, thread_index, &k, &ai,
-                            sm->port_per_thread, thread_index);
+                            sm->port_per_thread, worker_index);
 
   if (!rv)
     {