session: fix local session disconnects

Select the right segment manager for local sessions established via
global table.

Change-Id: I88ad4bf70d0cae160a0c744950098a954dfbc911
Signed-off-by: Florin Coras <fcoras@cisco.com>
This commit is contained in:
Florin Coras
2018-03-23 22:56:43 -07:00
committed by Florin Coras
parent e1ace19b65
commit f6647e0f36
3 changed files with 60 additions and 24 deletions

View File

@ -1079,36 +1079,52 @@ application_local_session_connect_notify (local_session_t * ls)
} }
int int
application_local_session_disconnect (u32 app_index, local_session_t * ls) application_local_session_cleanup (application_t * client,
application_t * server,
local_session_t * ls)
{ {
svm_fifo_segment_private_t *seg; svm_fifo_segment_private_t *seg;
application_t *client, *server;
segment_manager_t *sm; segment_manager_t *sm;
uword client_key; uword client_key;
u8 has_transport;
has_transport = session_has_transport ((stream_session_t *) ls);
client_key = application_client_local_connect_key (ls);
if (!has_transport)
sm = application_get_local_segment_manager_w_session (server, ls);
else
sm = application_get_listen_segment_manager (server,
(stream_session_t *) ls);
seg = segment_manager_get_segment (sm, ls->svm_segment_index);
if (client)
hash_unset (client->local_connects, client_key);
if (!has_transport)
{
server->cb_fns.del_segment_callback (server->api_client_index,
&seg->ssvm);
if (client)
client->cb_fns.del_segment_callback (client->api_client_index,
&seg->ssvm);
segment_manager_del_segment (sm, seg);
}
application_free_local_session (server, ls);
return 0;
}
int
application_local_session_disconnect (u32 app_index, local_session_t * ls)
{
application_t *client, *server;
client = application_get_if_valid (ls->client_index); client = application_get_if_valid (ls->client_index);
server = application_get (ls->app_index); server = application_get (ls->app_index);
if (ls->session_state == SESSION_STATE_CLOSED) if (ls->session_state == SESSION_STATE_CLOSED)
{ return application_local_session_cleanup (client, server, ls);
cleanup:
client_key = application_client_local_connect_key (ls);
sm = application_get_local_segment_manager_w_session (server, ls);
seg = segment_manager_get_segment (sm, ls->svm_segment_index);
if (client)
{
hash_unset (client->local_connects, client_key);
client->cb_fns.del_segment_callback (client->api_client_index,
&seg->ssvm);
}
server->cb_fns.del_segment_callback (server->api_client_index,
&seg->ssvm);
segment_manager_del_segment (sm, seg);
application_free_local_session (server, ls);
return 0;
}
if (app_index == ls->client_index) if (app_index == ls->client_index)
{ {
@ -1118,7 +1134,7 @@ application_local_session_disconnect (u32 app_index, local_session_t * ls)
{ {
if (!client) if (!client)
{ {
goto cleanup; return application_local_session_cleanup (client, server, ls);
} }
else if (ls->session_state < SESSION_STATE_READY) else if (ls->session_state < SESSION_STATE_READY)
{ {
@ -1127,11 +1143,11 @@ application_local_session_disconnect (u32 app_index, local_session_t * ls)
(stream_session_t *) ls, (stream_session_t *) ls,
1 /* is_fail */ ); 1 /* is_fail */ );
ls->session_state = SESSION_STATE_CLOSED; ls->session_state = SESSION_STATE_CLOSED;
goto cleanup; return application_local_session_cleanup (client, server, ls);
} }
else else
{ {
send_local_session_disconnect_callback (ls->client_index, ls); send_local_session_disconnect_callback (client->index, ls);
} }
} }
@ -1140,6 +1156,16 @@ application_local_session_disconnect (u32 app_index, local_session_t * ls)
return 0; return 0;
} }
int
application_local_session_disconnect_w_index (u32 app_index, u32 ls_index)
{
application_t *app;
local_session_t *ls;
app = application_get (app_index);
ls = application_get_local_session (app, ls_index);
return application_local_session_disconnect (app_index, ls);
}
void void
application_local_sessions_del (application_t * app) application_local_sessions_del (application_t * app)
{ {

View File

@ -204,6 +204,8 @@ int application_local_session_connect (u32 table_index,
int application_local_session_connect_notify (local_session_t * ls); int application_local_session_connect_notify (local_session_t * ls);
int application_local_session_disconnect (u32 app_index, int application_local_session_disconnect (u32 app_index,
local_session_t * ls); local_session_t * ls);
int application_local_session_disconnect_w_index (u32 app_index,
u32 ls_index);
void application_local_sessions_del (application_t * app); void application_local_sessions_del (application_t * app);
always_inline u32 always_inline u32

View File

@ -366,6 +366,14 @@ segment_manager_del_sessions (segment_manager_t * sm)
*/ */
while (fifo) while (fifo)
{ {
if (fifo->master_thread_index == 255)
{
svm_fifo_t *next = fifo->next;
application_local_session_disconnect_w_index (sm->app_index,
fifo->master_session_index);
fifo = next;
continue;
}
session = session_get (fifo->master_session_index, session = session_get (fifo->master_session_index,
fifo->master_thread_index); fifo->master_thread_index);
stream_session_disconnect (session); stream_session_disconnect (session);