diff options
author | Pyun DoHyun <dh79.pyun@samsung.com> | 2020-07-27 22:43:12 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@review> | 2020-07-27 22:43:12 +0000 |
commit | 957abfe3a8c72d38f969013c2868eeb307546128 (patch) | |
tree | 0e8eb74dcfbd906411f3eabbd887b8b3164048cb | |
parent | d17018870df185c2252400bef44062313a7648f0 (diff) | |
parent | 840e9382ddf478b9ff7a1c00c67527619ca8fb6f (diff) | |
download | bluetooth-957abfe3a8c72d38f969013c2868eeb307546128.tar.gz bluetooth-957abfe3a8c72d38f969013c2868eeb307546128.tar.bz2 bluetooth-957abfe3a8c72d38f969013c2868eeb307546128.zip |
Merge "Mesh: Apply stabilization fixes in CAPI" into tizensubmit/tizen/20200727.225618accepted/tizen/unified/20200729.165704
-rw-r--r-- | src/bluetooth-common.c | 76 | ||||
-rw-r--r-- | src/bluetooth-mesh.c | 88 |
2 files changed, 100 insertions, 64 deletions
diff --git a/src/bluetooth-common.c b/src/bluetooth-common.c index a2f45d9..e553f3f 100644 --- a/src/bluetooth-common.c +++ b/src/bluetooth-common.c @@ -292,7 +292,7 @@ static bt_event2index_table_t event2index[] = { { BLUETOOTH_EVENT_MESH_NODE_VENDOR_FEATURES, BT_EVENT_MESH_NODE_VENDOR_FEATURES }, { BLUETOOTH_EVENT_MESH_NODE_KEY_CONFIGURED, BT_EVENT_MESH_NODE_KEY_CONFIGURATION_COMPLETED }, { BLUETOOTH_EVENT_MESH_NODE_TTL_CONFIGURED, BT_EVENT_MESH_NODE_TTL_EXECUTE_COMPLETED }, - { BLUETOOTH_EVENT_MESH_NODE_MODEL_APPKEY_BIND, BT_EVENT_MESH_NODE_MODEL_BIND_APPKEY_COMPLETED }, + { BLUETOOTH_EVENT_MESH_MODEL_APPKEY_BIND, BT_EVENT_MESH_NODE_MODEL_BIND_APPKEY_COMPLETED }, { BLUETOOTH_EVENT_MESH_MODEL_APPKEY_LIST, BT_EVENT_MESH_NODE_MODEL_APPKEY_LIST }, { BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_LIST, BT_EVENT_MESH_NODE_MODEL_SUB_LIST }, { BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_CONFGURED, BT_EVENT_MESH_NODE_MODEL_GROUP_SUB }, @@ -1425,6 +1425,7 @@ static bool __bt_need_to_handle(int event) case BLUETOOTH_EVENT_MESH_NODE_KEY_CONFIGURED: case BLUETOOTH_EVENT_MESH_NODE_TTL_CONFIGURED: case BLUETOOTH_EVENT_MESH_MODEL_APPKEY_LIST: + case BLUETOOTH_EVENT_MESH_MODEL_APPKEY_BIND: case BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_CONFGURED: case BLUETOOTH_EVENT_MESH_MODEL_VIRTUAL_SUBSCRIPTION_CONFGURED: case BLUETOOTH_EVENT_MESH_MODEL_PUBLICATION_STATUS: @@ -3872,6 +3873,49 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us bt_event_slot_container[event_index].user_data); break; } + case BLUETOOTH_EVENT_MESH_MODEL_APPKEY_BIND: { + BT_INFO("BLUETOOTH_EVENT_MESH_MODEL_APPKEY_BIND"); + bluetooth_mesh_model_configure_t *res = NULL; + bt_mesh_model_s *model_s = NULL; + bt_mesh_appkey_s *appkey_s = NULL; + bt_mesh_network_s *network_s = NULL; + res = (bluetooth_mesh_model_configure_t *)(param->param_data); + + network_s = _bt_mesh_get_network_handle_info(res->net_uuid); + if (!network_s) + break; + + BT_INFO("Mesh: Model AppKey %s Result", res->is_bind? "Bind" : "UnBind"); + model_s = _bt_mesh_get_node_get_model_from_element(res->net_uuid, + res->primary_unicast, res->elem_index, res->model); + if (!model_s) + break; + + appkey_s = _bt_mesh_network_get_appkey_from_index(network_s, res->appkey_idx); + if (!appkey_s) + break; + + if (_bt_get_error_code(param->result) == BT_ERROR_NONE) + BT_INFO("Mesh: Model AppKey Configuration: SUCCESS"); + else + BT_INFO("Mesh: Model AppKey Configuration: FAILED"); + + if (res->is_bind) + ((bt_mesh_model_bind_cb) + bt_event_slot_container[event_index].callback) + (_bt_get_error_code(param->result), + (bt_mesh_model_h) model_s, + (bt_mesh_appkey_h) appkey_s, + bt_event_slot_container[event_index].user_data); + else + ((bt_mesh_model_unbind_cb) + bt_event_slot_container[event_index].callback) + (_bt_get_error_code(param->result), + (bt_mesh_model_h) model_s, + (bt_mesh_appkey_h)appkey_s, + bt_event_slot_container[event_index].user_data); + break; + } /* Fall through */ case BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_CONFGURED: case BLUETOOTH_EVENT_MESH_MODEL_VIRTUAL_SUBSCRIPTION_CONFGURED: { @@ -3981,42 +4025,42 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us bluetooth_mesh_model_configure_t *res = NULL; bt_mesh_network_s *info = NULL; bt_mesh_node_s *node_s = NULL; + bt_mesh_model_s *model_s; + bt_mesh_element_s *element_s; GSList *appkeylist = NULL; int total = 0; res = (bluetooth_mesh_model_configure_t *)(param->param_data); + BT_INFO("Mesh: Model AppKey List result for Network [%s]", + res->net_uuid); info = _bt_mesh_get_network_handle_info(res->net_uuid); if (!info) break; + model_s = _bt_mesh_get_node_get_model_from_element(res->net_uuid, + res->primary_unicast, res->elem_index, res->model); + if (!model_s) + break; + + element_s = model_s->parent; + node_s = element_s->parent; if (_bt_get_error_code(param->result) == BT_ERROR_NONE) BT_INFO("Mesh: Node Model AppKeyList: SUCCESS"); else BT_INFO("Mesh: Node Model AppKeyList : FAILED"); - node_s = _bt_mesh_get_node_from_unicast(res->net_uuid, - res->primary_unicast); - if (!node_s) - break; - bt_mesh_model_s *model_s; - bt_mesh_element_s *element_s; total = res->appkeylist_count; + BT_INFO("Mesh: Total Appkeys Bound to Model [%d]", total); for (int i = 0; i < total; i++) { bt_mesh_appkey_s *appkey; appkey = _bt_mesh_node_get_appkey(node_s, *res->appkey_list[i]); - if (appkey) + if (appkey) { + BT_INFO("Mesh: AppKey found for Index [%d]", *res->appkey_list[i]); appkeylist = g_slist_append(appkeylist, appkey); - /* Free memory */ - g_free(res->appkey_list[i]); + } } - element_s = _bt_mesh_get_element_from_index(node_s, res->elem_index); - if (!element_s) - break; - model_s = _bt_mesh_get_model_from_modelid(element_s, res->model); - if (!model_s) - break; ((bt_mesh_model_appkey_list_cb) bt_event_slot_container[event_index].callback) (_bt_get_error_code(param->result), (bt_mesh_model_h) model_s, diff --git a/src/bluetooth-mesh.c b/src/bluetooth-mesh.c index c4c2a7b..bedd7a0 100644 --- a/src/bluetooth-mesh.c +++ b/src/bluetooth-mesh.c @@ -442,21 +442,21 @@ bt_mesh_model_s *_bt_mesh_get_node_get_model_from_element( if (!l) return NULL; - network_s = l->data; + network_s = (bt_mesh_network_s*) l->data; l1 = g_slist_find_custom(network_s->nodes, GUINT_TO_POINTER(unicast), (GCompareFunc)__compare_node_primary_unicast); if (!l1) return NULL; - node_s = l1->data; + node_s = (bt_mesh_node_s*) l1->data; l2 = g_slist_find_custom(node_s->elements, GUINT_TO_POINTER(elem_idx), (GCompareFunc)__compare_node_element_index); if (!l2) return NULL; - element_s = (bt_mesh_element_s*) l->data; + element_s = (bt_mesh_element_s*) l2->data; l3 = g_slist_find_custom(element_s->models, GUINT_TO_POINTER(model), @@ -464,7 +464,7 @@ bt_mesh_model_s *_bt_mesh_get_node_get_model_from_element( if (!l3) return NULL; - return (bt_mesh_model_s*) l->data; + return (bt_mesh_model_s*) l3->data; } bt_mesh_element_s * _bt_mesh_get_node_get_element_from_index(char *net_uuid, @@ -1408,10 +1408,9 @@ int bt_mesh_netkey_update(bt_mesh_netkey_h netkey) BT_CHECK_INPUT_PARAMETER(netkey); netkey_s = (bt_mesh_netkey_s*)netkey; + BT_MESH_VALIDATE_HANDLE(netkey_s, netkey_list); network_s = netkey_s->parent; - BT_MESH_VALIDATE_HANDLE(network_s, networks); - BT_MESH_VALIDATE_HANDLE(netkey_s, netkey_list); memset(&net, 0x00, sizeof(bluetooth_mesh_network_t)); @@ -1440,13 +1439,13 @@ int bt_mesh_netkey_delete(bt_mesh_netkey_h netkey) FUNC_ENTRY; BT_CHECK_MESH_SUPPORT(); BT_CHECK_MESH_INIT_STATUS(); + BT_CHECK_INPUT_PARAMETER(netkey); netkey_s = (bt_mesh_netkey_s*)netkey; + BT_MESH_VALIDATE_HANDLE(netkey_s, netkey_list); network_s = netkey_s->parent; - BT_MESH_VALIDATE_HANDLE(network_s, networks); - BT_MESH_VALIDATE_HANDLE(netkey_s, netkey_list); memset(&net, 0x00, sizeof(bluetooth_mesh_network_t)); @@ -1481,14 +1480,14 @@ int bt_mesh_netkey_add_appkey(bt_mesh_netkey_h netkey, FUNC_ENTRY; BT_CHECK_MESH_SUPPORT(); BT_CHECK_MESH_INIT_STATUS(); + BT_CHECK_INPUT_PARAMETER(netkey); BT_CHECK_INPUT_PARAMETER(appkey); netkey_s = (bt_mesh_netkey_s*)netkey; + BT_MESH_VALIDATE_HANDLE(netkey_s, netkey_list); network_s = netkey_s->parent; - BT_MESH_VALIDATE_HANDLE(network_s, networks); - BT_MESH_VALIDATE_HANDLE(netkey_s, netkey_list); memset(&net, 0x00, sizeof(bluetooth_mesh_network_t)); @@ -1529,10 +1528,11 @@ int bt_mesh_appkey_update(bt_mesh_appkey_h appkey) BT_CHECK_INPUT_PARAMETER(appkey); appkey_s = (bt_mesh_appkey_s*)appkey; + BT_MESH_VALIDATE_HANDLE(appkey_s, appkey_list); netkey_s = appkey_s->parent; + BT_MESH_VALIDATE_HANDLE(netkey_s, netkey_list); network_s = netkey_s->parent; - - BT_MESH_VALIDATE_HANDLE(appkey_s, appkey_list); + BT_MESH_VALIDATE_HANDLE(network_s, networks); memset(&net, 0x00, sizeof(bluetooth_mesh_network_t)); @@ -1565,10 +1565,11 @@ int bt_mesh_appkey_delete(bt_mesh_appkey_h appkey) BT_CHECK_INPUT_PARAMETER(appkey); appkey_s = (bt_mesh_appkey_s*)appkey; + BT_MESH_VALIDATE_HANDLE(appkey_s, appkey_list); netkey_s = appkey_s->parent; + BT_MESH_VALIDATE_HANDLE(netkey_s, netkey_list); network_s = netkey_s->parent; - - BT_MESH_VALIDATE_HANDLE(appkey_s, appkey_list); + BT_MESH_VALIDATE_HANDLE(network_s, networks); memset(&net, 0x00, sizeof(bluetooth_mesh_network_t)); @@ -2260,11 +2261,6 @@ int bt_mesh_node_configure_appkey(bt_mesh_node_h node, bt_mesh_node_key_configur if (netkey_s->parent != network_s) return BT_ERROR_INVALID_PARAMETER; - /* Return Already done, if appkey is present in the node */ - if (g_slist_find_custom(node_s->appkeys,(gconstpointer) appkey_s, - (GCompareFunc)__simple_compare)) - return BT_ERROR_ALREADY_DONE; - memset(&req, 0x00, sizeof(bluetooth_mesh_key_configure_t)); g_strlcpy(req.net_uuid, network_s->uuid, 33); @@ -2511,8 +2507,10 @@ int bt_mesh_node_foreach_netkeys(bt_mesh_node_h node, bt_mesh_node_netkey_info_c } } - g_ptr_array_foreach(netkeys, (GFunc)g_free, NULL); - g_ptr_array_free(netkeys, TRUE); + if (netkeys) { + g_ptr_array_foreach(netkeys, (GFunc)g_free, NULL); + g_ptr_array_free(netkeys, TRUE); + } FUNC_EXIT; return error_code; @@ -2522,10 +2520,8 @@ int bt_mesh_node_foreach_appkeys(bt_mesh_node_h node, bt_mesh_netkey_h netkey, bt_mesh_node_appkey_info_cb callback, void *user_data) { GPtrArray *appkeys = NULL; - GSList *l; int error_code = BT_ERROR_NONE; int i; - int total; bluetooth_mesh_node_discover_t req; uint16_t *appkey_idx = NULL; bt_mesh_network_s *network_s; @@ -2602,6 +2598,12 @@ int bt_mesh_node_foreach_appkeys(bt_mesh_node_h node, bt_mesh_netkey_h netkey, BT_INFO("Mesh: AppKey is already added in node"); } } + /* Send CallBack */ + if (!callback(BT_ERROR_NONE, (bt_mesh_node_h)node_s, appkeys->len, + (bt_mesh_netkey_h) netkey, (bt_mesh_appkey_h) appkey_local, + appkey_local->appkey_index, user_data)) { + break; + } } else { BT_ERR("Mesh: OPERATION_FAILED(0x%08x)", BT_ERROR_OPERATION_FAILED); @@ -2610,26 +2612,16 @@ int bt_mesh_node_foreach_appkeys(bt_mesh_node_h node, bt_mesh_netkey_h netkey, } } - total = g_slist_length(node_s->appkeys); - if (total == 0) { - BT_ERR("Mesh:Possible: No appkey added in node!!"); - callback(BT_ERROR_NONE, (bt_mesh_node_h)node_s, total, + if (appkeys->len == 0) { + BT_ERR("Mesh: No appkey configured for the bound netkey Idx [%d]", + req.netkey_idx); + callback(BT_ERROR_NONE, (bt_mesh_node_h)node_s, 0, (bt_mesh_netkey_h) netkey_s, NULL, 0xFFFF, user_data); } - for (l = node_s->appkeys; l != NULL; l = g_slist_next(l)) { - bt_mesh_appkey_s *appkey_s; - appkey_s = l->data; - - if (!callback(BT_ERROR_NONE, (bt_mesh_node_h)node_s, total, - (bt_mesh_netkey_h) netkey, (bt_mesh_appkey_h) appkey_s, - appkey_s->appkey_index, user_data)) { - break; - } + if (appkeys) { + g_ptr_array_foreach(appkeys, (GFunc)g_free, NULL); + g_ptr_array_free(appkeys, TRUE); } - - g_ptr_array_foreach(appkeys, (GFunc)g_free, NULL); - g_ptr_array_free(appkeys, TRUE); - FUNC_EXIT; return error_code; } @@ -2760,18 +2752,18 @@ int bt_mesh_model_get_appkey_list(bt_mesh_model_h model, BT_CHECK_INPUT_PARAMETER(callback); model_s = (bt_mesh_model_s*) model; - element_s = (bt_mesh_element_s*) model_s->parent; - node_s = (bt_mesh_node_s*) element_s->parent; - network_s = (bt_mesh_network_s*) node_s->parent; + BT_MESH_VALIDATE_HANDLE(model_s, model_list); - BT_CHECK_INPUT_PARAMETER(model_s); + element_s = (bt_mesh_element_s*) model_s->parent; BT_CHECK_INPUT_PARAMETER(element_s); - BT_CHECK_INPUT_PARAMETER(node_s); - BT_CHECK_INPUT_PARAMETER(network_s); - - BT_MESH_VALIDATE_HANDLE(model_s, model_list); BT_MESH_VALIDATE_HANDLE(element_s, element_list); + + node_s = (bt_mesh_node_s*) element_s->parent; + BT_CHECK_INPUT_PARAMETER(node_s); BT_MESH_VALIDATE_HANDLE(node_s, node_list); + + network_s = (bt_mesh_network_s*) node_s->parent; + BT_CHECK_INPUT_PARAMETER(network_s); BT_MESH_VALIDATE_HANDLE(network_s, networks); /* Return error, if node is not attached */ |