From: Wootak Jung Date: Tue, 25 Feb 2020 04:36:14 +0000 (+0900) Subject: Fix adv data mixed issue in case total length is under 31 X-Git-Tag: accepted/tizen/unified/20200302.125816~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=895495689dabdd9b44495830960104ebfdeec32e;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git Fix adv data mixed issue in case total length is under 31 Change-Id: I74d0fba65810c23c6ddc760513aed8619c101166 --- diff --git a/bt-oal/bluez_hal/src/bt-hal-gatt.c b/bt-oal/bluez_hal/src/bt-hal-gatt.c index e6b6d34..eab8eec 100644 --- a/bt-oal/bluez_hal/src/bt-hal-gatt.c +++ b/bt-oal/bluez_hal/src/bt-hal-gatt.c @@ -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) { diff --git a/bt-oal/hardware/bt_gatt_client.h b/bt-oal/hardware/bt_gatt_client.h index d229184..5d376c7 100644 --- a/bt-oal/hardware/bt_gatt_client.h +++ b/bt-oal/hardware/bt_gatt_client.h @@ -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); diff --git a/bt-oal/include/oal-event.h b/bt-oal/include/oal-event.h index 100e701..33e6f39 100644 --- a/bt-oal/include/oal-event.h +++ b/bt-oal/include/oal-event.h @@ -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 { diff --git a/bt-oal/include/oal-manager.h b/bt-oal/include/oal-manager.h index 2b02fee..f26a784 100755 --- a/bt-oal/include/oal-manager.h +++ b/bt-oal/include/oal-manager.h @@ -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> */ diff --git a/bt-oal/oal-gatt.c b/bt-oal/oal-gatt.c index 90c9e62..1b3bc2f 100644 --- a/bt-oal/oal-gatt.c +++ b/bt-oal/oal-gatt.c @@ -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); } diff --git a/bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c b/bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c index 2b39e01..6f37dbc 100644 --- a/bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c +++ b/bt-service-adaptation/services/adapter/bt-service-core-adapter-le.c @@ -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);