From f756a869aeefec55c31d54e1dff4b9c116532512 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 24 May 2019 20:09:01 -0400 Subject: [PATCH 1/2] lib: Make the debug callbacks a list of callbacks Allow multiple callers to initialize themselves to receive callbacks for debug on/off operations. Signed-off-by: Donald Sharp --- lib/debug.c | 24 +++++++++++++++++++----- lib/debug.h | 8 +++++++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/debug.c b/lib/debug.c index 72fd4648ee..a39623b039 100644 --- a/lib/debug.c +++ b/lib/debug.c @@ -18,29 +18,43 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include +#include "typesafe.h" #include "debug.h" #include "command.h" -static const struct debug_callbacks *callbacks; +static struct debug_cb_list_head cb_head; + +DECLARE_LIST(debug_cb_list, struct debug_callbacks, item) /* All code in this section should be reentrant and MT-safe */ DEFUN_NOSH(debug_all, debug_all_cmd, "[no] debug all", NO_STR DEBUG_STR "Toggle all debugging output\n") { + struct debug_callbacks *cb; + bool set = !strmatch(argv[0]->text, "no"); uint32_t mode = DEBUG_NODE2MODE(vty->node); - if (callbacks->debug_set_all) - callbacks->debug_set_all(mode, set); + frr_each (debug_cb_list, &cb_head, cb) + cb->debug_set_all(mode, set); + return CMD_SUCCESS; } /* ------------------------------------------------------------------------- */ -void debug_init(const struct debug_callbacks *cb) +void debug_init(struct debug_callbacks *cb) { - callbacks = cb; + static bool inited = false; + + if (!inited) { + inited = true; + debug_cb_list_init(&cb_head); + } + + debug_cb_list_add_head(&cb_head, cb); + install_element(ENABLE_NODE, &debug_all_cmd); install_element(CONFIG_NODE, &debug_all_cmd); } diff --git a/lib/debug.h b/lib/debug.h index ace060d057..0ee5963ec6 100644 --- a/lib/debug.h +++ b/lib/debug.h @@ -84,6 +84,7 @@ struct debug { const char *desc; }; +PREDECL_LIST(debug_cb_list) /* * Callback set for debugging code. * @@ -92,6 +93,11 @@ struct debug { * mode set. */ struct debug_callbacks { + /* + * Linked list of Callbacks to call + */ + struct debug_cb_list_item item; + /* * flags * flags to set on debug flag fields @@ -233,7 +239,7 @@ struct debug_callbacks { * * MT-Safe */ -void debug_init(const struct debug_callbacks *cb); +void debug_init(struct debug_callbacks *cb); #ifdef __cplusplus } From ae0994f6eb301491aafb8fef8f1d8c6a9033fae9 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 24 May 2019 20:15:31 -0400 Subject: [PATCH 2/2] lib: Separate out the debug_init api Separate out the debug_init api to have 2 functions: 1) Function to register a callback 2) Function to initiate the cli. Signed-off-by: Donald Sharp --- lib/debug.c | 3 +++ lib/debug.h | 6 ++++++ lib/libfrr.c | 4 ++++ lib/northbound_cli.c | 2 +- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/debug.c b/lib/debug.c index a39623b039..3248ceb13b 100644 --- a/lib/debug.c +++ b/lib/debug.c @@ -54,7 +54,10 @@ void debug_init(struct debug_callbacks *cb) } debug_cb_list_add_head(&cb_head, cb); +} +void debug_init_cli(void) +{ install_element(ENABLE_NODE, &debug_all_cmd); install_element(CONFIG_NODE, &debug_all_cmd); } diff --git a/lib/debug.h b/lib/debug.h index 0ee5963ec6..f25cd42691 100644 --- a/lib/debug.h +++ b/lib/debug.h @@ -241,6 +241,12 @@ struct debug_callbacks { */ void debug_init(struct debug_callbacks *cb); +/* + * Turn on the cli to turn on/off debugs. + * Should only be called by libfrr + */ +void debug_init_cli(void); + #ifdef __cplusplus } #endif diff --git a/lib/libfrr.c b/lib/libfrr.c index 5970e70a6b..8fa1509b7d 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -39,6 +39,7 @@ #include "db.h" #include "northbound_cli.h" #include "northbound_db.h" +#include "debug.h" DEFINE_HOOK(frr_late_init, (struct thread_master * tm), (tm)) DEFINE_KOOH(frr_early_fini, (), ()) @@ -654,6 +655,9 @@ struct thread_master *frr_init(void) lib_error_init(); yang_init(); + + debug_init_cli(); + nb_init(master, di->yang_modules, di->n_yang_modules); if (nb_db_init() != NB_OK) flog_warn(EC_LIB_NB_DATABASE, diff --git a/lib/northbound_cli.c b/lib/northbound_cli.c index ae1b0578a0..7b7b526af0 100644 --- a/lib/northbound_cli.c +++ b/lib/northbound_cli.c @@ -1722,8 +1722,8 @@ void nb_cli_init(struct thread_master *tm) /* Initialize the shared candidate configuration. */ vty_shared_candidate_config = nb_config_new(NULL); - /* Install debug commands */ debug_init(&nb_dbg_cbs); + install_node(&nb_debug_node, nb_debug_config_write); install_element(ENABLE_NODE, &debug_nb_cmd); install_element(CONFIG_NODE, &debug_nb_cmd);