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>
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;
{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"},
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;
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)
_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++)
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));
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;
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];
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);
}
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);
/** 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 */
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];
/* 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);
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;
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;
#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;
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;
_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;
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);
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);
}
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;
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);
}
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;
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:
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 */
#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 */
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
*/
} 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;
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.
*
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,