From c37c19a9ec66eb6b0dd2fdbd6d09c09bd2a22108 Mon Sep 17 00:00:00 2001 From: Christian Hopps Date: Tue, 28 Nov 2023 18:02:44 -0500 Subject: [PATCH] lib: mgmtd: enable conn debugs when user enables client debug Signed-off-by: Christian Hopps --- lib/mgmt_be_client.c | 42 ++++++++++++++++++++++++++++++------------ lib/mgmt_fe_client.c | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 58 insertions(+), 24 deletions(-) diff --git a/lib/mgmt_be_client.c b/lib/mgmt_be_client.c index ef77be1f18..51eaeb92de 100644 --- a/lib/mgmt_be_client.c +++ b/lib/mgmt_be_client.c @@ -112,7 +112,11 @@ struct mgmt_be_client { #define FOREACH_BE_TXN_IN_LIST(client_ctx, txn) \ frr_each_safe (mgmt_be_txns, &(client_ctx)->txn_head, (txn)) -struct debug mgmt_dbg_be_client = {0, "Management backend client operations"}; +struct debug mgmt_dbg_be_client = { + .desc = "Management backend client operations" +}; + +struct mgmt_be_client *mgmt_be_client; static int mgmt_be_client_send_msg(struct mgmt_be_client *client_ctx, Mgmtd__BeMessage *be_msg) @@ -820,24 +824,28 @@ static int mgmt_be_client_notify_disconenct(struct msg_conn *conn) * Debug Flags */ +static void mgmt_debug_client_be_set(uint32_t flags, bool set) +{ + DEBUG_FLAGS_SET(&mgmt_dbg_be_client, flags, set); + + if (!mgmt_be_client) + return; + + mgmt_be_client->client.conn.debug = + DEBUG_MODE_CHECK(&mgmt_dbg_be_client, DEBUG_MODE_ALL); +} + DEFPY(debug_mgmt_client_be, debug_mgmt_client_be_cmd, "[no] debug mgmt client backend", NO_STR DEBUG_STR MGMTD_STR "client\n" "backend\n") { - uint32_t mode = DEBUG_NODE2MODE(vty->node); - - DEBUG_MODE_SET(&mgmt_dbg_be_client, mode, !no); + mgmt_debug_client_be_set(DEBUG_NODE2MODE(vty->node), !no); return CMD_SUCCESS; } -static void mgmt_debug_client_be_set_all(uint32_t flags, bool set) -{ - DEBUG_FLAGS_SET(&mgmt_dbg_be_client, flags, set); -} - static int mgmt_debug_be_client_config_write(struct vty *vty) { if (DEBUG_MODE_CHECK(&mgmt_dbg_be_client, DEBUG_MODE_CONF)) @@ -853,7 +861,8 @@ void mgmt_debug_be_client_show_debug(struct vty *vty) } static struct debug_callbacks mgmt_dbg_be_client_cbs = { - .debug_set_all = mgmt_debug_client_be_set_all}; + .debug_set_all = mgmt_debug_client_be_set +}; static struct cmd_node mgmt_dbg_node = { .name = "debug mgmt client backend", @@ -867,8 +876,13 @@ struct mgmt_be_client *mgmt_be_client_create(const char *client_name, uintptr_t user_data, struct event_loop *event_loop) { - struct mgmt_be_client *client = - XCALLOC(MTYPE_MGMTD_BE_CLIENT, sizeof(*client)); + struct mgmt_be_client *client; + + if (mgmt_be_client) + return NULL; + + client = XCALLOC(MTYPE_MGMTD_BE_CLIENT, sizeof(*client)); + mgmt_be_client = client; /* Only call after frr_init() */ assert(running_config); @@ -902,6 +916,8 @@ void mgmt_be_client_lib_vty_init(void) void mgmt_be_client_destroy(struct mgmt_be_client *client) { + assert(client == mgmt_be_client); + MGMTD_BE_CLIENT_DBG("Destroying MGMTD Backend Client '%s'", client->name); @@ -912,4 +928,6 @@ void mgmt_be_client_destroy(struct mgmt_be_client *client) XFREE(MTYPE_MGMTD_BE_CLIENT_NAME, client->name); XFREE(MTYPE_MGMTD_BE_CLIENT, client); + + mgmt_be_client = NULL; } diff --git a/lib/mgmt_fe_client.c b/lib/mgmt_fe_client.c index aab553049d..e99826761e 100644 --- a/lib/mgmt_fe_client.c +++ b/lib/mgmt_fe_client.c @@ -47,8 +47,11 @@ struct mgmt_fe_client { #define FOREACH_SESSION_IN_LIST(client, session) \ frr_each_safe (mgmt_sessions, &(client)->sessions, (session)) -struct debug mgmt_dbg_fe_client = {0, "Management frontend client operations"}; +struct debug mgmt_dbg_fe_client = { + .desc = "Management frontend client operations" +}; +struct mgmt_fe_client *mgmt_fe_client; static inline const char *dsid2name(Mgmtd__DatastoreId id) { @@ -543,6 +546,16 @@ static int mgmt_fe_client_notify_disconnect(struct msg_conn *conn) return _notify_connect_disconnect(client, false); } +static void mgmt_debug_client_fe_set(uint32_t mode, bool set) +{ + DEBUG_FLAGS_SET(&mgmt_dbg_fe_client, mode, set); + + if (!mgmt_fe_client) + return; + + mgmt_fe_client->client.conn.debug = + DEBUG_MODE_CHECK(&mgmt_dbg_fe_client, DEBUG_MODE_ALL); +} DEFPY(debug_mgmt_client_fe, debug_mgmt_client_fe_cmd, "[no] debug mgmt client frontend", @@ -550,18 +563,11 @@ DEFPY(debug_mgmt_client_fe, debug_mgmt_client_fe_cmd, "client\n" "frontend\n") { - uint32_t mode = DEBUG_NODE2MODE(vty->node); - - DEBUG_MODE_SET(&mgmt_dbg_fe_client, mode, !no); + mgmt_debug_client_fe_set(DEBUG_NODE2MODE(vty->node), !no); return CMD_SUCCESS; } -static void mgmt_debug_client_fe_set_all(uint32_t flags, bool set) -{ - DEBUG_FLAGS_SET(&mgmt_dbg_fe_client, flags, set); -} - static int mgmt_debug_fe_client_config_write(struct vty *vty) { if (DEBUG_MODE_CHECK(&mgmt_dbg_fe_client, DEBUG_MODE_CONF)) @@ -577,7 +583,8 @@ void mgmt_debug_fe_client_show_debug(struct vty *vty) } static struct debug_callbacks mgmt_dbg_fe_client_cbs = { - .debug_set_all = mgmt_debug_client_fe_set_all}; + .debug_set_all = mgmt_debug_client_fe_set +}; static struct cmd_node mgmt_dbg_node = { .name = "debug mgmt client frontend", @@ -594,8 +601,13 @@ struct mgmt_fe_client *mgmt_fe_client_create(const char *client_name, uintptr_t user_data, struct event_loop *event_loop) { - struct mgmt_fe_client *client = - XCALLOC(MTYPE_MGMTD_FE_CLIENT, sizeof(*client)); + struct mgmt_fe_client *client; + + if (mgmt_fe_client) + return NULL; + + client = XCALLOC(MTYPE_MGMTD_FE_CLIENT, sizeof(*client)); + mgmt_fe_client = client; client->name = XSTRDUP(MTYPE_MGMTD_FE_CLIENT_NAME, client_name); client->user_data = user_data; @@ -692,6 +704,8 @@ void mgmt_fe_client_destroy(struct mgmt_fe_client *client) { struct mgmt_fe_client_session *session; + assert(client == mgmt_fe_client); + MGMTD_FE_CLIENT_DBG("Destroying MGMTD Frontend Client '%s'", client->name); @@ -702,4 +716,6 @@ void mgmt_fe_client_destroy(struct mgmt_fe_client *client) XFREE(MTYPE_MGMTD_FE_CLIENT_NAME, client->name); XFREE(MTYPE_MGMTD_FE_CLIENT, client); + + mgmt_fe_client = NULL; } -- 2.39.5