aboutsummaryrefslogtreecommitdiffstats
path: root/src/vcl/vppcom.c
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2025-03-06 21:58:14 -0500
committerDave Barach <vpp@barachs.net>2025-03-10 19:56:38 +0000
commit3a2a58e4eed7b6eed222e5701c724ca622351fc2 (patch)
treeb6fd9cb0135359f218f60cadc1da486acbf3b871 /src/vcl/vppcom.c
parent5b200ab0609b7758c48ef2839d55c763ef8e8a7a (diff)
vcl: improve vpp detatch handling
Better handling of multi-threaded applications that share sessions. Type: improvement Change-Id: Id69bcb1a4b1d67aab020beefdb2fa196ec2ee108 Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vcl/vppcom.c')
-rw-r--r--src/vcl/vppcom.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c
index d09dd06b1d6..b4f985e5562 100644
--- a/src/vcl/vppcom.c
+++ b/src/vcl/vppcom.c
@@ -1430,7 +1430,8 @@ vcl_api_retry_attach (vcl_worker_t *wrk)
if (s->session_state == VCL_STATE_LISTEN)
vppcom_session_listen (vcl_session_handle (s), 10);
else
- VDBG (0, "internal error: unexpected state %d", s->session_state);
+ VDBG (0, "reattach error: %u unexpected state %d", s->session_index,
+ s->session_state);
}
}
@@ -1774,11 +1775,16 @@ vppcom_session_listen (uint32_t listen_sh, uint32_t q_len)
if (listen_session->session_state == VCL_STATE_LISTEN &&
!(listen_session->flags & VCL_SESSION_F_LISTEN_NO_MQ))
{
- VDBG (0, "session %u [0x%llx]: already in listen state!",
- listen_sh, listen_vpp_handle);
+ VDBG (0, "session %u [0x%llx]: already in listen state!", listen_sh,
+ listen_vpp_handle);
+ return VPPCOM_OK;
+ }
+ if (PREDICT_FALSE (!wrk->ctrl_mq))
+ {
+ listen_session->session_state = VCL_STATE_LISTEN;
+ listen_session->flags |= VCL_SESSION_F_LISTEN_NO_MQ;
return VPPCOM_OK;
}
-
listen_session->flags &= ~VCL_SESSION_F_LISTEN_NO_MQ;
VDBG (0, "session %u: sending vpp listen request...", listen_sh);
@@ -2657,6 +2663,9 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
*bits_set += 1;
}
break;
+ case SESSION_CTRL_EVT_BOUND:
+ vcl_session_bound_handler (wrk, (session_bound_msg_t *) e->data);
+ break;
case SESSION_CTRL_EVT_UNLISTEN_REPLY:
vcl_session_unlisten_reply_handler (wrk, e->data);
break;