diff options
author | Pyun DoHyun <dh79.pyun@samsung.com> | 2020-08-27 01:08:26 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@review> | 2020-08-27 01:08:26 +0000 |
commit | e5151ed1ab4b2c4db14a57cf7721ee4b54003af1 (patch) | |
tree | 1c7c7d7a2290901e0b580da916877b66ac32a39c | |
parent | 22a8581372e62815d8220a1cea7e6a6755ca6436 (diff) | |
parent | e9f32a10428d42b3c400a2aadad956aa46c16e7c (diff) | |
download | bluetooth-e5151ed1ab4b2c4db14a57cf7721ee4b54003af1.tar.gz bluetooth-e5151ed1ab4b2c4db14a57cf7721ee4b54003af1.tar.bz2 bluetooth-e5151ed1ab4b2c4db14a57cf7721ee4b54003af1.zip |
Merge "CAPI:Allows multiple service data in LE advertising" into tizen
-rw-r--r-- | src/bluetooth-adapter.c | 68 | ||||
-rw-r--r-- | tests/test/bt_unit_test.c | 35 |
2 files changed, 92 insertions, 11 deletions
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"); |