FRWK: Allows multiple service data in LE advertising 79/242079/1
authorAmit Purwar <amit.purwar@samsung.com>
Mon, 24 Aug 2020 04:40:45 +0000 (10:10 +0530)
committerAmit Purwar <amit.purwar@samsung.com>
Mon, 24 Aug 2020 04:56:10 +0000 (10:26 +0530)
Change-Id: I138df1b79a53ca63edcf0fb987ea126c454769de
Signed-off-by: Amit Purwar <amit.purwar@samsung.com>
bt-oal/bluez_hal/src/bt-hal-adapter-le.c
bt-service/services/adapter/bt-service-core-adapter-le.c

index e0128fa..041ace8 100644 (file)
@@ -726,6 +726,35 @@ int _bt_hal_set_advertising_params(int server_if, int min_interval,
        return BT_STATUS_SUCCESS;
 }
 
+static int __bt_hal_parse_service_data(int len, char *src, uint8_t *dest)
+{
+       int total_service_len = len;
+       int service_data_len = 0;
+       char *ptr = NULL;
+       int idx = 0;
+
+       if (src == NULL || dest == NULL)
+               return 0;
+
+       ptr = src;
+
+       while (total_service_len) {
+               /* parse length1 + service_data1 + length2 + service data2*/
+               service_data_len = ptr[0];
+
+               dest[idx] = 1 + service_data_len;
+               dest[idx + 1] =   0x16; /* Fixed */
+               memcpy(dest + idx + 2, ptr +1, service_data_len);
+               idx = idx + 2 + service_data_len;
+
+               ptr = ptr + service_data_len + 1;
+               total_service_len = total_service_len - service_data_len - 1;
+       }
+
+       return idx;
+}
+
+
 /* Takes care of both Scan Response and Advertising data */
 int _bt_hal_set_advertising_data(btgatt_adv_param_setup_t adv_param_setup)
 {
@@ -775,12 +804,12 @@ int _bt_hal_set_advertising_data(btgatt_adv_param_setup_t adv_param_setup)
 
        /* Service Data  UUID*/
        if (adv_param_setup.service_data_len > 0) {
-               adv_data[index] = 1 + adv_param_setup.service_data_len;
-               adv_data[index+1] = 0x16; /* Fixed */
-               memcpy(&adv_data[index+2], adv_param_setup.service_data, adv_param_setup.service_data_len);
-               index += (2 + adv_param_setup.service_data_len);
-               length += (2 + adv_param_setup.service_data_len);
-               DBG("After Service data: Index [%d]", index);
+               int l = 0;
+               l = __bt_hal_parse_service_data(adv_param_setup.service_data_len,
+                               adv_param_setup.service_data, &adv_data[index]);
+
+               index = index + l;
+               length = length + l;
        }
 
        /* Set Apperance */
index c7e5d1b..a930b4d 100644 (file)
@@ -1410,6 +1410,17 @@ int _bt_get_scan_response_data(char *sender, int adv_handle, bluetooth_scan_resp
        return BLUETOOTH_ERROR_NONE;
 }
 
+void print_adv_data(unsigned char * adv_data, int len)
+{
+       char adv_data_str[(31 * 2) + 1];
+
+       for (int i = 0; i < len ; i++)
+               snprintf(&adv_data_str[i * 2], 3, "%02X", adv_data[i]);
+
+       BT_INFO("data: [%s]", adv_data_str);
+}
+
+
 static int __bt_set_multi_adv_param(oal_ble_multi_adv_param_setup_t *adv_setup,
                bluetooth_advertising_data_t *adv_data, int length)
 {
@@ -1476,9 +1487,30 @@ static int __bt_set_multi_adv_param(oal_ble_multi_adv_param_setup_t *adv_setup,
                        break;
                }
                case 0x16: { /* Service Data */
-                       adv_setup->service_data = g_malloc0(sizeof(char) * (len - 1));
-                       memcpy(adv_setup->service_data, (ptr + 2), (len - 1));
-                       adv_setup->service_data_len = len - 1;
+                       if (adv_setup->service_data == NULL) {
+                               /* first service data  */
+                               adv_setup->service_data = g_malloc0(sizeof(char) * (len));
+                               adv_setup->service_data[0] = len -1;  /*length1 + service_data1*/
+                               memcpy(adv_setup->service_data + 1, (ptr + 2), (len - 1));
+                               adv_setup->service_data_len = len;
+                       } else {
+                               /* Next service data */
+                               char *prev_service_data = adv_setup->service_data;
+                               int prev_service_len = adv_setup->service_data_len;
+
+                               /* create new memory */
+                               adv_setup->service_data = g_malloc0(sizeof(char) * (len + prev_service_len));
+                               memcpy(adv_setup->service_data, prev_service_data, prev_service_len);
+                               adv_setup->service_data[prev_service_len] = len -1;  /*length2 + service_data2*/
+                               memcpy(adv_setup->service_data + prev_service_len + 1, (ptr + 2), (len - 1));
+
+                               adv_setup->service_data_len = prev_service_len + len;
+
+                               /* remove the existing memory */
+                               g_free(prev_service_data);
+                       }
+                       BT_INFO("service data is packed:");
+                       print_adv_data((unsigned char *)adv_setup->service_data, adv_setup->service_data_len);
                        break;
                }
                case 0x21: {