return result;
}
-BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
+BT_EXPORT_API int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter)
{
int result;
result = _bt_send_request(BT_BLUEZ_SERVICE, BT_REGISTER_SCAN_FILTER,
in_param1, in_param2, in_param3, in_param4, &out_param);
- if (result == BLUETOOTH_ERROR_NONE)
- *slot_id = g_array_index(out_param, int, 0);
- else
- BT_ERR("Fail to send request");
-
- BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
- return result;
-}
-
-BT_EXPORT_API int bluetooth_unregister_scan_filter(int slot_id)
-{
- int result;
-
- BT_CHECK_ENABLED_ANY(return);
-
- BT_INIT_PARAMS();
- BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
- g_array_append_vals(in_param1, &slot_id, sizeof(int));
-
- result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_SCAN_FILTER,
- 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_unregister_all_scan_filters(void)
-{
- int result;
-
- BT_CHECK_ENABLED_ANY(return);
-
- BT_INIT_PARAMS();
- BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
-
- result = _bt_send_request(BT_BLUEZ_SERVICE, BT_UNREGISTER_ALL_SCAN_FILTERS,
- 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_REMOVE_WHITE_LIST, "BT_REMOVE_WHITE_LIST"},
{BT_CLEAR_WHITE_LIST, "BT_CLEAR_WHITE_LIST"},
{BT_REGISTER_SCAN_FILTER, "BT_REGISTER_SCAN_FILTER"},
- {BT_UNREGISTER_SCAN_FILTER, "BT_UNREGISTER_SCAN_FILTER"},
- {BT_UNREGISTER_ALL_SCAN_FILTERS, "BT_UNREGISTER_ALL_SCAN_FILTERS"},
{BT_IS_SCAN_FILTER_SUPPORTED, "BT_IS_SCAN_FILTER_SUPPORTED"},
{BT_GET_PROFILE_CONNECTED_DEVICES, "BT_GET_PROFILE_CONNECTED_DEVICES"},
{BT_ENABLE_FORCE_HCI_DUMP, "BT_ENABLE_FORCE_HCI_DUMP"},
char *sender;
GSList *filter_list;
gboolean is_scanning;
- gboolean stop_pending;
} bt_adapter_le_scanner_t;
GSList *scanner_list = NULL;
/******************************************* LE Scan *********************************************/
+static void __bt_free_le_scanner(bt_adapter_le_scanner_t *scanner)
+{
+ g_free(scanner->sender);
+ g_slist_free_full(scanner->filter_list, g_free);
+ g_free(scanner);
+}
+
+static void __bt_free_le_scanner_all(void)
+{
+ g_slist_free_full(scanner_list, (GDestroyNotify)__bt_free_le_scanner);
+ scanner_list = NULL;
+
+ is_le_scanning = FALSE;
+ is_le_set_scan_parameter = FALSE;
+ le_scan_params.type = BT_LE_ACTIVE_SCAN;
+ le_scan_params.interval = 0;
+ le_scan_params.window = 0;
+}
+
void _bt_adapter_set_le_status(bt_le_status_t status)
{
BT_INFO("adapter_le_state changed [%d] -> [%d]", adapter_le_state, status);
}
}
-int _bt_unregister_scan_filter(const char *sender, int slot_id)
-{
- int ret;
- bt_adapter_le_scanner_t *scanner = NULL;
- bluetooth_le_scan_filter_t *scan_filter_data = NULL;
- GSList *l;
- gboolean is_slot_id_found = FALSE;
-
- scanner = __bt_find_scanner_from_list(sender);
- if (scanner == NULL) {
- BT_ERR("There is NO available scanner.");
- return BLUETOOTH_ERROR_NOT_FOUND;
- }
-
- for (l = scanner->filter_list; l != NULL; l = g_slist_next(l)) {
- scan_filter_data = l->data;
- if (scan_filter_data->slot_id == slot_id) {
- is_slot_id_found = TRUE;
- break;
- }
- }
- if (is_slot_id_found == FALSE) {
- BT_ERR("There is NO registered slot.");
- return BLUETOOTH_ERROR_NOT_FOUND;
- }
- ret = gattc_unregister_scan_filter(slot_id);
- if (OAL_STATUS_SUCCESS != ret) {
- BT_ERR("gattc_unregister_scan_filter failed");
- return BLUETOOTH_ERROR_INTERNAL;
- }
- scanner->filter_list = g_slist_remove(scanner->filter_list, scan_filter_data);
- g_free(scan_filter_data);
- return BLUETOOTH_ERROR_NONE;
-}
-
-int _bt_unregister_all_scan_filters(const char* sender)
-{
- int ret;
- bt_adapter_le_scanner_t *scanner = NULL;
- bluetooth_le_scan_filter_t *filter_data = NULL;
- GSList *l;
-
- scanner = __bt_find_scanner_from_list(sender);
-
- if (scanner == NULL) {
- BT_ERR("There is NO available scanner.");
- return BLUETOOTH_ERROR_NOT_FOUND;
- }
- for (l = scanner->filter_list; l != NULL; l = g_slist_next(l)) {
- filter_data = l->data;
-
- ret = gattc_unregister_scan_filter(filter_data->slot_id);
-
- if (OAL_STATUS_SUCCESS != ret)
- BT_ERR("gattc_unregister_scan_filter failed for slot_id = [%d]", filter_data->slot_id);
- }
-
- g_slist_free_full(scanner->filter_list, g_free);
- scanner->filter_list = NULL;
-
- return BLUETOOTH_ERROR_NONE;
-}
-
int _bt_le_init(void)
{
BT_DBG("+");
return FALSE;
}
-static gboolean __start_le_scan_timeout(gpointer user_data)
+static int __bt_get_available_scan_filter_slot_id(void)
+{
+ GSList *l;
+ bt_adapter_le_scanner_t *scanner;
+ GSList *fl;
+ bluetooth_le_scan_filter_t *filter_data;
+ gboolean *slot_check_list = NULL;
+ int i;
+
+ if (le_feature_info.max_filter == 0) {
+ BT_ERR("Scan filter is NOT Supported");
+ return -1;
+ }
+ slot_check_list = g_malloc0(sizeof(gboolean) * le_feature_info.max_filter);
+
+ for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
+ scanner = l->data;
+ for (fl = scanner->filter_list; fl != NULL; fl = g_slist_next(fl)) {
+ filter_data = fl->data;
+ if (filter_data->slot_id < le_feature_info.max_filter)
+ slot_check_list[filter_data->slot_id] = TRUE;
+ }
+ }
+
+ for (i = 0; i < le_feature_info.max_filter; i++) {
+ if (slot_check_list[i] == FALSE) {
+ g_free(slot_check_list);
+ return i;
+ }
+ }
+
+ BT_ERR("There is NO available slot for scan filter.");
+ g_free(slot_check_list);
+ return -1;
+}
+
+int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter)
{
- char *sender = (char *)user_data;
- _bt_start_le_scan(sender);
+ int ret = BLUETOOTH_ERROR_NONE;
+ bt_adapter_le_scanner_t *scanner = NULL;
+ bluetooth_le_scan_filter_t *scan_filter_data = NULL;
+ int slot_id;
- return FALSE;
+ slot_id = __bt_get_available_scan_filter_slot_id();
+ if (slot_id == -1)
+ return BLUETOOTH_ERROR_NO_RESOURCES;
+
+ oal_ble_scan_filter_t filter_data = {.slot_id = slot_id, .device_address = (bt_address_t*)&filter->device_address, .device_name = filter->device_name,
+ .service_uuid = (oal_uuid_t*)&filter->service_uuid.data, .service_uuid_len = filter->service_uuid.data_len,
+ .service_uuid_mask = (oal_uuid_t*)&filter->service_uuid_mask.data, .service_uuid_mask_len = filter->service_uuid_mask.data_len,
+ .service_solicitation_uuid = (oal_uuid_t*)&filter->service_solicitation_uuid.data,
+ .service_solicitation_uuid_len = filter->service_solicitation_uuid.data_len,
+ .service_solicitation_uuid_mask = (oal_uuid_t*)&filter->service_solicitation_uuid_mask.data,
+ .service_solicitation_uuid_mask_len = filter->service_solicitation_uuid_mask.data_len,
+ .service_data = filter->service_data.data.data, .service_data_len = filter->service_data.data_len,
+ .service_data_mask = filter->service_data_mask.data.data, .service_data_mask_len = filter->service_data_mask.data_len,
+ .manufacturer_id = filter->manufacturer_id, .manufacturer_data = filter->manufacturer_data.data.data,
+ .manufacturer_data_len = filter->manufacturer_data.data_len, .manufacturer_data_mask = filter->manufacturer_data_mask.data.data,
+ .manufacturer_data_mask_len = filter->manufacturer_data_mask.data_len , .added_features = filter->added_features
+ };
+ ret = gattc_register_scan_filter(&filter_data);
+
+ if (OAL_STATUS_SUCCESS != ret) {
+ BT_ERR("gattc_register_scan_filter failed");
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ 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_list = g_slist_append(scanner_list, scanner);
+ }
+
+ scan_filter_data = g_malloc0(sizeof(bluetooth_le_scan_filter_t));
+
+ memcpy(scan_filter_data, filter, sizeof(bluetooth_le_scan_filter_t));
+
+ scan_filter_data->slot_id = slot_id;
+ scanner->filter_list = g_slist_append(scanner->filter_list, scan_filter_data);
+
+ return ret;
+}
+
+int _bt_unregister_all_scan_filters(const char* sender)
+{
+ int ret;
+ bt_adapter_le_scanner_t *scanner = NULL;
+ bluetooth_le_scan_filter_t *filter_data = NULL;
+ GSList *l;
+
+ scanner = __bt_find_scanner_from_list(sender);
+
+ if (scanner == NULL) {
+ BT_ERR("There is NO available scanner.");
+ return BLUETOOTH_ERROR_NOT_FOUND;
+ }
+ for (l = scanner->filter_list; l != NULL; l = g_slist_next(l)) {
+ filter_data = l->data;
+
+ ret = gattc_unregister_scan_filter(filter_data->slot_id);
+
+ if (OAL_STATUS_SUCCESS != ret)
+ BT_ERR("gattc_unregister_scan_filter failed for slot_id = [%d]", filter_data->slot_id);
+ }
+
+ g_slist_free_full(scanner->filter_list, g_free);
+ scanner->filter_list = NULL;
+
+ return BLUETOOTH_ERROR_NONE;
}
int _bt_start_le_scan(const char *sender)
scanner_list = g_slist_append(scanner_list, scanner);
}
- /* Check scanning is finished or not */
- if (scanner->stop_pending == TRUE) {
- BT_DBG("Waiting LEDiscoveryFinished");
- g_timeout_add(500, (GSourceFunc)__start_le_scan_timeout, scanner->sender);
- return BLUETOOTH_ERROR_NONE;
- }
-
/* Check scanning is in progress or not */
if (scanner->is_scanning) {
BT_ERR("BT is already in LE scanning");
_bt_set_scan_parameters(&le_scan_params);
}
+// TODO: Enable scan filter
BT_INFO("Start LE Full Scan");
ret = gattc_start_le_discovery(g_gatt_client_id);
int _bt_stop_le_scan(const char *sender)
{
- bt_adapter_le_scanner_t *scan_sender;
+ int result = BLUETOOTH_ERROR_NONE;
bt_adapter_le_scanner_t *scanner;
gboolean next_scanning = FALSE;
GSList *l;
int ret;
/* Check scanning is in progress or not */
- scan_sender = __bt_find_scanner_from_list(sender);
- if (scan_sender == NULL || scan_sender->is_scanning == FALSE)
+ scanner = __bt_find_scanner_from_list(sender);
+ if (scanner == NULL || scanner->is_scanning == FALSE)
return BLUETOOTH_ERROR_NOT_IN_OPERATION;
- scan_sender->is_scanning = FALSE;
- scan_sender->stop_pending = TRUE;
+ scanner->is_scanning = FALSE;
for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
scanner = l->data;
int value = 0;
g_idle_add(__send_le_scan_reply, (void *)(intptr_t)value);
- return BLUETOOTH_ERROR_NONE;
+ result = BLUETOOTH_ERROR_NONE;
} else {
BT_INFO("Just stop LE scan");
- }
+ ret = gattc_stop_le_discovery(g_gatt_client_id);
+
+ if (OAL_STATUS_SUCCESS != ret) {
+ BT_ERR("gattc_start_le_discovery failed");
+ result = BLUETOOTH_ERROR_INTERNAL;
+ }
- ret = gattc_stop_le_discovery(g_gatt_client_id);
+// TODO: Disable scan filter
+ is_le_set_scan_parameter = FALSE;
- if (OAL_STATUS_SUCCESS != ret) {
- BT_ERR("gattc_start_le_discovery failed");
- scan_sender->stop_pending = FALSE;
- return BLUETOOTH_ERROR_INTERNAL;
+ le_scan_params.type = BT_LE_ACTIVE_SCAN;
+ le_scan_params.interval = 0;
+ le_scan_params.window = 0;
}
- is_le_set_scan_parameter = FALSE;
+ _bt_unregister_all_scan_filters(sender);
- le_scan_params.type = BT_LE_ACTIVE_SCAN;
- le_scan_params.interval = 0;
- le_scan_params.window = 0;
+ scanner_list = g_slist_remove(scanner_list, scanner);
+ __bt_free_le_scanner(scanner);
- return BLUETOOTH_ERROR_NONE;
+ return result;
}
static void _bt_disable_all_scanner_status(void)
for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
scanner = l->data;
scanner->is_scanning = FALSE;
- scanner->stop_pending = FALSE;
}
}
-static void __bt_free_le_scanner(void)
-{
- GSList *l;
- bt_adapter_le_scanner_t *scanner;
-
- for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
- scanner = l->data;
- g_free(scanner->sender);
- g_slist_free_full(scanner->filter_list, g_free);
- g_free(scanner);
- }
-
- g_slist_free(scanner_list);
- scanner_list = NULL;
-
- is_le_scanning = FALSE;
- is_le_set_scan_parameter = FALSE;
- le_scan_params.type = BT_LE_ACTIVE_SCAN;
- le_scan_params.interval = 0;
- le_scan_params.window = 0;
-}
-
void _bt_check_le_scanner_app_termination(const char *sender)
{
bt_adapter_le_scanner_t *scanner;
g_free(scanner);
}
-int __bt_get_available_scan_filter_slot_id(void)
-{
- GSList *l;
- bt_adapter_le_scanner_t *scanner;
- GSList *fl;
- bluetooth_le_scan_filter_t *filter_data;
- gboolean *slot_check_list = NULL;
- int i;
-
- if (le_feature_info.max_filter == 0) {
- BT_ERR("Scan filter is NOT Supported");
- return -1;
- }
- slot_check_list = g_malloc0(sizeof(gboolean) * le_feature_info.max_filter);
-
- for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
- scanner = l->data;
- for (fl = scanner->filter_list; fl != NULL; fl = g_slist_next(fl)) {
- filter_data = fl->data;
- if (filter_data->slot_id < le_feature_info.max_filter)
- slot_check_list[filter_data->slot_id] = TRUE;
- }
- }
-
- for (i = 0; i < le_feature_info.max_filter; i++) {
- if (slot_check_list[i] == FALSE) {
- g_free(slot_check_list);
- return i;
- }
- }
-
- BT_ERR("There is NO available slot for scan filter.");
- g_free(slot_check_list);
- return -1;
-}
-
-int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id)
-{
- int ret = BLUETOOTH_ERROR_NONE;
- bt_adapter_le_scanner_t *scanner = NULL;
- bluetooth_le_scan_filter_t *scan_filter_data = NULL;
-
- *slot_id = __bt_get_available_scan_filter_slot_id();
-
- if (*slot_id == -1)
- return BLUETOOTH_ERROR_NO_RESOURCES;
-
- oal_ble_scan_filter_t filter_data = {.slot_id = *slot_id, .device_address = (bt_address_t*)&filter->device_address, .device_name = filter->device_name,
- .service_uuid = (oal_uuid_t*)&filter->service_uuid.data, .service_uuid_len = filter->service_uuid.data_len,
- .service_uuid_mask = (oal_uuid_t*)&filter->service_uuid_mask.data, .service_uuid_mask_len = filter->service_uuid_mask.data_len,
- .service_solicitation_uuid = (oal_uuid_t*)&filter->service_solicitation_uuid.data,
- .service_solicitation_uuid_len = filter->service_solicitation_uuid.data_len,
- .service_solicitation_uuid_mask = (oal_uuid_t*)&filter->service_solicitation_uuid_mask.data,
- .service_solicitation_uuid_mask_len = filter->service_solicitation_uuid_mask.data_len,
- .service_data = filter->service_data.data.data, .service_data_len = filter->service_data.data_len,
- .service_data_mask = filter->service_data_mask.data.data, .service_data_mask_len = filter->service_data_mask.data_len,
- .manufacturer_id = filter->manufacturer_id, .manufacturer_data = filter->manufacturer_data.data.data,
- .manufacturer_data_len = filter->manufacturer_data.data_len, .manufacturer_data_mask = filter->manufacturer_data_mask.data.data,
- .manufacturer_data_mask_len = filter->manufacturer_data_mask.data_len , .added_features = filter->added_features
- };
- ret = gattc_register_scan_filter(&filter_data);
-
- if (OAL_STATUS_SUCCESS != ret) {
- BT_ERR("gattc_register_scan_filter failed");
- return BLUETOOTH_ERROR_INTERNAL;
- }
-
- 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_list = g_slist_append(scanner_list, scanner);
- }
-
- scan_filter_data = g_malloc0(sizeof(bluetooth_le_scan_filter_t));
-
- memcpy(scan_filter_data, filter, sizeof(bluetooth_le_scan_filter_t));
-
- scan_filter_data->slot_id = *slot_id;
- scanner->filter_list = g_slist_append(scanner->filter_list, scan_filter_data);
-
- return ret;
-}
-
int _bt_service_le_init(void)
{
le_init();
void _bt_service_le_deinit(void)
{
le_deinit();
- __bt_free_le_scanner();
+ __bt_free_le_scanner_all();
}
int _bt_is_advertising(void)
g_array_append_vals(*out_param1, &is_coded_phy_supported, sizeof(gboolean));
break;
}
- case BT_UNREGISTER_SCAN_FILTER:{
- char *sender = NULL;
- int slot_id;
-
- sender = (char *)g_dbus_method_invocation_get_sender(context);
- __bt_service_get_parameters(in_param1, &slot_id, sizeof(int));
- BT_DBG("Remove scan filter [Slot ID : %d]", slot_id);
-
- result = _bt_unregister_scan_filter(sender, slot_id);
-
- break;
- }
- case BT_UNREGISTER_ALL_SCAN_FILTERS: {
- char *sender = NULL;
-
- sender = (char *)g_dbus_method_invocation_get_sender(context);
-
- BT_DBG("Remove all scan filters [Sender : %s]", sender);
-
- result = _bt_unregister_all_scan_filters(sender);
-
- break;
- }
case BT_DISCONNECT_DEVICE: {
bluetooth_device_address_t address = { {0} };
}
case BT_REGISTER_SCAN_FILTER: {
bluetooth_le_scan_filter_t scan_filter;
- int slot_id;
sender = (char*)g_dbus_method_invocation_get_sender(context);
__bt_service_get_parameters(in_param1, &scan_filter,
BT_DBG("bluetooth_le_scan_filter_t [features : 0x%.2x]",
scan_filter.added_features);
- result = _bt_register_scan_filter(sender, &scan_filter, &slot_id);
+ result = _bt_register_scan_filter(sender, &scan_filter);
- g_array_append_vals(*out_param1, &slot_id, sizeof(int));
break;
}
default:
case BT_IS_LE_2M_PHY_SUPPORTED:
case BT_IS_LE_CODED_PHY_SUPPORTED:
case BT_REGISTER_SCAN_FILTER:
- case BT_UNREGISTER_SCAN_FILTER:
- case BT_UNREGISTER_ALL_SCAN_FILTERS:
case BT_IS_SCAN_FILTER_SUPPORTED:
case BT_GET_ATT_MTU:
int _bt_set_manufacturer_data(bluetooth_manufacturer_data_t *m_data);
-int _bt_unregister_scan_filter(const char *sender, int slot_id);
-
int _bt_unregister_all_scan_filters(const char *sender);
-int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id);
+int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter);
#ifdef __cplusplus
}
#endif /* __cplusplus */
case BT_REGISTER_SCAN_FILTER: {
char *sender = NULL;
bluetooth_le_scan_filter_t scan_filter;
- int slot_id;
sender = (char *)g_dbus_method_invocation_get_sender(context);
__bt_service_get_parameters(in_param1, &scan_filter,
scan_filter.added_features);
result = _bt_register_scan_filter(sender,
- &scan_filter, &slot_id);
-
- g_array_append_vals(*out_param1, &slot_id, sizeof(int));
- break;
- }
- case BT_UNREGISTER_SCAN_FILTER:{
- char *sender = NULL;
- int slot_id;
-
- sender = (char *)g_dbus_method_invocation_get_sender(context);
- __bt_service_get_parameters(in_param1, &slot_id, sizeof(int));
- BT_DBG("Remove scan filter [Slot ID : %d]", slot_id);
-
- result = _bt_unregister_scan_filter(sender, slot_id);
-
- break;
- }
- case BT_UNREGISTER_ALL_SCAN_FILTERS:{
- char *sender = NULL;
-
- sender = (char *)g_dbus_method_invocation_get_sender(context);
-
- BT_DBG("Remove all scan filters [Sender : %s]", sender);
-
- result = _bt_unregister_all_scan_filters(sender);
+ &scan_filter);
break;
}
case BT_GET_SCAN_RESPONSE_DATA:
case BT_IS_ADVERTISING:
case BT_REGISTER_SCAN_FILTER:
- case BT_UNREGISTER_SCAN_FILTER:
- case BT_UNREGISTER_ALL_SCAN_FILTERS:
case BT_IS_SCAN_FILTER_SUPPORTED:
case BT_GET_PROFILE_RESTRICTED:
case BT_GET_ATT_MTU:
char *sender;
GSList *filter_list;
gboolean is_scanning;
- gboolean stop_pending;
} bt_adapter_le_scanner_t;
static bluetooth_advertising_params_t adv_params = {
le_adv_slot = NULL;
}
+static void __bt_free_le_scanner(bt_adapter_le_scanner_t *scanner)
+{
+ g_free(scanner->sender);
+ g_slist_free_full(scanner->filter_list, g_free);
+ g_free(scanner);
+}
+
+static void __bt_free_le_scanner_all(void)
+{
+ g_slist_free_full(scanner_list, (GDestroyNotify)__bt_free_le_scanner);
+ scanner_list = NULL;
+
+ scan_filter_enabled = FALSE;
+ is_le_scanning = FALSE;
+ is_le_set_scan_parameter = FALSE;
+ le_scan_params.type = BT_LE_ACTIVE_SCAN;
+ le_scan_params.interval = 0;
+ le_scan_params.window = 0;
+}
+
int _bt_le_set_max_packet_len(void)
{
int result = BLUETOOTH_ERROR_NONE;
return NULL;
}
-int __bt_get_available_scan_filter_slot_id(void)
+static int __bt_get_available_scan_filter_slot_id(void)
{
GSList *l;
bt_adapter_le_scanner_t *scanner;
return FALSE;
}
-int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id)
+int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter)
{
GDBusProxy *proxy;
GError *error = NULL;
bt_adapter_le_scanner_t *scanner = NULL;
bluetooth_le_scan_filter_t *filter_data = NULL;
int feature_selection = 0;
+ int slot_id;
- *slot_id = __bt_get_available_scan_filter_slot_id();
- if (*slot_id == -1)
+ slot_id = __bt_get_available_scan_filter_slot_id();
+ if (slot_id == -1)
return BLUETOOTH_ERROR_NO_RESOURCES;
proxy = _bt_get_adapter_proxy();
0, // client_if
0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_ADDRESS, // filter_type
- *slot_id, // filter_index
+ slot_id, // filter_index
0, // company_id
0, // company_id_mask
arr_uuid_param, // p_uuid
0, // client_if
0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
BLUETOOTH_LE_SCAN_FILTER_FEATURE_DEVICE_NAME, // filter_type
- *slot_id, // filter_index
+ slot_id, // filter_index
0, // company_id
0, // company_id_mask
arr_uuid_param, // p_uuid
0, // client_if
0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_UUID, // filter_type
- *slot_id, // filter_index
+ slot_id, // filter_index
0, // company_id
0, // company_id_mask
arr_uuid_param, // p_uuid
0, // client_if
0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_SOLICITATION_UUID, // filter_type
- *slot_id, // filter_index
+ slot_id, // filter_index
0, // company_id
0, // company_id_mask
arr_uuid_param, // p_uuid
0, // client_if
0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
BLUETOOTH_LE_SCAN_FILTER_FEATURE_SERVICE_DATA, // filter_type
- *slot_id, // filter_index
+ slot_id, // filter_index
0, // company_id
0, // company_id_mask
arr_uuid_param, // p_uuid
0, // client_if
0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
BLUETOOTH_LE_SCAN_FILTER_FEATURE_MANUFACTURER_DATA, // filter_type
- *slot_id, // filter_index
+ slot_id, // filter_index
filter->manufacturer_id, // company_id
0xFFFF, // company_id_mask
arr_uuid_param, // p_uuid
param = g_variant_new("(iiiiiiiiiiii)",
0, // client_if
0, // action (Add - 0x00, Delete - 0x01, Clear - 0x02)
- *slot_id, // filter_index
+ slot_id, // filter_index
feature_selection, // feat_seln
0, // list_logic_type (OR - 0x00, AND - 0x01)
1, // filt_logic_type (OR - 0x00, AND - 0x01)
if (scanner) {
filter_data = g_malloc0(sizeof(bluetooth_le_scan_filter_t));
memcpy(filter_data, filter, sizeof(bluetooth_le_scan_filter_t));
- filter_data->slot_id = *slot_id;
+ filter_data->slot_id = slot_id;
scanner->filter_list = g_slist_append(scanner->filter_list, filter_data);
}
return BLUETOOTH_ERROR_NONE;
}
-int _bt_unregister_scan_filter(const char *sender, int slot_id)
-{
- GDBusProxy *proxy;
- GError *error = NULL;
- GVariant *ret;
- bt_adapter_le_scanner_t *scanner = NULL;
- bluetooth_le_scan_filter_t *filter_data = NULL;
- GSList *l;
- gboolean is_slot_id_found = FALSE;
-
- scanner = __bt_find_scanner_from_list(sender);
- if (scanner == NULL) {
- BT_ERR("There is NO available scanner.");
- return BLUETOOTH_ERROR_NOT_FOUND;
- }
-
- for (l = scanner->filter_list; l != NULL; l = g_slist_next(l)) {
- filter_data = l->data;
- if (filter_data->slot_id == slot_id) {
- is_slot_id_found = TRUE;
- break;
- }
- }
- if (is_slot_id_found == FALSE) {
- BT_ERR("There is NO registered slot.");
- return BLUETOOTH_ERROR_NOT_FOUND;
- }
-
- proxy = _bt_get_adapter_proxy();
- retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
-
- ret = g_dbus_proxy_call_sync(proxy, "scan_filter_clear",
- g_variant_new("(ii)", 0, slot_id),
- G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, &error);
-
- if (error) {
- BT_ERR("scan_filter_clear Fail: %s", error->message);
- g_clear_error(&error);
- }
-
- scanner->filter_list = g_slist_remove(scanner->filter_list, filter_data);
- g_free(filter_data);
-
- if (ret)
- g_variant_unref(ret);
- return BLUETOOTH_ERROR_NONE;
-}
-
int _bt_unregister_all_scan_filters(const char *sender)
{
GDBusProxy *proxy;
return BLUETOOTH_ERROR_NONE;
}
-static gboolean __start_le_scan_timeout(gpointer user_data)
-{
- char *sender = (char *)user_data;
- _bt_start_le_scan(sender);
-
- return FALSE;
-}
-
-
int _bt_start_le_scan(const char *sender)
{
GDBusProxy *proxy;
scanner_list = g_slist_append(scanner_list, scanner);
}
- if (scanner->stop_pending == TRUE) {
- BT_DBG("Waiting LEDiscoveryFinished");
- g_timeout_add(500, (GSourceFunc)__start_le_scan_timeout, scanner->sender);
- return BLUETOOTH_ERROR_NONE;
- }
-
if (scanner->is_scanning == TRUE) {
BT_ERR("BT is already in LE scanning");
return BLUETOOTH_ERROR_IN_PROGRESS;
GDBusProxy *proxy;
GError *error = NULL;
GVariant *ret;
- bt_adapter_le_scanner_t *scan_sender = __bt_find_scanner_from_list(sender);
- bt_adapter_le_scanner_t *scanner;
+ bt_adapter_le_scanner_t *scanner = __bt_find_scanner_from_list(sender);
GSList *l;
gboolean next_scanning = FALSE;
gboolean need_scan_filter = TRUE;
- if (scan_sender == NULL || scan_sender->is_scanning == FALSE)
+ if (scanner == NULL || scanner->is_scanning == FALSE)
return BLUETOOTH_ERROR_NOT_IN_OPERATION;
- scan_sender->is_scanning = FALSE;
- scan_sender->stop_pending = TRUE;
+ _bt_unregister_all_scan_filters(sender);
+
+ scanner_list = g_slist_remove(scanner_list, scanner);
+ __bt_free_le_scanner(scanner);
for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
scanner = l->data;
scan_filter_enabled = TRUE;
}
BT_INFO("next_scanning exists. Keep the LE scanning");
- scan_sender->stop_pending = FALSE;
return BLUETOOTH_ERROR_NONE;
} else {
if (scan_filter_enabled == TRUE) {
for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
scanner = l->data;
scanner->is_scanning = FALSE;
- scanner->stop_pending = FALSE;
}
}
-static void __bt_free_le_scanner(void)
-{
- GSList *l;
- bt_adapter_le_scanner_t *scanner;
-
- for (l = scanner_list; l != NULL; l = g_slist_next(l)) {
- scanner = l->data;
- g_free(scanner->sender);
- g_slist_free_full(scanner->filter_list, g_free);
- g_free(scanner);
- }
-
- g_slist_free(scanner_list);
- scanner_list = NULL;
-
- scan_filter_enabled = FALSE;
- is_le_scanning = FALSE;
- is_le_set_scan_parameter = FALSE;
- le_scan_params.type = BT_LE_ACTIVE_SCAN;
- le_scan_params.interval = 0;
- le_scan_params.window = 0;
-}
-
void _bt_set_le_scan_status(gboolean mode)
{
BT_DBG("set is_le_scanning : %d -> %d", is_le_scanning, mode);
void _bt_service_adapter_le_deinit(void)
{
__bt_free_le_adv_slot();
- __bt_free_le_scanner();
+ __bt_free_le_scanner_all();
}
{BT_REMOVE_WHITE_LIST, "BT_REMOVE_WHITE_LIST"},
{BT_CLEAR_WHITE_LIST, "BT_CLEAR_WHITE_LIST"},
{BT_REGISTER_SCAN_FILTER, "BT_REGISTER_SCAN_FILTER"},
- {BT_UNREGISTER_SCAN_FILTER, "BT_UNREGISTER_SCAN_FILTER"},
- {BT_UNREGISTER_ALL_SCAN_FILTERS, "BT_UNREGISTER_ALL_SCAN_FILTERS"},
{BT_IS_SCAN_FILTER_SUPPORTED, "BT_IS_SCAN_FILTER_SUPPORTED"},
{BT_GET_PROFILE_CONNECTED_DEVICES, "BT_GET_PROFILE_CONNECTED_DEVICES"},
{BT_ENABLE_FORCE_HCI_DUMP, "BT_ENABLE_FORCE_HCI_DUMP"},
gboolean _bt_is_scan_filter_supported(void);
-int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter, int *slot_id);
-
-int _bt_unregister_scan_filter(const char *sender, int slot_id);
+int _bt_register_scan_filter(const char *sender, bluetooth_le_scan_filter_t *filter);
int _bt_unregister_all_scan_filters(const char *sender);
int bluetooth_force_hcidump(int timeout);
/**
- * @fn int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id)
+ * @fn int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter)
* @brief Register scan filter.
*
* This function registers the scan filter.
* @return BLUETOOTH_ERROR_NONE - Success \n
*
* @param[in] filter scan filter to register
- * @param[out] slot_id the slot ID of scan filter
*
* @remark None
*/
-int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter, int *slot_id);
-
-/**
- * @fn int bluetooth_unregister_scan_filter(int slot_id)
- * @brief Register scan filter.
- *
- * This function unregisters the scan filter.
- *
- * This function is a synchronous call.
- *
- * @return BLUETOOTH_ERROR_NONE - Success \n
- *
- * @param[in] slot_id the slot ID of scan filter
- *
- * @remark None
- */
-int bluetooth_unregister_scan_filter(int slot_id);
-
-/**
- * @fn int bluetooth_unregister_all_scan_filters(void)
- * @brief Register scan filter.
- *
- * This function usregisters all scan filters.
- *
- * This function is a synchronous call.
- *
- * @return BLUETOOTH_ERROR_NONE - Success \n
- *
- * @remark None
- */
-int bluetooth_unregister_all_scan_filters(void);
+int bluetooth_register_scan_filter(bluetooth_le_scan_filter_t *filter);
/**
* @fn int bluetooth_enable_rssi(const bluetooth_device_address_t *remote_address,
BT_REMOVE_WHITE_LIST,
BT_CLEAR_WHITE_LIST,
BT_REGISTER_SCAN_FILTER,
- BT_UNREGISTER_SCAN_FILTER,
- BT_UNREGISTER_ALL_SCAN_FILTERS,
BT_IS_SCAN_FILTER_SUPPORTED,
BT_GET_PROFILE_CONNECTED_DEVICES,
BT_ENABLE_FORCE_HCI_DUMP,