BT 5.0 : Support for extended Scanning 48/296648/4
authorAnuj Jain <anuj01.jain@samsung.com>
Tue, 1 Aug 2023 13:59:00 +0000 (19:29 +0530)
committerAnuj Jain <anuj01.jain@samsung.com>
Mon, 21 Aug 2023 13:22:11 +0000 (18:52 +0530)
This patch provides initial support for extended scanning.

As there is no support for Extended scanning on bluez layer
therefore this feature is currently disabled.

Change-Id: Ia6ca9fe5e404fddb4e50644ceaf588d0bba5b495
Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
14 files changed:
bt-api/bt-adapter-le.c
bt-api/bt-common.c
bt-api/bt-event-handler.c
bt-oal/bluez_hal/inc/bt-hal-msg.h
bt-oal/bluez_hal/src/bt-hal-event-receiver.c
bt-oal/bluez_hal/src/bt-hal-gatt.c
bt-oal/hardware/bt_gatt_client.h
bt-oal/include/oal-event.h
bt-oal/oal-gatt.c
bt-service/services/adapter/bt-service-core-adapter-le.c
bt-service/services/bt-request-handler.c
bt-service/services/include/bt-service-core-adapter-le.h
include/bluetooth-api.h
include/bt-internal-types.h

index 490f2bc..4bdf2f7 100644 (file)
@@ -116,6 +116,48 @@ BT_EXPORT_API int bluetooth_start_le_discovery(void)
        return result;
 }
 
+BT_EXPORT_API int bluetooth_set_le_scan_phy(bleutooth_le_scanning_phy_t phy)
+{
+       int result;
+
+       BT_CHECK_ENABLED_ANY(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       _bt_print_api_caller_name();
+
+       g_array_append_vals(in_param1, &phy, sizeof(int));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCANNING_PHY,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
+BT_EXPORT_API int bluetooth_set_le_scan_role(bluetooth_le_scan_role_t role)
+{
+       int result;
+
+       BT_CHECK_ENABLED_ANY(return);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       _bt_print_api_caller_name();
+
+       g_array_append_vals(in_param1, &role, sizeof(int));
+
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_SET_SCANNING_ROLE,
+               in_param1, in_param2, in_param3, in_param4, &out_param);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+       return result;
+}
+
 BT_EXPORT_API int bluetooth_stop_le_discovery(void)
 {
        int result;
index 9938795..96d7d30 100644 (file)
@@ -561,6 +561,8 @@ const char *_bt_convert_service_function_to_string(int function)
                {BT_START_CUSTOM_DISCOVERY, "BT_START_CUSTOM_DISCOVERY"},
                {BT_CANCEL_DISCOVERY, "BT_CANCEL_DISCOVERY"},
                {BT_START_LE_DISCOVERY, "BT_START_LE_DISCOVERY"},
+               {BT_SET_SCANNING_PHY, "BT_SET_SCANNING_PHY"},
+               {BT_SET_SCANNING_ROLE, "BT_SET_SCANNING_ROLE"},
                {BT_STOP_LE_DISCOVERY, "BT_STOP_LE_DISCOVERY"},
                {BT_IS_DISCOVERYING, "BT_IS_DISCOVERYING"},
                {BT_IS_LE_DISCOVERYING, "BT_IS_LE_DISCOVERYING"},
index b8fd704..7b39fde 100644 (file)
@@ -318,6 +318,13 @@ static bluetooth_le_device_info_t *__bt_get_le_device_info_in_message(GVariant *
        int i;
        short addr_type = 0;
        short rssi = 0;
+       int event_type = 0;
+       int primary_phy = 0;
+       int secondary_phy = 0;
+       int advertising_sid = 0;
+       int tx_power = 0;
+       int periodic_adv_int = 0;
+       bool is_extended = FALSE;
        int len = 0;
        int adv_data_len = 0;
        GVariant *adv_var = NULL;
@@ -327,8 +334,10 @@ static bluetooth_le_device_info_t *__bt_get_le_device_info_in_message(GVariant *
        const char *scan_data = NULL;
        int result = BLUETOOTH_ERROR_NONE;
 
-       g_variant_get(parameters, "(i&snnn@ayn@ay)", &result, &address,
-                       &addr_type, &rssi, &adv_data_len, &adv_var, &scan_data_len, &scan_var);
+       g_variant_get(parameters, "(isnniiiiiiin@ayn@ay)", &result, &address,
+                       &addr_type, &rssi, &event_type, &primary_phy, &secondary_phy,
+                       &advertising_sid,&tx_power, &periodic_adv_int, &is_extended,
+                       &adv_data_len, &adv_var, &scan_data_len, &scan_var);
 
        len = g_variant_get_size(adv_var);
        if (len > 0)
@@ -342,6 +351,13 @@ static bluetooth_le_device_info_t *__bt_get_le_device_info_in_message(GVariant *
        _bt_convert_addr_string_to_type(le_dev_info->device_address.addr, address);
        le_dev_info->addr_type = addr_type;
        le_dev_info->rssi = rssi;
+       le_dev_info->event_type = event_type;
+       le_dev_info->primary_phy = primary_phy;
+       le_dev_info->secondary_phy = secondary_phy;
+       le_dev_info->advertising_sid = advertising_sid;
+       le_dev_info->tx_power = tx_power;
+       le_dev_info->periodic_adv_int = periodic_adv_int;
+       le_dev_info->is_extended = is_extended;
        le_dev_info->adv_ind_data.data_len = adv_data_len;
 
        for (i = 0; i < adv_data_len; i++)
index a7ecf9b..02e1fd5 100644 (file)
@@ -524,6 +524,13 @@ struct hal_ev_gatt_client_scan_result {
        uint8_t  addr_type;
        uint8_t  adv_type;
        int32_t  rssi;
+       bool is_extended;
+       uint16_t event_type;
+       uint8_t primary_phy;
+       uint8_t secondary_phy;
+       uint8_t advertising_sid;
+       int8_t tx_power;
+       uint16_t periodic_adv_int;
        uint16_t len;
        uint8_t  adv_data[0];
 } __attribute__((packed));
index 8207582..14f2f65 100644 (file)
@@ -2219,6 +2219,13 @@ static void __bt_hal_handle_adv_report(GVariant *msg, const char *path)
        ev->addr_type = addr_type;
        ev->adv_type = adv_type;
        ev->rssi = rssi;
+       ev->is_extended = 0;
+       ev->event_type = 0;
+       ev->primary_phy = 1;
+       ev->secondary_phy = 1;
+       ev->advertising_sid = 0;
+       ev->tx_power = 0;
+       ev->periodic_adv_int = 0;
        ev->len = data_len;
        memcpy(ev->adv_data, buffer, data_len);
        size += data_len;
index fcb7c81..8ef97f7 100644 (file)
@@ -58,6 +58,13 @@ typedef struct {
        uint8_t addr_type;
        uint8_t adv_type;
        int rssi;
+       bool is_extended;
+       uint16_t event_type;
+       uint8_t primary_phy;
+       uint8_t secondary_phy;
+       uint8_t advertising_sid;
+       int8_t tx_power;
+       uint16_t periodic_adv_int;
        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];
@@ -465,6 +472,10 @@ static void __bt_hal_send_le_scan_result_event(bt_hal_le_adv_info_t *adv_info)
        if (bt_gatt_callbacks->client->scan_result_cb)
                bt_gatt_callbacks->client->scan_result_cb(
                                &bd_addr, adv_info->addr_type, adv_info->rssi,
+                               adv_info->is_extended,
+                               adv_info->event_type, adv_info->primary_phy,
+                               adv_info->secondary_phy, adv_info->advertising_sid,
+                               adv_info->tx_power, adv_info->periodic_adv_int,
                                adv_info->adv_data, adv_info->adv_data_len,
                                adv_info->scan_rsp_data, adv_info->scan_rsp_data_len);
 }
@@ -802,6 +813,14 @@ 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->is_extended = ev->is_extended;
+       adv_info->event_type = ev->event_type;
+       adv_info->addr_type = ev->addr_type;
+       adv_info->primary_phy = ev->primary_phy;
+       adv_info->secondary_phy = ev->secondary_phy;
+       adv_info->advertising_sid = ev->advertising_sid;
+       adv_info->tx_power = ev->tx_power;
+       adv_info->periodic_adv_int = ev->periodic_adv_int;
        adv_info->adv_data_len = data_len;
        memcpy(adv_info->adv_data, ev->adv_data, data_len);
 
index e1ba5b9..cde4af7 100644 (file)
@@ -90,6 +90,8 @@ typedef void (*register_client_callback)(int status, int client_if,
 
 /** Callback for scan results */
 typedef void (*scan_result_callback)(bt_bdaddr_t* bda, uint8_t addr_type, int rssi,
+               bool is_extended, uint16_t event_type, uint8_t primary_phy, uint8_t secondary_phy,
+               uint8_t advertising_sid, int8_t tx_power, uint16_t periodic_adv_int,
                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 */
index 8add055..16b3c0f 100644 (file)
@@ -469,6 +469,13 @@ typedef struct {
        int rssi;
        uint8_t addr_type;
        bt_address_t address;
+       uint8_t is_extended;
+       uint16_t event_type;
+       uint8_t primary_phy;
+       uint8_t secondary_phy;
+       uint8_t advertising_sid;
+       int8_t tx_power;
+       uint16_t periodic_adv_int;
        uint8_t adv_data[BLE_ADV_DATA_LENGTH];
        int adv_data_len;
        uint8_t scan_rsp_data[BLE_ADV_DATA_LENGTH];
index 10e66e0..94e0ab0 100644 (file)
@@ -188,7 +188,9 @@ 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, uint8_t addr_type, int rssi,
+static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, uint8_t addr_type, int rssi, bool is_extended,
+               uint16_t event_type, uint8_t primary_phy, uint8_t secondary_phy,
+               uint8_t advertising_sid, int8_t tx_power, uint16_t periodic_adv_int,
                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);
@@ -1369,7 +1371,9 @@ 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, uint8_t addr_type, int rssi,
+static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, uint8_t addr_type, int rssi, bool is_extended,
+               uint16_t event_type, uint8_t primary_phy, uint8_t secondary_phy,
+               uint8_t advertising_sid, int8_t tx_power, uint16_t periodic_adv_int,
                uint8_t *adv_data, int adv_data_len, uint8_t *scan_rsp_data, int scan_rsp_data_len)
 {
        event_ble_scan_result_info *event;
@@ -1377,6 +1381,12 @@ static void cb_gattc_scan_result(bt_bdaddr_t* bdaddress, uint8_t addr_type, int
        event = g_new0(event_ble_scan_result_info, 1);
        event->addr_type = addr_type;
        event->rssi = rssi;
+       event->is_extended = (uint8_t) is_extended;
+        event->event_type = event_type;
+        event->primary_phy = primary_phy;
+        event->secondary_phy = secondary_phy;
+        event->advertising_sid = advertising_sid;
+        event->tx_power = tx_power;
        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;
index 8a22fab..631777c 100644 (file)
@@ -99,11 +99,17 @@ static bool is_static_random_address = false;
 #define BT_ADV_INTERVAL_SPLIT 0.625
 
 typedef struct {
+       int role;
+       int phy;
+} bt_adapter_le_scanner_setting_t;
+
+typedef struct {
        char *sender;
        uid_t uid;
        pid_t pid;
        GSList *filter_list;
        gboolean is_scanning;
+       bt_adapter_le_scanner_setting_t scan_settings;
 } bt_adapter_le_scanner_t;
 
 static GSList *scanner_list = NULL;
@@ -921,8 +927,12 @@ static void __bt_le_handle_device_found(event_ble_scan_result_info *scan_result)
        int result = BLUETOOTH_ERROR_NONE;
        bt_adapter_le_scanner_t *scanner = NULL;
        char address[BT_ADDRESS_STRING_SIZE];
+       /* TODO : Replace BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX with
+        * BLUETOOTH_EXTENDED_ADVERTISING_DATA_LENGTH_MAX once
+        * LE_EXTENDED feature is supported */
        unsigned char adv_ind_data[BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX];
        unsigned char scan_resp_data[BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX];
+       char *tmp_str = NULL;
        int adv_ind_len = 0;
        int scan_resp_len = 0;
        GVariant *scan_data_param;
@@ -934,22 +944,49 @@ 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 = scan_result->adv_data_len;
-       memcpy(adv_ind_data, scan_result->adv_data, BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX);
+       if (scan_result->is_extended) {
+               tmp_str = _bt_service_convert_hex_to_string(scan_result->adv_data, 250);
+               g_free(tmp_str);
 
-       memset(scan_resp_data, 0x00, sizeof(scan_resp_data));
-       scan_resp_len = scan_result->scan_rsp_data_len;
-       memcpy(scan_resp_data, scan_result->scan_rsp_data, BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX);
+               tmp_str = NULL;
 
-       BT_DBG("Address: %s, RSSI: %d, adv_ind_len: %d, scan_resp_len: %d",
-                       address, scan_result->rssi, adv_ind_len, scan_resp_len);
+               memset(adv_ind_data, 0x00, sizeof(adv_ind_data));
+               memcpy(adv_ind_data, scan_result->adv_data, scan_result->adv_data_len);
+               adv_ind_len = scan_result->adv_data_len;
+
+               memset(scan_resp_data, 0x00, sizeof(scan_resp_data));
+               scan_resp_len = 0;
+
+               tmp_str = _bt_service_convert_hex_to_string(adv_ind_data, adv_ind_len);
+               g_free(tmp_str);
+               tmp_str = NULL;
+
+       } else {
+               memset(adv_ind_data, 0x00, sizeof(adv_ind_data));
+               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 = 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);
+       }
        for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
                scanner = l->data;
                if (scanner->is_scanning == FALSE)
                        continue;
+               if(scanner->scan_settings.role != 0) {
+                       if(scanner->scan_settings.role == 1 && scan_result->is_extended == TRUE)
+                                continue;
 
+                        if(scanner->scan_settings.role == 2 && scan_result->is_extended == FALSE)
+                                continue;
+               }
+
+               if(scanner->scan_settings.phy != 0 && scan_result->primary_phy != scanner->scan_settings.phy)
+                        continue;
                if (__bt_check_scan_result_with_filter(address, scan_result->rssi, (const char *)adv_ind_data,
                                adv_ind_len, (const char *)scan_resp_data, scan_resp_len, scanner) == FALSE)
                        continue;
@@ -959,9 +996,14 @@ static void __bt_le_handle_device_found(event_ble_scan_result_info *scan_result)
                scan_data_param = g_variant_new_from_data((const GVariantType *)"ay",
                                scan_resp_data, scan_resp_len, TRUE, NULL, NULL);
 
-               param = g_variant_new("(isnnn@ayn@ay)",
-                               result, address,
-                               scan_result->addr_type, scan_result->rssi,
+               param = g_variant_new("(isnniiiiiiin@ayn@ay)",
+                               result, address, scan_result->addr_type,
+                               scan_result->rssi, scan_result->event_type,
+                               scan_result->primary_phy,
+                               scan_result->secondary_phy, scan_result->advertising_sid,
+                               scan_result->tx_power,
+                               scan_result->periodic_adv_int,
+                               scan_result->is_extended,
                                adv_ind_len, adv_data_param,
                                scan_resp_len, scan_data_param);
 
@@ -2083,6 +2125,8 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
                        return BLUETOOTH_ERROR_MEMORY_ALLOCATION;
 
                scanner->sender = g_strdup(sender);
+               scanner->scan_settings.role = 1; //TODO : Change to 0 once LE_EXTENDED feature is supported
+               scanner->scan_settings.phy = 1; //TODO : Change to 0 once LE_EXTENDED feature is supported
                scanner_list = g_slist_append(scanner_list, scanner);
        }
 
@@ -2096,6 +2140,55 @@ int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *fil
        return ret;
 }
 
+int _bt_set_scan_phy(const char* sender, int phy)
+{
+       int ret = BLUETOOTH_ERROR_NONE;
+       bt_adapter_le_scanner_t *scanner = NULL;
+
+       scanner = __bt_find_scanner_from_list(sender);
+
+       if (scanner == NULL) {
+               scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
+
+               if (scanner == NULL)
+                       return BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+
+               scanner->sender = g_strdup(sender);
+               scanner->scan_settings.phy = phy;
+               scanner->scan_settings.role = 0;
+               scanner_list = g_slist_append(scanner_list, scanner);
+       }
+
+       else
+               scanner->scan_settings.phy = phy;
+       return ret;
+}
+
+int _bt_set_scan_role(const char* sender, int role)
+{
+       int ret = BLUETOOTH_ERROR_NONE;
+       bt_adapter_le_scanner_t *scanner = NULL;
+
+       scanner = __bt_find_scanner_from_list(sender);
+
+       if (scanner == NULL) {
+               scanner = g_malloc0(sizeof(bt_adapter_le_scanner_t));
+
+               if (scanner == NULL)
+                       return BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+
+               scanner->sender = g_strdup(sender);
+               scanner->scan_settings.role = role;
+               scanner->scan_settings.phy = 0;
+               scanner_list = g_slist_append(scanner_list, scanner);
+       }
+
+       else
+               scanner->scan_settings.role = role;
+
+       return ret;
+}
+
 int _bt_unregister_all_scan_filters(const char* sender)
 {
        int ret;
@@ -2138,6 +2231,8 @@ int _bt_start_le_scan(const char *sender, uid_t uid, pid_t pid)
                scanner->sender = g_strdup(sender);
                scanner->uid = uid;
                scanner->pid = pid;
+               scanner->scan_settings.role = 1; //TODO : Change to 0 once LE_EXTENDED feature is supported
+               scanner->scan_settings.phy = 1; //TODO : Change to 0 once LE_EXTENDED feature is supported
                scanner_list = g_slist_append(scanner_list, scanner);
        }
 
index 4b7e868..3efec07 100644 (file)
@@ -3438,6 +3438,24 @@ normal:
                result = _bt_disconnect_device(&address);
                break;
        }
+       case BT_SET_SCANNING_PHY: {
+               int phy = 0;
+               sender = (char*)g_dbus_method_invocation_get_sender(context);
+               __bt_service_get_parameters(in_param1, &phy, sizeof(int));
+
+               result = _bt_set_scan_phy(sender, phy);
+
+               break;
+       }
+       case BT_SET_SCANNING_ROLE: {
+               int role = 0;
+               sender = (char*)g_dbus_method_invocation_get_sender(context);
+               __bt_service_get_parameters(in_param1, &role, sizeof(int));
+
+               result = _bt_set_scan_role(sender, role);
+
+               break;
+       }
        case BT_REGISTER_SCAN_FILTER: {
                bluetooth_le_scan_filter_t scan_filter;
 
@@ -5784,6 +5802,8 @@ gboolean __bt_service_check_privilege(int function_name,
        case BT_IS_ADVERTISING:
        case BT_IS_LE_2M_PHY_SUPPORTED:
        case BT_IS_LE_CODED_PHY_SUPPORTED:
+       case BT_SET_SCANNING_ROLE:
+       case BT_SET_SCANNING_PHY:
        case BT_IS_LE_EXTENDED_ADVERTISING_SUPPORTED:
        case BT_IS_LE_EXTENDED_SCAN_SUPPORTED:
        case BT_LE_MAX_ADVERTISING_DATA_LEN:
index a9f9f38..3c82ca4 100644 (file)
@@ -132,6 +132,10 @@ int _bt_set_manufacturer_data(bluetooth_manufacturer_data_t *m_data);
 int _bt_unregister_all_scan_filters(const char *sender);
 
 int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter);
+
+int _bt_set_scan_phy(const char* sender, int phy);
+
+int _bt_set_scan_role(const char* sender, int role);
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 53e232f..252c7d9 100644 (file)
@@ -45,6 +45,7 @@ extern "C" {
 #define BLUETOOTH_DEVICE_NAME_LENGTH_MAX       248 /**< This specifies maximum device name length */
 #define BLUETOOTH_DEVICE_PASSKEY_LENGTH_MAX       50 /**< This specifies maximum length of the passkey */
 #define BLUETOOTH_ADVERTISING_DATA_LENGTH_MAX  31 /**< This specifies maximum AD data length */
+#define BLUETOOTH_EXTENDED_ADVERTISING_DATA_LENGTH_MAX  255 /**< This specifies maximum AD data length */
 #define BLUETOOTH_SCAN_RESP_DATA_LENGTH_MAX    31 /**< This specifies maximum LE Scan response data length */
 #define BLUETOOTH_MANUFACTURER_DATA_LENGTH_MAX 240 /**< This specifies maximum manufacturer data length */
 #define BLUETOOTH_APPEARANCE_LENGTH 2 /**< This specifies bluetooth device appearance characteristic length */
@@ -641,6 +642,18 @@ typedef enum {
        BLUETOOTH_LE_ACTIVE_SCAN
 } bluetooth_le_scan_type_t;
 
+typedef enum {
+       BLUETOOTH_LE_SCAN_ALL = 0x00,
+       BLUETOOTH_LE_SCAN_LEGACY_ONLY,
+       BLUETOOTH_LE_SCAN_EXTENDED_ONLY
+} bluetooth_le_scan_role_t;
+
+typedef enum {
+       BLUETOOTH_ALL_PHY = 0x00,
+       BLUETOOTH_1M_PHY = 0x01,
+       BLUETOOTH_ONE_M_CODED_PHY = 0x03
+} bleutooth_le_scanning_phy_t;
+
 /*
        LE Connection Update
  */
@@ -1289,9 +1302,28 @@ typedef struct {
 } bluetooth_le_advertising_data_t;
 
 typedef struct {
+       guint8 data[BLUETOOTH_EXTENDED_ADVERTISING_DATA_LENGTH_MAX];
+} bluetooth_extended_advertising_data_t;
+
+typedef struct {
+       int data_len;           /**< manafacturer specific data length */
+       bluetooth_extended_advertising_data_t data;             /**< manafacturer specific data */
+} bluetooth_le_extended_advertising_data_t;
+
+typedef struct {
        bluetooth_device_address_t device_address;      /**< device address */
-       int addr_type;                  /**< address type*/
-       int rssi;                       /**< received strength signal*/
+       int addr_type;          /**< address type*/
+       int rssi;       /**< received strength signal*/
+       int event_type;
+       int primary_phy;
+       int secondary_phy;
+       int advertising_sid;
+       int tx_power;
+       int periodic_adv_int;
+       bool is_extended;
+       /* TODO : Replace bluetooth_le_advertising_data_t adv_ind_data with
+        * bluetooth_le_extended_advertising_data_t once
+        * LE_EXTENDED feature is supported */
        bluetooth_le_advertising_data_t adv_ind_data;
        bluetooth_le_advertising_data_t scan_resp_data;
 } bluetooth_le_device_info_t;
@@ -6381,6 +6413,46 @@ int bluetooth_set_scan_parameters(bluetooth_le_scan_params_t *params);
 int bluetooth_set_scan_type(bluetooth_le_scan_type_t scan_type);
 
 /**
+ * @fn intbluetooth_set_scan_phy(bleutooth_le_scanning_phy_t phy);
+ *ss
+ * @brief Set scan phy
+ *
+ * This function is used to set LE scan phy
+ *
+ * This function is a synchronous call.
+ *
+ * @return      BLUETOOTH_ERROR_NONE - Success \n
+ *              BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is not enabled \n
+ *              BLUETOOTH_ERROR_INTERNAL - Internal IPC error \n
+ *
+ * @exception   None
+ * @param[in]   phy - LE scanning PHY
+ *
+ * @remark      None
+ */
+int bluetooth_set_le_scan_phy(bleutooth_le_scanning_phy_t phy);
+
+/**
+ * @fn intbluetooth_set_scan_phy(bluetooth_le_scan_role_t role);
+ *ss
+ * @brief Set scan role
+ *
+ * This function is used to set LE scan role
+ *
+ * This function is a synchronous call.
+ *
+ * @return      BLUETOOTH_ERROR_NONE - Success \n
+ *              BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Adapter is not enabled \n
+ *              BLUETOOTH_ERROR_INTERNAL - Internal IPC error \n
+ *
+ * @exception   None
+ * @param[in]   role - LE scanning role
+ *
+ * @remark      None
+ */
+int bluetooth_set_le_scan_role(bluetooth_le_scan_role_t role);
+
+/**
  * @fn int bluetooth_is_advertising(void)
  * @brief Check for the advertising is in-progress or not.
  *
index ebae2df..a6fa094 100644 (file)
@@ -188,6 +188,8 @@ typedef enum {
        BT_START_CUSTOM_DISCOVERY,
        BT_CANCEL_DISCOVERY,
        BT_START_LE_DISCOVERY,
+       BT_SET_SCANNING_PHY,
+       BT_SET_SCANNING_ROLE,
        BT_STOP_LE_DISCOVERY,
        BT_IS_DISCOVERYING,
        BT_IS_LE_DISCOVERYING,