CAPI:Allows multiple service data in LE advertising 60/241360/5
authorAmit Purwar <amit.purwar@samsung.com>
Wed, 19 Aug 2020 10:29:51 +0000 (15:59 +0530)
committerAmit Purwar <amit.purwar@samsung.com>
Wed, 26 Aug 2020 03:34:22 +0000 (09:04 +0530)
Change-Id: I07307798b29b3ed00c59c2416c2ae82c03f6198c
Signed-off-by: Amit Purwar <amit.purwar@samsung.com>
src/bluetooth-adapter.c
tests/test/bt_unit_test.c

index 618473e..f3b6c0d 100644 (file)
@@ -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);
index 28d409b..20226ac 100644 (file)
@@ -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");