Fix adv data mixed issue in case total length is under 31 99/226099/1
authorWootak Jung <wootak.jung@samsung.com>
Tue, 25 Feb 2020 04:36:14 +0000 (13:36 +0900)
committerWootak Jung <wootak.jung@samsung.com>
Thu, 27 Feb 2020 01:16:51 +0000 (10:16 +0900)
Change-Id: I74d0fba65810c23c6ddc760513aed8619c101166

bt-oal/bluez_hal/src/bt-hal-gatt.c
bt-oal/hardware/bt_gatt_client.h
bt-oal/include/oal-event.h
bt-oal/include/oal-manager.h
bt-oal/oal-gatt.c
bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c

index e6b6d34..eab8eec 100644 (file)
@@ -58,8 +58,10 @@ typedef struct {
        uint8_t addr_type;
        uint8_t adv_type;
        int rssi;
-       int data_len;
-       uint8_t data[BT_HAL_ADV_DATA_MAX_SIZE * 2];
+       uint8_t adv_data[BT_HAL_ADV_DATA_MAX_SIZE];
+       int adv_data_len;
+       uint8_t scan_rsp_data[BT_HAL_ADV_DATA_MAX_SIZE];
+       int scan_rsp_data_len;
        guint timer_id;
 } bt_hal_le_adv_info_t;
 
@@ -462,7 +464,9 @@ static void __bt_hal_send_le_scan_result_event(bt_hal_le_adv_info_t *adv_info)
        str2bt_bdaddr_t(adv_info->addr, &bd_addr);
        if (bt_gatt_callbacks->client->scan_result_cb)
                bt_gatt_callbacks->client->scan_result_cb(
-                               &bd_addr, adv_info->rssi, adv_info->data);
+                               &bd_addr, adv_info->rssi,
+                               adv_info->adv_data, adv_info->adv_data_len,
+                               adv_info->scan_rsp_data, adv_info->scan_rsp_data_len);
 }
 
 static void __bt_handle_gatt_client_connected(void *buf, uint16_t len)
@@ -774,7 +778,8 @@ static void __bt_hal_handle_gatt_client_scan_result(void *buf, uint16_t len)
                adv_info = __bt_hal_get_adv_ind_info(address);
                if (adv_info) {
                        /* Copy scan response data in data field and send event */
-                       memcpy(&(adv_info->data[adv_info->data_len]), ev->adv_data, data_len);
+                       adv_info->scan_rsp_data_len = data_len;
+                       memcpy(adv_info->scan_rsp_data, ev->adv_data, data_len);
                        __bt_hal_send_le_scan_result_event(adv_info);
                        adv_ind_list = g_slist_remove(adv_ind_list, adv_info);
                        if (adv_info->timer_id)
@@ -796,8 +801,8 @@ static void __bt_hal_handle_gatt_client_scan_result(void *buf, uint16_t len)
        adv_info->addr_type = ev->addr_type;
        adv_info->adv_type = ev->adv_type;
        adv_info->rssi = ev->rssi;
-       adv_info->data_len = data_len;
-       memcpy(adv_info->data, ev->adv_data, data_len);
+       adv_info->adv_data_len = data_len;
+       memcpy(adv_info->adv_data, ev->adv_data, data_len);
 
 #ifdef TIZEN_BT_HAL
        if (_bt_hal_gatt_client_get_le_scan_type() == BT_GATTC_LE_SCAN_TYPE_PASSIVE) {
index d229184..5d376c7 100644 (file)
@@ -89,7 +89,8 @@ typedef void (*register_client_callback)(int status, int client_if,
                bt_uuid_t *app_uuid);
 
 /** Callback for scan results */
-typedef void (*scan_result_callback)(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data);
+typedef void (*scan_result_callback)(bt_bdaddr_t* bda, int rssi,
+               uint8_t* adv_data, int adv_dat_len, uint8_t *scan_rsp_data, int scan_rsp_data_len);
 
 /** GATT open callback invoked in response to open */
 typedef void (*connect_callback)(int conn_id, int status, int client_if, bt_bdaddr_t* bda);
index 100e701..33e6f39 100644 (file)
@@ -433,6 +433,9 @@ typedef struct {
        int rssi;
        bt_address_t address;
        uint8_t adv_data[BLE_ADV_DATA_LENGTH];
+       int adv_data_len;
+       uint8_t scan_rsp_data[BLE_ADV_DATA_LENGTH];
+       int scan_rsp_data_len;
 } event_ble_scan_result_info;
 
 typedef struct {
index 2b02fee..f26a784 100755 (executable)
@@ -36,7 +36,7 @@ extern "C" {
 
 #define OAL_UUID_MAX_LENGTH                            16/**< This specifies ble service UUID Length */
 
-#define BLE_ADV_DATA_LENGTH            62 /**< This specifies Advertising Data Length */
+#define BLE_ADV_DATA_LENGTH            31 /**< This specifies Advertising Data Length */
 
 #define BT_ADDRESS_STR_LEN                             18 /**< BT address String length> */
 
index 90c9e62..1b3bc2f 100644 (file)
@@ -197,7 +197,8 @@ static const btgatt_server_callbacks_t btgatt_server_callbacks = {
 
 /* Forward declaration for GATT client callbacks */
 static void cb_gattc_register_app(int status, int clientIf, bt_uuid_t *app_uuid);
-static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi, uint8_t *adv_data);
+static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi,
+               uint8_t *adv_data, int adv_data_len, uint8_t *scan_rsp_data, int scan_rsp_data_len);
 static void cb_gattc_connection(int conn_id, int status, int client_if, bt_bdaddr_t* bda);
 static void cb_gattc_disconnect(int conn_id, int status, int client_if, bt_bdaddr_t* bda);
 static void cb_gattc_search_result(int conn_id, btgatt_srvc_id_t *srvc_id);
@@ -1409,7 +1410,8 @@ static void cb_gattc_register_app(int status, int clientIf, bt_uuid_t *app_uuid)
        send_event(OAL_EVENT_GATTC_REGISTRATION, event, sizeof(event_gattc_register_t));
 }
 
-static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi, uint8_t *adv_data)
+static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi,
+               uint8_t *adv_data, int adv_data_len, uint8_t *scan_rsp_data, int scan_rsp_data_len)
 {
        event_ble_scan_result_info *event;
 
@@ -1417,6 +1419,9 @@ static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, int rssi, uint8_t *adv_
        event->rssi = rssi;
        memcpy(event->address.addr, bdaddress->address, BT_ADDRESS_BYTES_NUM);
        memcpy(event->adv_data, adv_data, BLE_ADV_DATA_LENGTH);
+       event->adv_data_len = adv_data_len;
+       memcpy(event->scan_rsp_data, scan_rsp_data, BLE_ADV_DATA_LENGTH);
+       event->scan_rsp_data_len = scan_rsp_data_len;
        send_event_bda_trace(OAL_EVENT_BLE_REMOTE_DEVICE_FOUND, event,
                        sizeof(event_ble_scan_result_info), (bt_address_t *)bdaddress);
 }
index 2b39e01..6f37dbc 100644 (file)
@@ -519,26 +519,6 @@ static void __bt_le_multi_advertising_set_data(event_ble_multiadv_status *event)
        }
 }
 
-static int __get_advertisement_data(unsigned char *dest, unsigned char *src)
-{
-       int length = 0;
-       int i = 0;
-
-       while (i <= 31) {
-               int len = src[i];
-
-               if ((len == 0) || (31 < (i + len))) {
-                       memcpy(dest, src, length);
-                       break;
-               }
-
-               length += (len + 1);
-               i += (len + 1);
-       }
-
-       return length;
-}
-
 static int __bt_get_ad_data_by_type(const char *in_data, int in_len,
                char in_type, char **data, int *data_len)
 {
@@ -917,20 +897,12 @@ static void __bt_le_handle_device_found(event_ble_scan_result_info *scan_result)
        _bt_convert_addr_type_to_string(address, scan_result->address.addr);
 
        memset(adv_ind_data, 0x00, sizeof(adv_ind_data));
-       adv_ind_len = __get_advertisement_data(
-                       adv_ind_data, &(scan_result->adv_data[0]));
-       if (adv_ind_len > BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX) {
-               BT_ERR("Invalid advertising data");
-               return;
-       }
+       adv_ind_len = scan_result->adv_data_len;
+       memcpy(adv_ind_data, scan_result->adv_data, BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX);
 
        memset(scan_resp_data, 0x00, sizeof(scan_resp_data));
-       scan_resp_len = __get_advertisement_data(
-                       scan_resp_data, &(scan_result->adv_data[adv_ind_len]));
-       if (scan_resp_len > BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX) {
-               BT_ERR("Invalid scan response data");
-               return;
-       }
+       scan_resp_len = scan_result->scan_rsp_data_len;
+       memcpy(scan_resp_data, scan_result->scan_rsp_data, BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX);
 
        BT_DBG("Address: %s, RSSI: %d, adv_ind_len: %d, scan_resp_len: %d",
                        address, scan_result->rssi, adv_ind_len, scan_resp_len);