+ app_ns_api_handle_t *handle;
+ app_worker_t *app_wrk;
+ u32 api_client_handle;
+
+ api_client_handle = appns_sapi_socket_handle (app_ns, cs);
+
+ /* Cleanup everything because app worker closed socket or crashed */
+ handle = (app_ns_api_handle_t *) & cs->private_data;
+ app_wrk = app_worker_get_if_valid (handle->aah_app_wrk_index);
+ if (!app_wrk)
+ return;
+
+ vnet_app_worker_add_del_args_t args = {
+ .app_index = app_wrk->app_index,
+ .wrk_map_index = app_wrk->wrk_map_index,
+ .api_client_index = api_client_handle,
+ .is_add = 0
+ };
+ /* Send rpc to main thread for worker barrier */
+ vlib_rpc_call_main_thread (vnet_app_worker_add_del, (u8 *) & args,
+ sizeof (args));
+}
+
+static clib_error_t *
+sapi_sock_read_ready (clib_file_t * cf)
+{
+ app_ns_api_handle_t *handle = (app_ns_api_handle_t *) & cf->private_data;
+ vlib_main_t *vm = vlib_get_main ();
+ app_sapi_msg_t msg = { 0 };
+ app_namespace_t *app_ns;
+ clib_error_t *err = 0;
+ clib_socket_t *cs;
+
+ app_ns = app_namespace_get (handle->aah_app_ns_index);
+ cs = appns_sapi_get_socket (app_ns, handle->aah_sock_index);
+ if (!cs)
+ goto error;
+
+ err = clib_socket_recvmsg (cs, &msg, sizeof (msg), 0, 0);
+ if (err)
+ {
+ clib_error_free (err);
+ sapi_socket_detach (app_ns, cs);
+ goto error;
+ }
+
+ handle = (app_ns_api_handle_t *) & cs->private_data;
+
+ vlib_worker_thread_barrier_sync (vm);
+
+ switch (msg.type)
+ {
+ case APP_SAPI_MSG_TYPE_ATTACH:
+ session_api_attach_handler (app_ns, cs, &msg.attach);
+ break;
+ case APP_SAPI_MSG_TYPE_ADD_DEL_WORKER:
+ sapi_add_del_worker_handler (app_ns, cs, &msg.worker_add_del);
+ break;
+ case APP_SAPI_MSG_TYPE_ADD_DEL_CERT_KEY:
+ sapi_add_del_cert_key_handler (app_ns, cs, &msg.cert_key_add_del);
+ break;
+ default:
+ clib_warning ("app wrk %u unknown message type: %u",
+ handle->aah_app_wrk_index, msg.type);
+ break;
+ }
+
+ vlib_worker_thread_barrier_release (vm);
+
+error:
+ return 0;
+}
+
+static clib_error_t *
+sapi_sock_write_ready (clib_file_t * cf)
+{
+ app_ns_api_handle_t *handle = (app_ns_api_handle_t *) & cf->private_data;
+ clib_warning ("called for app ns %u", handle->aah_app_ns_index);
+ return 0;