diff options
author | Dave Barach <dave@barachs.net> | 2019-05-28 16:31:05 -0400 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2019-05-29 07:51:19 +0000 |
commit | 11965c7b47670da7d02eb2c543be52008c66848e (patch) | |
tree | a744cc380bf8d91f8aa235b7bbe31f5e5110e600 | |
parent | 4d376f67a6e259e747dbbd4551578657663840f7 (diff) |
Break out the broom for some cleanup work
Maintain the MAINTAINERS file. Removed src/plugins/*.am listings. Added
a couple of plugins.
Add vlib_process_create (vlib_main_t *vm, char *name,
vlib_node_function_t *f, u32 log2_n_stack_bytes);
/** @brief Create a vlib process
* @param vm &vlib_global_main
* @param f the process node function
* @param log2_n_stack_bytes size of the process stack, defaults to 16K
* @return newly-create node index
* @warning call only on the main thread. Barrier sync required.
*/
This function makes it easy to spin up periodic processes when features
are enabled for the first time. That coding pattern is highly recommended.
Update the emacs-lisp plugin generator to use vlib_process_create,
instead of generating static periodic process nodes.
Change-Id: Icda33e93b9034779d3a3e228cd1110af14b058a5
Signed-off-by: Dave Barach <dave@barachs.net>
-rw-r--r-- | MAINTAINERS | 31 | ||||
-rw-r--r-- | extras/emacs/plugin-h-skel.el | 6 | ||||
-rw-r--r-- | extras/emacs/plugin-main-skel.el | 8 | ||||
-rw-r--r-- | extras/emacs/plugin-periodic-skel.el | 30 | ||||
-rw-r--r-- | src/vlib/node.c | 28 | ||||
-rw-r--r-- | src/vlib/node_funcs.h | 10 |
6 files changed, 78 insertions, 35 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index b58d5370132..d9342979080 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -14,15 +14,13 @@ Descriptions of section entries: Build System M: Damjan Marion <damarion@cisco.com> F: Makefile -F: src/*.ac -F: src/*.am -F: src/*.mk -F: src/m4/ +F: src/CMakeLists.txt +F: src/cmake/ Build System Internal M: Dave Barach <dave@barachs.net> F: build-root/Makefile -F: build-data/* +F: build-data/ Doxygen M: Chris Luke <chrisy@flirble.org> @@ -42,12 +40,12 @@ Infrastructure Library M: Dave Barach <dave@barachs.net> F: src/vppinfra/ -VLIB Library +Vector Library M: Dave Barach <dave@barachs.net> M: Damjan Marion <damarion@cisco.com> F: src/vlib/ -VLIB API Libraries +Binary API Libraries M: Dave Barach <dave@barachs.net> F: src/vlibapi/ F: src/vlibmemory/ @@ -126,7 +124,6 @@ M: John Lo <loj@cisco.com> F: src/vnet/vxlan/ VNET VXLAN-GPE -M: Keith Burns <alagalah@gmail.com> M: Hongjun Ni <hongjun.ni@intel.com> F: src/vnet/vxlan-gpe/ @@ -144,50 +141,48 @@ F: src/plugins/tlsmbedtls Plugin - ACL M: Andrew Yourtchenko <ayourtch@gmail.com> F: src/plugins/acl/ -F: src/plugins/acl.am Plugin - flowprobe M: Ole Troan <otroan@employees.org> F: src/plugins/flowprobe/ -F: src/plugins/flowprobe.am Plugin - GTPU M: Hongjun Ni <hongjun.ni@intel.com> F: src/plugins/gtpu/ -F: src/plugins/gtpu.am Plugin - PPPoE M: Hongjun Ni <hongjun.ni@intel.com> F: src/plugins/pppoe/ -F: src/plugins/pppoe.am Plugin - IPv6 Segment Routing Dynamic Proxy M: Francois Clad <fclad@cisco.com> F: src/plugins/srv6-ad/ -F: src/plugins/srv6_ad.am Plugin - IPv6 Segment Routing Masquerading Proxy M: Francois Clad <fclad@cisco.com> F: src/plugins/srv6-am/ -F: src/plugins/srv6_am.am Plugin - IPv6 Segment Routing Static Proxy M: Francois Clad <fclad@cisco.com> F: src/plugins/srv6-as/ -F: src/plugins/srv6_as.am Plugin - Load Balancer M: Pierre Pfister <ppfister@cisco.com> M: Hongjun Ni <hongjun.ni@intel.com> F: src/plugins/lb/ -F: src/plugins/lb.am Plugin - NSH M: Hongjun Ni <hongjun.ni@intel.com> -M: Keith Burns <alagalah@gmail.com> M: Vengada <venggovi@cisco.com> F: src/plugins/nsh/ -F: src/plugins/nsh.am + +Plugin - Time-based MAC filter +M: Dave Barach <dave@barachs.net> +F: src/plugins/mactime/ + +Plugin - Network Delay Simulator +M: Dave Barach <dave@barachs.net> +F: src/plugins/nsim/ Test Infrastructure M: Klement Sekera <ksekera@cisco.com> diff --git a/extras/emacs/plugin-h-skel.el b/extras/emacs/plugin-h-skel.el index b3fa6460bd2..21655109588 100644 --- a/extras/emacs/plugin-h-skel.el +++ b/extras/emacs/plugin-h-skel.el @@ -24,7 +24,7 @@ nil '(setq capital-oh-en "ON") " /* - * " plugin-name ".h - skeleton vpp engine plug-in header file + * " plugin-name ".h - skeleton vpp engine plug-in header file * * Copyright (c) <current-year> <your-organization> * Licensed under the Apache License, Version 2.0 (the \"License\"); @@ -55,6 +55,8 @@ typedef struct { /* on/off switch for the periodic function */ u8 periodic_timer_enabled; + /* Node index, non-zero if the periodic process has been created */ + u32 periodic_node_index; /* convenience */ vlib_main_t * vlib_main; @@ -72,6 +74,8 @@ extern vlib_node_registration_t " plugin-name "_periodic_node; #define " PLUGIN-NAME "_EVENT2 2 #define " PLUGIN-NAME "_EVENT_PERIODIC_ENABLE_DISABLE 3 +void " plugin-name "_create_periodic_process (" plugin-name "_main_t *); + #endif /* __included_" plugin-name "_h__ */ /* diff --git a/extras/emacs/plugin-main-skel.el b/extras/emacs/plugin-main-skel.el index 31b258eb11f..873f72da39d 100644 --- a/extras/emacs/plugin-main-skel.el +++ b/extras/emacs/plugin-main-skel.el @@ -100,14 +100,16 @@ int " plugin-name "_enable_disable (" plugin-name "_main_t * " main-p ", u32 sw_ if (sw->type != VNET_SW_INTERFACE_TYPE_HARDWARE) return VNET_API_ERROR_INVALID_SW_IF_INDEX; + " plugin-name "_create_periodic_process (" main-p "); + vnet_feature_enable_disable (\"device-input\", \"" plugin-name "\", sw_if_index, enable_disable, 0, 0); /* Send an event to enable/disable the periodic scanner process */ - vlib_process_signal_event (" main-p "->vlib_main, " plugin-name"_periodic_node.index, - " PLUGIN-NAME"_EVENT_PERIODIC_ENABLE_DISABLE, + vlib_process_signal_event (" main-p "->vlib_main, + " main-p"->periodic_node_index, + " PLUGIN-NAME"_EVENT_PERIODIC_ENABLE_DISABLE, (uword)enable_disable); - return rv; } diff --git a/extras/emacs/plugin-periodic-skel.el b/extras/emacs/plugin-periodic-skel.el index ff1d94e02b4..6f5675eb799 100644 --- a/extras/emacs/plugin-periodic-skel.el +++ b/extras/emacs/plugin-periodic-skel.el @@ -22,8 +22,9 @@ nil (setq plugin-name (read-string "Plugin name: "))) '(setq PLUGIN-NAME (upcase plugin-name)) '(setq capital-oh-en "ON") +'(setq main-p (concat (substring plugin-name 0 1) "mp")) "/* - * " plugin-name "_periodic.c - skeleton plug-in periodic function + * " plugin-name "_periodic.c - skeleton plug-in periodic function * * Copyright (c) <current-year> <your-organization> * Licensed under the Apache License, Version 2.0 (the \"License\"); @@ -43,22 +44,22 @@ nil #include <vppinfra/error.h> #include <" plugin-name "/" plugin-name ".h> -static void +static void handle_event1 (" plugin-name "_main_t *pm, f64 now, uword event_data) { clib_warning (\"received " PLUGIN-NAME "_EVENT1\"); } - -static void + +static void handle_event2 (" plugin-name "_main_t *pm, f64 now, uword event_data) { clib_warning (\"received " PLUGIN-NAME "_EVENT2\"); } - + static void handle_periodic_enable_disable (" plugin-name"_main_t *pm, f64 now, uword event_data) { - clib_warning (\"Periodic timeouts now %s\", + clib_warning (\"Periodic timeouts now %s\", event_data ? \"enabled\" : \"disabled\"); pm->periodic_timer_enabled = event_data; } @@ -120,14 +121,17 @@ static uword return 0; /* or not */ } -/* *INDENT-OFF* */ -VLIB_REGISTER_NODE ("plugin-name"_periodic_node) = +void " plugin-name "_create_periodic_process (" plugin-name "_main_t *" main-p") { - .function = " plugin-name "_periodic_process, - .type = VLIB_NODE_TYPE_PROCESS, - .name = \"" plugin-name "-periodic-process\", -}; -/* *INDENT-ON* */ + /* Already created the process node? */ + if (" main-p "->periodic_node_index > 0) + return; + + /* No, create it now and make a note of the node index */ + " main-p "->periodic_node_index = vlib_process_create (" main-p "->vlib_main, + \"" plugin-name "-periodic-process\", + " plugin-name "_periodic_process, 16 /* log2_n_stack_bytes */); +} /* * fd.io coding-style-patch-verification: " capital-oh-en " diff --git a/src/vlib/node.c b/src/vlib/node.c index 49c7a40b572..44a3a3ee25d 100644 --- a/src/vlib/node.c +++ b/src/vlib/node.c @@ -757,6 +757,34 @@ done: return error; } +u32 +vlib_process_create (vlib_main_t * vm, char *name, + vlib_node_function_t * f, u32 log2_n_stack_bytes) +{ + vlib_node_registration_t r; + vlib_node_t *n; + + memset (&r, 0, sizeof (r)); + + r.name = (char *) format (0, "%s", name, 0); + r.function = f; + r.process_log2_n_stack_bytes = log2_n_stack_bytes; + r.type = VLIB_NODE_TYPE_PROCESS; + + vlib_worker_thread_barrier_sync (vm); + + vlib_register_node (vm, &r); + vec_free (r.name); + + vlib_worker_thread_node_runtime_update (); + vlib_worker_thread_barrier_release (vm); + + n = vlib_get_node (vm, r.index); + vlib_start_process (vm, n->runtime_index); + + return (r.index); +} + /* * fd.io coding-style-patch-verification: ON * diff --git a/src/vlib/node_funcs.h b/src/vlib/node_funcs.h index bf11a0eb6d4..c9ff93d6124 100644 --- a/src/vlib/node_funcs.h +++ b/src/vlib/node_funcs.h @@ -1186,6 +1186,16 @@ vlib_node_increment_counter (vlib_main_t * vm, u32 node_index, em->counters[node_counter_base_index + counter_index] += increment; } +/** @brief Create a vlib process + * @param vm &vlib_global_main + * @param f the process node function + * @param log2_n_stack_bytes size of the process stack, defaults to 16K + * @return newly-create node index + * @warning call only on the main thread. Barrier sync required + */ +u32 vlib_process_create (vlib_main_t * vm, char *name, + vlib_node_function_t * f, u32 log2_n_stack_bytes); + #endif /* included_vlib_node_funcs_h */ /* |