From: Amit Purwar Date: Wed, 19 Aug 2020 10:29:51 +0000 (+0530) Subject: CAPI:Allows multiple service data in LE advertising X-Git-Tag: submit/tizen/20200827.215651~2^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e9f32a10428d42b3c400a2aadad956aa46c16e7c;p=platform%2Fcore%2Fapi%2Fbluetooth.git CAPI:Allows multiple service data in LE advertising Change-Id: I07307798b29b3ed00c59c2416c2ae82c03f6198c Signed-off-by: Amit Purwar --- diff --git a/src/bluetooth-adapter.c b/src/bluetooth-adapter.c index 618473e..f3b6c0d 100644 --- a/src/bluetooth-adapter.c +++ b/src/bluetooth-adapter.c @@ -2060,6 +2060,7 @@ static int __bt_find_adv_data_type(bt_advertiser_h advertiser, return BT_ERROR_NONE; } + /* LCOV_EXCL_START */ static int __bt_append_adv_type_data(bt_advertiser_h advertiser, bt_adapter_le_packet_type_e pkt_type, @@ -2240,32 +2241,70 @@ int bt_adapter_le_add_advertising_service_solicitation_uuid(bt_advertiser_h adve return ret; } +static int __bt_find_uuid_in_service_data(bt_advertiser_h advertiser, + bt_adapter_le_packet_type_e pkt_type, char * uuid, bool *exist) +{ + int type; + int len; + int i; + char *adv_data = NULL; + int adv_len = 0; + bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser; + bt_adapter_le_advertising_data_type_e data_type = BT_ADAPTER_LE_ADVERTISING_DATA_SERVICE_DATA; + + if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) { + + adv_data = __adv->adv_data; + adv_len = __adv->adv_data_len; + } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) { + adv_data = __adv->scan_rsp_data; + adv_len = __adv->scan_rsp_data_len; + } else + return BT_ERROR_INVALID_PARAMETER; + + if (!adv_data) { + BT_INFO("Currently there is no advertisement data"); + return BT_ERROR_NONE; + } + + i = 0; + while (i < adv_len) { + len = adv_data[i]; + type = adv_data[i + 1]; + + if (type == data_type) { + if (!memcmp((adv_data + i + 2), uuid, 2)) { + BT_INFO("uuid matched"); + *exist = true; + return BT_ERROR_NONE; + } + } + + i = len + 1; + } + + *exist = false; + return BT_ERROR_NONE; +} + int bt_adapter_le_add_advertising_service_data(bt_advertiser_h advertiser, bt_adapter_le_packet_type_e pkt_type, const char *uuid, const char *service_data, int service_data_len) { int ret = BT_ERROR_NONE; - char *data_ptr = NULL; - int data_len; char *adv_data = NULL; int uuid_bit; char *uuid_ptr; int byte_len = 0; char *converted_uuid = NULL; + bool exist = false; BT_CHECK_LE_SUPPORT(); BT_CHECK_INIT_STATUS(); BT_CHECK_INPUT_PARAMETER(advertiser); BT_CHECK_INPUT_PARAMETER(service_data); - __bt_find_adv_data_type(advertiser, pkt_type, - BT_ADAPTER_LE_ADVERTISING_DATA_SERVICE_DATA, - &data_ptr, &data_len); - if (data_ptr) { - BT_ERR("Aleady existed"); /* LCOV_EXCL_LINE */ - return BT_ERROR_ALREADY_DONE; /* LCOV_EXCL_LINE */ - } - + BT_INFO("Service Data uuid[%s]", uuid); ret = __bt_convert_string_to_uuid(uuid, &uuid_ptr, &uuid_bit); if (ret != BT_ERROR_NONE) return ret; @@ -2281,6 +2320,15 @@ int bt_adapter_le_add_advertising_service_data(bt_advertiser_h advertiser, __bt_convert_byte_ordering(uuid_ptr, byte_len, &converted_uuid); g_free(uuid_ptr); + ret = __bt_find_uuid_in_service_data(advertiser, pkt_type, converted_uuid, &exist); + if (ret != BT_ERROR_NONE) + return ret; + + if (exist) { + BT_INFO("Aleady existed"); + return BT_ERROR_ALREADY_DONE; + } + adv_data = g_malloc0(sizeof(char) *(service_data_len + 2)); memcpy(adv_data, converted_uuid, 2); diff --git a/tests/test/bt_unit_test.c b/tests/test/bt_unit_test.c index 28d409b..20226ac 100644 --- a/tests/test/bt_unit_test.c +++ b/tests/test/bt_unit_test.c @@ -3611,7 +3611,7 @@ int test_set_params(int test_id, char *param) break; case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_ADD_ADVERTISING_DATA: param_count = 1; - TC_PRT("Select advertising data \n (0 : Service uuid, 1: Service solicitation 2 : Appearance & Tx power, 3 : All, 4 : ANCS"); + TC_PRT("Select advertising data \n (0 : Service uuid, 1: Service solicitation 2 : Appearance & Tx power, 3 : All, 4 : ANCS, 6: Multiple service data"); TC_PRT("\t (Default scan response : Service Data &Local name & Manufacturer data)"); break; case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_ADVERTISING_MODE: @@ -4883,6 +4883,7 @@ int test_input_callback(void *data) const char *ancs_uuid_128 = "7905F431-B5CE-4E99-A40F-4B1E122D00D0"; const char *ams_uuid_128 = "89D3502B-0F36-433A-8EF4-C502AD55F8DC"; int appearance = 192; /* 192 is generic watch */ + const char *hid_svc_uuid_16 = "1812"; advertiser = advertiser_list[advertiser_index]; @@ -5017,6 +5018,38 @@ int test_input_callback(void *data) TC_PRT("set device name [0x%04x]", ret); return 0; + case 6: /*multiple service data */ + ret = bt_adapter_le_add_advertising_service_uuid(advertiser, + BT_ADAPTER_LE_PACKET_ADVERTISING, time_svc_uuid_16); + if (ret != BT_ERROR_NONE) + TC_PRT("add service_uuid [0x%04x]", ret); + + ret = bt_adapter_le_add_advertising_service_uuid(advertiser, + BT_ADAPTER_LE_PACKET_ADVERTISING, battery_svc_uuid_16); + if (ret != BT_ERROR_NONE) + TC_PRT("add service_uuid [0x%04x]", ret); + ret = bt_adapter_le_add_advertising_service_data(advertiser, + BT_ADAPTER_LE_PACKET_ADVERTISING, time_svc_uuid_16, + service_data, sizeof(service_data)); + if (ret != BT_ERROR_NONE) + TC_PRT("add service_data [0x%04x]", ret); + ret = bt_adapter_le_add_advertising_service_data(advertiser, + BT_ADAPTER_LE_PACKET_ADVERTISING, time_svc_uuid_16, + service_data, sizeof(service_data)); + if (ret != BT_ERROR_NONE) + TC_PRT("add service_data [0x%04x]", ret); + + ret = bt_adapter_le_add_advertising_service_data(advertiser, + BT_ADAPTER_LE_PACKET_ADVERTISING, hid_svc_uuid_16, + service_data, sizeof(service_data)); + if (ret != BT_ERROR_NONE) + TC_PRT("add service_data [0x%04x]", ret); + + ret = bt_adapter_le_set_advertising_device_name(advertiser, + BT_ADAPTER_LE_PACKET_SCAN_RESPONSE, true); + if (ret != BT_ERROR_NONE) + TC_PRT("set device name [0x%04x]", ret); + return 0; default: TC_PRT("No adv data");