summaryrefslogtreecommitdiffstats
path: root/src/vcl
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2022-03-30 16:08:25 -0700
committerDamjan Marion <dmarion@me.com>2022-03-31 15:43:28 +0000
commitd04ea4443ffedcb3f07bb0accfdbf2da2b8911f4 (patch)
tree5c8fc20c14fdb427e4905556e44693f3eaa3b808 /src/vcl
parent8a4a7c216a7db3f06a2221290129aaba81a44bb9 (diff)
vcl: fix api detach if attach failed
Type: fix Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: Idd1df83bb01951c2455b23c08e3cc1fcd9b91064
Diffstat (limited to 'src/vcl')
-rw-r--r--src/vcl/vcl_private.c4
-rw-r--r--src/vcl/vppcom.c9
2 files changed, 12 insertions, 1 deletions
diff --git a/src/vcl/vcl_private.c b/src/vcl/vcl_private.c
index 95cc0bfc3f4..589380d27aa 100644
--- a/src/vcl/vcl_private.c
+++ b/src/vcl/vcl_private.c
@@ -138,6 +138,9 @@ vcl_api_app_worker_add (void)
void
vcl_api_app_worker_del (vcl_worker_t * wrk)
{
+ if (wrk->api_client_handle == ~0)
+ return;
+
if (vcm->cfg.vpp_app_socket_api)
return vcl_sapi_app_worker_del (wrk);
@@ -249,6 +252,7 @@ vcl_worker_alloc_and_init ()
wrk = vcl_worker_alloc ();
vcl_set_worker_index (wrk->wrk_index);
+ wrk->api_client_handle = ~0;
wrk->thread_id = pthread_self ();
wrk->current_pid = getpid ();
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c
index 0e81749224e..7fffc3bcbe2 100644
--- a/src/vcl/vppcom.c
+++ b/src/vcl/vppcom.c
@@ -1286,6 +1286,9 @@ vcl_api_handle_disconnect (vcl_worker_t *wrk)
static void
vcl_api_detach (vcl_worker_t * wrk)
{
+ if (wrk->api_client_handle == ~0)
+ return;
+
vcl_send_app_detach (wrk);
if (vcm->cfg.vpp_app_socket_api)
@@ -1328,7 +1331,10 @@ vppcom_app_create (const char *app_name)
vcl_worker_alloc_and_init ();
if ((rv = vcl_api_attach ()))
- return rv;
+ {
+ vppcom_app_destroy ();
+ return rv;
+ }
VDBG (0, "app_name '%s', my_client_index %d (0x%x)", app_name,
vcm->workers[0].api_client_handle, vcm->workers[0].api_client_handle);
@@ -1358,6 +1364,7 @@ vppcom_app_destroy (void)
vcl_api_detach (current_wrk);
vcl_worker_cleanup (current_wrk, 0 /* notify vpp */ );
+ vcl_set_worker_index (~0);
vcl_elog_stop (vcm);