summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/if.h2
-rw-r--r--lib/mgmt_be_client.c42
-rw-r--r--lib/mgmt_fe_client.c40
3 files changed, 60 insertions, 24 deletions
diff --git a/lib/if.h b/lib/if.h
index 560635f7c4..fd5f6f7502 100644
--- a/lib/if.h
+++ b/lib/if.h
@@ -434,6 +434,8 @@ struct connected {
#define ZEBRA_IFA_SECONDARY (1 << 0)
#define ZEBRA_IFA_PEER (1 << 1)
#define ZEBRA_IFA_UNNUMBERED (1 << 2)
+#define ZEBRA_IFA_NOPREFIXROUTE (1 << 3)
+
/* N.B. the ZEBRA_IFA_PEER flag should be set if and only if
a peer address has been configured. If this flag is set,
the destination field must contain the peer address.
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;
}