summaryrefslogtreecommitdiff
path: root/lib/mgmt_fe_client.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mgmt_fe_client.c')
-rw-r--r--lib/mgmt_fe_client.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/lib/mgmt_fe_client.c b/lib/mgmt_fe_client.c
index 56b0cb52e1..83f60ea58b 100644
--- a/lib/mgmt_fe_client.c
+++ b/lib/mgmt_fe_client.c
@@ -361,6 +361,7 @@ static int mgmt_fe_client_handle_msg(struct mgmt_fe_client_ctx *client_ctx,
client_ctx, fe_msg->session_req->session_id);
}
+ /* The session state may be deleted by the callback */
if (session && session->client_ctx &&
session->client_ctx->client_params.client_session_notify)
(*session->client_ctx->client_params
@@ -549,6 +550,7 @@ static int _notify_connect_disconnect(struct msg_client *client, bool connected)
{
struct mgmt_fe_client_ctx *client_ctx =
container_of(client, struct mgmt_fe_client_ctx, client);
+ struct mgmt_fe_client_session *session;
int ret;
/* Send REGISTER_REQ message */
@@ -557,6 +559,32 @@ static int _notify_connect_disconnect(struct msg_client *client, bool connected)
return ret;
}
+ /* Walk list of sessions for this FE client deleting them */
+ if (!connected && mgmt_sessions_count(&client_ctx->client_sessions)) {
+ MGMTD_FE_CLIENT_DBG("Cleaning up existing sessions");
+
+ FOREACH_SESSION_IN_LIST (client_ctx, session) {
+ assert(session->client_ctx);
+
+ /* unlink from list first this avoids double free */
+ mgmt_sessions_del(&client_ctx->client_sessions,
+ session);
+
+ /* notify FE client the session is being deleted */
+ if (session->client_ctx->client_params
+ .client_session_notify) {
+ (*session->client_ctx->client_params
+ .client_session_notify)(
+ (uintptr_t)client_ctx,
+ client_ctx->client_params.user_data,
+ session->client_id, false, true,
+ session->session_id, session->user_ctx);
+ }
+
+ XFREE(MTYPE_MGMTD_FE_SESSION, session);
+ }
+ }
+
/* Notify FE client through registered callback (if any). */
if (client_ctx->client_params.client_connect_notify)
(void)(*client_ctx->client_params.client_connect_notify)(
@@ -653,6 +681,14 @@ void mgmt_fe_client_lib_vty_init(void)
install_element(CONFIG_NODE, &debug_mgmt_client_fe_cmd);
}
+uint mgmt_fe_client_session_count(uintptr_t lib_hndl)
+{
+ struct mgmt_fe_client_ctx *client_ctx =
+ (struct mgmt_fe_client_ctx *)lib_hndl;
+
+ return mgmt_sessions_count(&client_ctx->client_sessions);
+}
+
/*
* Create a new Session for a Frontend Client connection.
*/
@@ -705,8 +741,8 @@ enum mgmt_result mgmt_fe_destroy_client_session(uintptr_t lib_hndl,
if (session->session_id &&
mgmt_fe_send_session_req(client_ctx, session, false) != 0)
MGMTD_FE_CLIENT_ERR(
- "Failed to send session destroy request for the session-id %lu",
- (unsigned long)session->session_id);
+ "Failed to send session destroy request for the session-id %" PRIu64,
+ session->session_id);
mgmt_sessions_del(&client_ctx->client_sessions, session);
XFREE(MTYPE_MGMTD_FE_SESSION, session);