Fix DHCP client so it works for worker threads 64/8464/2
authorJohn Lo <loj@cisco.com>
Wed, 20 Sep 2017 01:45:10 +0000 (21:45 -0400)
committerDave Barach <openvpp@barachs.net>
Wed, 20 Sep 2017 11:50:49 +0000 (11:50 +0000)
Fix dhcp_client_for_us() function to utilize rpc_call_main_thread
to call vlib_process_signal_event() to ensure proper handling
irrespective of it being called in main thread or worker thread.

Added ASSERT to vlib_process_sinal.. path to make sure it is called
in main thread.

Change-Id: I4109cc049d8e4225d896ce492ce201011dc9c911
Signed-off-by: John Lo <loj@cisco.com>
src/vlib/node_funcs.h
src/vnet/dhcp/client.c

index 0059b9b..3ae4e54 100644 (file)
@@ -851,6 +851,9 @@ vlib_process_signal_event_data (vlib_main_t * vm,
   vlib_process_t *p = vec_elt (nm->processes, n->runtime_index);
   uword *h, t;
 
+  /* Must be in main thread */
+  ASSERT (vlib_get_thread_index () == 0);
+
   h = hash_get (p->event_type_index_by_type_opaque, type_opaque);
   if (!h)
     {
index dd5e99f..5986438 100644 (file)
@@ -120,6 +120,17 @@ set_l2_rewrite (dhcp_client_main_t * dcm, dhcp_client_t * c)
                      0 /* broadcast */);
 }
 
+void vl_api_rpc_call_main_thread (void *fp, u8 * data, u32 data_length);
+
+static void
+dhcp_client_proc_callback (uword * client_index)
+{
+  vlib_main_t *vm = vlib_get_main ();
+  ASSERT (vlib_get_thread_index () == 0);
+  vlib_process_signal_event (vm, dhcp_client_process_node.index, 
+                            EVENT_DHCP_CLIENT_WAKEUP, *client_index);
+}
+
 /* 
  * dhcp_client_for_us - server-to-client callback.
  * Called from proxy_node.c:dhcp_proxy_to_client_input().
@@ -251,8 +262,9 @@ int dhcp_client_for_us (u32 bi, vlib_buffer_t * b,
       c->retry_count = 0;
       c->next_transmit = 0;     /* send right now... */
       /* Poke the client process, which will send the request */
-      vlib_process_signal_event (vm, dhcp_client_process_node.index, 
-                                 EVENT_DHCP_CLIENT_WAKEUP, c - dcm->clients);
+      uword client_id =  c - dcm->clients;
+      vl_api_rpc_call_main_thread (dhcp_client_proc_callback,
+                              (u8 *) &client_id, sizeof (uword));
       break;
 
     case DHCP_BOUND: