From: Anupam Roy Date: Thu, 20 Aug 2020 15:55:01 +0000 (+0530) Subject: Mesh: Release Network DBUS resources during deinit X-Git-Tag: accepted/tizen/unified/20200825.142907^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e6f8d94d9a6937e7a450ca51df8e74f898bb2460;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git Mesh: Release Network DBUS resources during deinit When application wants to deinitialize mesh, Network resources of that application shall be released by stack. Currently, those resouces are not released. Also, HAL retains the dynamic resouces of the Networks, which should be cleaned. This patch requests release of resources by calling 'Release' API of stack, which is introduced in Tizen. When dbus resouces are cleaned, HAL will automatically release dynamic resources of networks, upon removal of proxies. After release, at any point of time, application can again initialize mesh and 'Attach' the Networks, that it had created before, with the help of token, which was aquired during network creation. Change-Id: I617110d10fdb6d9eaa711f77dcd5a92e6b93a55f Signed-off-by: Anupam Roy --- diff --git a/bt-oal/bluez_hal/src/bt-hal-mesh-dbus-handler.c b/bt-oal/bluez_hal/src/bt-hal-mesh-dbus-handler.c index a548554..5c49b59 100644 --- a/bt-oal/bluez_hal/src/bt-hal-mesh-dbus-handler.c +++ b/bt-oal/bluez_hal/src/bt-hal-mesh-dbus-handler.c @@ -397,17 +397,12 @@ static gint __compare_proxy_path(gconstpointer data, gconstpointer user_data) char *app_uuid_path; const meshcfg_app *app = (meshcfg_app*) data; char *path = (char *) user_data; - INFO("Mesh: proxy path compare: path [%s]", path); - INFO("Mesh: App Path path [%s]", app->path); if (!path) return -1; app_uuid_path = l_util_hexstring(app->uuid, 16); - INFO("Mesh:App UUID string [%s]", app_uuid_path); char **strings = g_strsplit(path, "node", 2); - INFO("Mesh:String 0 [%s]", strings[0]); - INFO("Mesh:String 1 [%s]", strings[1]); ret = g_strcmp0(strings[1], app_uuid_path); g_free(strings[0]); g_free(strings[1]); @@ -610,6 +605,8 @@ void _bt_hal_mesh_stack_deinit(void) l_dbus_destroy(dbus); dbus = NULL; } + INFO("Mesh: Number of meshapps present in memory [%d]", + g_slist_length(mesh_apps)); } /* To send stack event to hal-mesh handler */ @@ -1719,6 +1716,34 @@ static void __bt_hal_mesh_leave_net_setup(struct l_dbus_message *msg, INFO("Mesh: Leave Network Setup app path [%s]", app->path); } +static void __bt_hal_mesh_release_net_reply( + struct l_dbus_proxy *proxy, + struct l_dbus_message *msg, void *user_data) +{ + meshcfg_app *app; + app = (meshcfg_app*) user_data; + + INFO("Mesh:Release Network Reply from Meshd: app path [%s]", app->path); + if (l_dbus_message_is_error(msg)) { + const char *name; + + l_dbus_message_get_error(msg, &name, NULL); + ERR("Mesh: Failed to Release network: %s", name); + + } else { + INFO("Mesh: Release Network: Success, cleanup app after proxy removed"); + } +} + +static void __bt_hal_mesh_release_net_setup(struct l_dbus_message *msg, + void *user_data) +{ + meshcfg_app *app = (meshcfg_app*) user_data; + + l_dbus_message_set_arguments(msg, "t", l_get_be64(app->token.u8)); + INFO("Mesh: Release Network Setup app path [%s]", app->path); +} + static void __bt_hal_mesh_create_net_reply( struct l_dbus_proxy *proxy, struct l_dbus_message *msg, void *user_data) @@ -2362,6 +2387,35 @@ bt_status_t _bt_hal_mesh_node_delete(bt_uuid_t *network, return BT_STATUS_SUCCESS; } +bt_status_t _bt_hal_mesh_network_release(bt_uuid_t *net_uuid) +{ + GSList *l; + meshcfg_app *app; + INFO("Mesh: Release Network"); + l = g_slist_find_custom(mesh_apps, net_uuid->uu, __mesh_compare_network_uuid); + if (l) { + app = l->data; + if (!__bt_mesh_proxy_check(app)) { + ERR("Mesh: Proxy check failed!!"); + return BT_STATUS_FAIL; + } + INFO("Mesh: Release Network"); + /* Create CFG Network */ + if (!l_dbus_proxy_method_call(net_proxy, "Release", + __bt_hal_mesh_release_net_setup, + __bt_hal_mesh_release_net_reply, app, + NULL)) { + ERR("Mesh: Network Release failed!!"); + return BT_STATUS_FAIL; + } + } else { + ERR("Mesh: App not found!!"); + return BT_STATUS_PARM_INVALID; + } + INFO("Mesh: Network Release Call issued successfully!!"); + return BT_STATUS_SUCCESS; +} + bt_status_t _bt_hal_mesh_network_destroy(bt_uuid_t *net_uuid) { GSList *l; diff --git a/bt-oal/bluez_hal/src/bt-hal-mesh-dbus-handler.h b/bt-oal/bluez_hal/src/bt-hal-mesh-dbus-handler.h index 2f27671..b22bf40 100644 --- a/bt-oal/bluez_hal/src/bt-hal-mesh-dbus-handler.h +++ b/bt-oal/bluez_hal/src/bt-hal-mesh-dbus-handler.h @@ -49,6 +49,8 @@ bt_status_t _bt_hal_mesh_create_network(bt_hal_mesh_node_t *node, bt_status_t _bt_hal_mesh_network_destroy(bt_uuid_t *net_uuid); +bt_status_t _bt_hal_mesh_network_release(bt_uuid_t *net_uuid); + bt_status_t _bt_hal_mesh_node_delete(bt_uuid_t *network, uint16_t unicast, uint16_t num_elements); diff --git a/bt-oal/bluez_hal/src/bt-hal-mesh.c b/bt-oal/bluez_hal/src/bt-hal-mesh.c index 0bac7ad..54d4937 100644 --- a/bt-oal/bluez_hal/src/bt-hal-mesh.c +++ b/bt-oal/bluez_hal/src/bt-hal-mesh.c @@ -240,6 +240,12 @@ static bt_status_t mesh_create_network(bt_hal_mesh_node_t *node, return _bt_hal_mesh_create_network(node, models, is_prov); } +static bt_status_t mesh_release_network(bt_uuid_t *network) +{ + DBG(""); + return _bt_hal_mesh_network_release(network); +} + static bt_status_t mesh_destroy_network(bt_uuid_t *network) { DBG(""); @@ -380,6 +386,7 @@ static btmesh_interface_t mesh_if = { .init = init, .create = mesh_create_network, .destroy = mesh_destroy_network, + .release = mesh_release_network, .delete_node = mesh_delete_node, .scan = mesh_scan, .scan_cancel = mesh_scan_cancel, diff --git a/bt-oal/hardware/bt_mesh.h b/bt-oal/hardware/bt_mesh.h index a8b6d62..bf64cda 100644 --- a/bt-oal/hardware/bt_mesh.h +++ b/bt-oal/hardware/bt_mesh.h @@ -204,6 +204,7 @@ typedef struct { bt_status_t (*create)(bt_hal_mesh_node_t *node, GSList *model_list, bool is_prov); bt_status_t (*destroy)(bt_uuid_t *network); + bt_status_t (*release)(bt_uuid_t *network); bt_status_t (*delete_node)(bt_uuid_t *network, uint16_t unicast, uint16_t elem_cnt); bt_status_t (*scan)(bt_uuid_t *network, diff --git a/bt-oal/include/oal-mesh.h b/bt-oal/include/oal-mesh.h index eeeb2e2..f8bf778 100644 --- a/bt-oal/include/oal-mesh.h +++ b/bt-oal/include/oal-mesh.h @@ -272,6 +272,18 @@ oal_status_t mesh_register_node(oal_mesh_node_t *node, oal_status_t mesh_network_destroy(oal_uuid_t* network_uuid); /** + * @brief Request Stack to release Network resources + * + * @remarks Stack will remove only yhe DBUS resources of local node + * + * @pre OAl API should be enabled with mesh_enable(). + * + * @see mesh_enable() + * @see mesh_register_node() + */ +oal_status_t mesh_network_release(oal_uuid_t* network_uuid); + +/** * @brief Delete Remote Node configuration * * @remarks Stack will remove the Remote node entry diff --git a/bt-oal/oal-mesh.c b/bt-oal/oal-mesh.c index 0e47904..ecb675c 100644 --- a/bt-oal/oal-mesh.c +++ b/bt-oal/oal-mesh.c @@ -367,6 +367,22 @@ oal_status_t mesh_register_node(oal_mesh_node_t *node, return OAL_STATUS_SUCCESS; } +oal_status_t mesh_network_release(oal_uuid_t* network_uuid) +{ + int ret = BT_STATUS_SUCCESS; + API_TRACE(); + CHECK_OAL_MESH_ENABLED(); + + BT_INFO("Mesh: Send Release Network request to stack"); + ret = mesh_api->release((bt_uuid_t*)network_uuid); + if (ret != BT_STATUS_SUCCESS) { + BT_ERR("MESH: Network Leave failed: %s", status2string(ret)); + return convert_to_oal_status(ret); + } + + return OAL_STATUS_SUCCESS; +} + oal_status_t mesh_network_destroy(oal_uuid_t* network_uuid) { int ret = BT_STATUS_SUCCESS; diff --git a/bt-service/services/mesh/bt-service-mesh-network.c b/bt-service/services/mesh/bt-service-mesh-network.c index 353e949..eddcc53 100644 --- a/bt-service/services/mesh/bt-service-mesh-network.c +++ b/bt-service/services/mesh/bt-service-mesh-network.c @@ -408,8 +408,9 @@ int _bt_mesh_network_unload(const char *app_cred, const char *sender, bluetooth_mesh_network_t *network) { GSList *l; - uint8_t net_uuid[16]; + oal_uuid_t net_uuid; _bt_mesh_cdb_t *cdb_cfg; + int ret = OAL_STATUS_SUCCESS; BT_INFO("Mesh: Unload Network Configuration"); /* If Scanning is going on */ @@ -420,10 +421,19 @@ int _bt_mesh_network_unload(const char *app_cred, } _bt_mesh_util_convert_string_to_hex(network->uuid, - strlen(network->uuid), net_uuid, 16); + strlen(network->uuid), net_uuid.uuid, 16); + + /* Release Mesh Network */ + ret = mesh_network_release(&net_uuid); + if (ret != OAL_STATUS_SUCCESS) { + BT_ERR("ret: %d", ret); + return BLUETOOTH_ERROR_INTERNAL; + } + + BT_INFO("Mesh: Network released"); /* Find CDB */ - l = g_slist_find_custom(cdb_list, net_uuid, + l = g_slist_find_custom(cdb_list, net_uuid.uuid, __mesh_compare_app_network_uuid); if (!l) { BT_ERR("Mesh: Could not find Network Entry: unexpected!!");