Mesh: Handle meshd init failure 01/242401/2
authorAbhay Agarwal <ay.agarwal@samsung.com>
Wed, 26 Aug 2020 09:24:26 +0000 (14:54 +0530)
committerAbhay Agarwal <ay.agarwal@samsung.com>
Wed, 26 Aug 2020 18:21:06 +0000 (23:51 +0530)
Change-Id: I69802928eb8c03591039d3166ade05c03211811e
Signed-off-by: Abhay Agarwal <ay.agarwal@samsung.com>
bt-service/services/mesh/bt-service-mesh-main.c

index 9d4198f..276ee95 100644 (file)
 
 static guint launch_timer = 0;
 static guint mesh_app_ref_count;
+struct l_timeout *wait_timer;
 
 static GSList *apps;
 
+static int __bt_meshd_launch()
+{
+       int ret = UNIT_CONTROL_OK;
+       BT_INFO("Mesh: Launch Meshd");
+       ret = actd_start_unit(UNIT_CONTROL_BUS_TYPE_SYSTEM,
+                               MESH_SYSTEMD_SERVICE_NAME, 5000);
+
+       if (ret != UNIT_CONTROL_OK) {
+               BT_ERR("Failed to call systemact service: %d", ret);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+       BT_INFO("Mesh: Launch Meshd successful");
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+static void __bt_meshd_terminate()
+{
+       int ret = UNIT_CONTROL_OK;
+       BT_INFO("Mesh: Stop Meshd");
+
+       ret = actd_stop_unit(UNIT_CONTROL_BUS_TYPE_SYSTEM,
+                               MESH_SYSTEMD_SERVICE_NAME, 5000);
+       if (ret != UNIT_CONTROL_OK) {
+               BT_ERR("Failed to call systemact service: %d", ret);
+               return;
+       }
+
+       BT_INFO("Mesh: Meshd stop successful");
+}
+
+static void __bt_mesh_terminate()
+{
+       oal_status_t status = OAL_STATUS_SUCCESS;
+
+       /* Terminate bluetooth-meshd */
+       __bt_meshd_terminate();
+
+       /* Reset states */
+       _bt_mesh_set_scanning_state(false);
+       _bt_mesh_set_provisioning_state(false);
+
+       status = mesh_disable();
+       if (OAL_STATUS_SUCCESS != status) {
+               BT_ERR("Mesh: Failed to de-initialize Mesh profile, status: %d",
+                               status);
+               return;
+       }
+
+       /* Un-Register Mesh event handler */
+       _bt_service_unregister_event_handler_callback(BT_MESH_MODULE);
+}
+
 /* Event handlers */
 static void __bt_mesh_handle_pending_request_info(int result,
                int service_function, void *param,
@@ -85,6 +139,10 @@ static void __bt_mesh_handle_pending_request_info(int result,
 
                                /* Increase mesh app ref count */
                                mesh_app_ref_count++;
+                               l_timeout_remove(wait_timer);
+                       } else {
+                               /* Init failed - Terminate bluetooth-mesh */
+                               __bt_mesh_terminate();
                        }
 
                        out_param = g_array_new(FALSE, FALSE, sizeof(gchar));
@@ -790,22 +848,6 @@ static void __handle_mesh_events(int event_type,
        }
 }
 
-static int __bt_meshd_launch()
-{
-       int ret = UNIT_CONTROL_OK;
-       BT_INFO("Mesh: Launch Meshd");
-       ret = actd_start_unit(UNIT_CONTROL_BUS_TYPE_SYSTEM,
-                               MESH_SYSTEMD_SERVICE_NAME, 5000);
-
-       if (ret != UNIT_CONTROL_OK) {
-               BT_ERR("Failed to call systemact service: %d", ret);
-               return BLUETOOTH_ERROR_INTERNAL;
-       }
-       BT_INFO("Mesh: Launch Meshd successful");
-
-       return BLUETOOTH_ERROR_NONE;
-}
-
 static int __bt_mesh_enable()
 {
        oal_status_t status = OAL_STATUS_SUCCESS;
@@ -844,6 +886,19 @@ static gboolean __bt_mesh_launch_timer_expired_cb(gpointer data)
        return FALSE;
 }
 
+static void __bt_mesh_init_wait_response_timeout(
+                struct l_timeout *timeout, void *user_data)
+{
+       int result = BLUETOOTH_ERROR_TIMEOUT;
+
+       /* Handle DBUS Context return */
+       BT_INFO("Mesh: Handle DBUS Context return");
+       __bt_mesh_handle_pending_request_info(result,
+                       BT_MESH_INIT,
+                       NULL, 0);
+       l_timeout_remove(wait_timer);
+}
+
 int _bt_mesh_init(const char *sender)
 {
        int ret = BLUETOOTH_ERROR_NONE;
@@ -882,8 +937,12 @@ int _bt_mesh_init(const char *sender)
        launch_timer = g_timeout_add(MESH_LAUNCH_DELAY,
                                (GSourceFunc)__bt_mesh_launch_timer_expired_cb,
                                                                        NULL);
-
        BT_INFO("Mesh: Timer ID [%u]", launch_timer);
+
+       /* Add mesh init request timeout */
+       wait_timer = l_timeout_create(MESH_DEFAULT_RESPONSE_TIMEOUT,
+                       __bt_mesh_init_wait_response_timeout, NULL, NULL);
+
        return ret;
 }
 
@@ -899,8 +958,6 @@ int _bt_mesh_deinit(const char *sender)
 {
        GSList *l = NULL;
        char *owner = NULL;
-       oal_status_t status = OAL_STATUS_SUCCESS;
-       int ret = UNIT_CONTROL_OK;
 
        BT_INFO("Mesh: Deinit Request from App [%s]", sender);
        BT_INFO("Mesh: Total Apps available in list [%d]",
@@ -927,26 +984,8 @@ int _bt_mesh_deinit(const char *sender)
        if (mesh_app_ref_count == 1) {
                BT_INFO("Mesh: Only one app using Mesh Stack: Unload & reduce ref count");
 
-               /* Reset states */
-               _bt_mesh_set_scanning_state(false);
-               _bt_mesh_set_provisioning_state(false);
-
-               /* Terminate bluetooth-meshd */
-               ret = actd_stop_unit(UNIT_CONTROL_BUS_TYPE_SYSTEM,
-                               MESH_SYSTEMD_SERVICE_NAME, 5000);
-
-               if (ret != UNIT_CONTROL_OK)
-                       BT_ERR("Failed to call systemact service: %d", ret);
-
-               status = mesh_disable();
-               if (OAL_STATUS_SUCCESS != status) {
-                       BT_ERR("Mesh: Failed to de-initialize Mesh profile, status: %d",
-                                       status);
-                       return BLUETOOTH_ERROR_INTERNAL;
-               }
-
-               /* Un-Register Mesh event handler */
-               _bt_service_unregister_event_handler_callback(BT_MESH_MODULE);
+               /* Terminate bluetooth-mesh */
+               __bt_mesh_terminate();
        }
 
        /* Decrease mesh app ref count */