Start the cdp period process on demand 78/19878/2
authorDave Barach <dave@barachs.net>
Wed, 29 May 2019 14:19:56 +0000 (10:19 -0400)
committerFlorin Coras <florin.coras@gmail.com>
Wed, 29 May 2019 16:27:36 +0000 (16:27 +0000)
Change-Id: I219b270f905dad5939ab38e933712845c314286d
Signed-off-by: Dave Barach <dave@barachs.net>
src/plugins/cdp/cdp.c
src/plugins/cdp/cdp.h
src/plugins/cdp/cdp_input.c
src/plugins/cdp/cdp_node.c

index 45863a0..2c947a7 100644 (file)
@@ -63,11 +63,17 @@ cdp_enable_disable (cdp_main_t * cm, int enable_disable)
   int rv = 0;
 
   if (enable_disable)
-    vlib_process_signal_event (cm->vlib_main, cdp_process_node.index,
-                              CDP_EVENT_ENABLE, 0);
+    {
+      vnet_cdp_create_periodic_process (cm);
+      vlib_process_signal_event (cm->vlib_main, cm->cdp_process_node_index,
+                                CDP_EVENT_ENABLE, 0);
+    }
   else
-    vlib_process_signal_event (cm->vlib_main, cdp_process_node.index,
-                              CDP_EVENT_DISABLE, 0);
+    {
+      vnet_cdp_create_periodic_process (cm);
+      vlib_process_signal_event (cm->vlib_main, cm->cdp_process_node_index,
+                                CDP_EVENT_DISABLE, 0);
+    }
   cm->enabled = enable_disable;
 
   return rv;
index ab2ab95..d3abb07 100644 (file)
@@ -143,6 +143,7 @@ void cdp_periodic (vlib_main_t * vm);
 void cdp_keepalive (cdp_main_t * cm, cdp_neighbor_t * n);
 u16 cdp_checksum (void *p, int count);
 u8 *cdp_input_format_trace (u8 * s, va_list * args);
+void vnet_cdp_create_periodic_process (cdp_main_t * cmp);
 
 #endif /* __included_cdp_h__ */
 
index dbe179a..a6da0f6 100644 (file)
@@ -409,9 +409,6 @@ static clib_error_t *
 cdp_input_init (vlib_main_t * vm)
 {
   cdp_main_t *cm = &cdp_main;
-  void vnet_cdp_node_reference (void);
-
-  vnet_cdp_node_reference ();
 
   cm->vlib_main = vm;
   cm->vnet_main = vnet_get_main ();
index 740bb41..f9ee251 100644 (file)
@@ -129,9 +129,6 @@ cdp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
   f64 poll_time_remaining;
   uword event_type, *event_data = 0;
 
-  /* So we can send events to the cdp process */
-  cm->cdp_process_node_index = cdp_process_node.index;
-
   /* Start w/ cdp disabled */
   poll_time_remaining = 86400.0;
 
@@ -200,20 +197,17 @@ cdp_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
   return 0;
 }
 
-/*
- * cdp periodic node declaration
- */
-/* *INDENT-OFF* */
-VLIB_REGISTER_NODE (cdp_process_node) = {
-  .function = cdp_process,
-  .type = VLIB_NODE_TYPE_PROCESS,
-  .name = "cdp-process",
-};
-/* *INDENT-ON* */
-
 void
-vnet_cdp_node_reference (void)
+vnet_cdp_create_periodic_process (cdp_main_t * cmp)
 {
+  /* Already created the process node? */
+  if (cmp->cdp_process_node_index > 0)
+    return;
+
+  /* No, create it now and make a note of the node index */
+  cmp->cdp_process_node_index = vlib_process_create
+    (cmp->vlib_main, "cdp-process",
+     cdp_process, 16 /* log2_n_stack_bytes */ );
 }
 
 /*