summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPyun DoHyun <dh79.pyun@samsung.com>2020-08-27 01:08:26 +0000
committerGerrit Code Review <gerrit@review>2020-08-27 01:08:26 +0000
commite5151ed1ab4b2c4db14a57cf7721ee4b54003af1 (patch)
tree1c7c7d7a2290901e0b580da916877b66ac32a39c
parent22a8581372e62815d8220a1cea7e6a6755ca6436 (diff)
parente9f32a10428d42b3c400a2aadad956aa46c16e7c (diff)
downloadbluetooth-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.c68
-rw-r--r--tests/test/bt_unit_test.c35
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");