aboutsummaryrefslogtreecommitdiff
path: root/main/shim/le_scanning_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'main/shim/le_scanning_manager.cc')
-rw-r--r--main/shim/le_scanning_manager.cc513
1 files changed, 0 insertions, 513 deletions
diff --git a/main/shim/le_scanning_manager.cc b/main/shim/le_scanning_manager.cc
deleted file mode 100644
index ce987531f..000000000
--- a/main/shim/le_scanning_manager.cc
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "bt_shim_scanner"
-
-#include "le_scanning_manager.h"
-
-#include <base/bind.h>
-#include <base/threading/thread.h>
-#include <hardware/bluetooth.h>
-#include <stdio.h>
-#include <unordered_set>
-
-#include "btif/include/btif_common.h"
-#include "gd/hci/address.h"
-#include "gd/hci/le_scanning_manager.h"
-#include "gd/storage/device.h"
-#include "gd/storage/le_device.h"
-#include "gd/storage/storage_module.h"
-#include "main/shim/entry.h"
-#include "main/shim/helpers.h"
-#include "main/shim/shim.h"
-
-#include "advertise_data_parser.h"
-#include "stack/btm/btm_int_types.h"
-
-using bluetooth::ToRawAddress;
-using bluetooth::ToGdAddress;
-
-extern void btm_ble_process_adv_pkt_cont_for_inquiry(
- uint16_t event_type, uint8_t address_type, const RawAddress& raw_address,
- uint8_t primary_phy, uint8_t secondary_phy, uint8_t advertising_sid,
- int8_t tx_power, int8_t rssi, uint16_t periodic_adv_int,
- std::vector<uint8_t> advertising_data);
-
-extern void btif_dm_update_ble_remote_properties(const RawAddress& bd_addr,
- BD_NAME bd_name,
- tBT_DEVICE_TYPE dev_type);
-
-class BleScannerInterfaceImpl : public BleScannerInterface,
- public bluetooth::hci::ScanningCallback {
- public:
- ~BleScannerInterfaceImpl() override{};
-
- void Init() {
- LOG_INFO("init BleScannerInterfaceImpl");
- bluetooth::shim::GetScanning()->RegisterScanningCallback(this);
- }
-
- /** Registers a scanner with the stack */
- void RegisterScanner(const bluetooth::Uuid& uuid, RegisterCallback) {
- LOG(INFO) << __func__ << " in shim layer";
- auto app_uuid = bluetooth::hci::Uuid::From128BitBE(uuid.To128BitBE());
- bluetooth::shim::GetScanning()->RegisterScanner(app_uuid);
- }
-
- /** Unregister a scanner from the stack */
- void Unregister(int scanner_id) {
- LOG(INFO) << __func__ << " in shim layer, scanner_id:" << scanner_id;
- bluetooth::shim::GetScanning()->Unregister(scanner_id);
- }
-
- /** Start or stop LE device scanning */
- void Scan(bool start) {
- LOG(INFO) << __func__ << " in shim layer";
- bluetooth::shim::GetScanning()->Scan(start);
- init_address_cache();
- }
-
- /** Setup scan filter params */
- void ScanFilterParamSetup(
- uint8_t client_if, uint8_t action, uint8_t filter_index,
- std::unique_ptr<btgatt_filt_param_setup_t> filt_param,
- FilterParamSetupCallback cb) {
- LOG(INFO) << __func__ << " in shim layer";
-
- auto apcf_action = static_cast<bluetooth::hci::ApcfAction>(action);
- bluetooth::hci::AdvertisingFilterParameter advertising_filter_parameter;
-
- if (filt_param != nullptr) {
- if (filt_param && filt_param->dely_mode == 1) {
- bluetooth::shim::GetScanning()->TrackAdvertiser(client_if);
- }
- advertising_filter_parameter.feature_selection = filt_param->feat_seln;
- advertising_filter_parameter.list_logic_type =
- filt_param->list_logic_type;
- advertising_filter_parameter.filter_logic_type =
- filt_param->filt_logic_type;
- advertising_filter_parameter.rssi_high_thresh =
- filt_param->rssi_high_thres;
- advertising_filter_parameter.delivery_mode =
- static_cast<bluetooth::hci::DeliveryMode>(filt_param->dely_mode);
- if (filt_param && filt_param->dely_mode == 1) {
- advertising_filter_parameter.onfound_timeout =
- filt_param->found_timeout;
- advertising_filter_parameter.onfound_timeout_cnt =
- filt_param->found_timeout_cnt;
- advertising_filter_parameter.rssi_low_thres =
- filt_param->rssi_low_thres;
- advertising_filter_parameter.onlost_timeout = filt_param->lost_timeout;
- advertising_filter_parameter.num_of_tracking_entries =
- filt_param->num_of_tracking_entries;
- }
- }
-
- bluetooth::shim::GetScanning()->ScanFilterParameterSetup(
- apcf_action, filter_index, advertising_filter_parameter);
- // TODO refactor callback mechanism
- do_in_jni_thread(FROM_HERE,
- base::Bind(cb, 0, 0, btm_status_value(BTM_SUCCESS)));
- }
-
- /** Configure a scan filter condition */
- void ScanFilterAdd(int filter_index, std::vector<ApcfCommand> filters,
- FilterConfigCallback cb) {
- LOG(INFO) << __func__ << " in shim layer";
- std::vector<bluetooth::hci::AdvertisingPacketContentFilterCommand>
- new_filters = {};
- for (size_t i = 0; i < filters.size(); i++) {
- bluetooth::hci::AdvertisingPacketContentFilterCommand command{};
- if (!parse_filter_command(command, filters[i])) {
- LOG_ERROR("invalid apcf command");
- return;
- }
- new_filters.push_back(command);
- }
- bluetooth::shim::GetScanning()->ScanFilterAdd(filter_index, new_filters);
- do_in_jni_thread(FROM_HERE,
- base::Bind(cb, 0, 0, 0, btm_status_value(BTM_SUCCESS)));
- }
-
- /** Clear all scan filter conditions for specific filter index*/
- void ScanFilterClear(int filter_index, FilterConfigCallback cb) {
- LOG(INFO) << __func__ << " in shim layer";
- // This function doesn't used in java layer
- }
-
- /** Enable / disable scan filter feature*/
- void ScanFilterEnable(bool enable, EnableCallback cb) {
- LOG(INFO) << __func__ << " in shim layer";
- bluetooth::shim::GetScanning()->ScanFilterEnable(enable);
-
- uint8_t action = enable ? 1 : 0;
- do_in_jni_thread(FROM_HERE,
- base::Bind(cb, action, btm_status_value(BTM_SUCCESS)));
- }
-
- /** Sets the LE scan interval and window in units of N*0.625 msec */
- void SetScanParameters(int scan_interval, int scan_window, Callback cb) {
- LOG(INFO) << __func__ << " in shim layer";
- // use active scan
- auto scan_type = static_cast<bluetooth::hci::LeScanType>(0x01);
- bluetooth::shim::GetScanning()->SetScanParameters(scan_type, scan_interval,
- scan_window);
- do_in_jni_thread(FROM_HERE, base::Bind(cb, 0));
- }
-
- /* Configure the batchscan storage */
- void BatchscanConfigStorage(int client_if, int batch_scan_full_max,
- int batch_scan_trunc_max,
- int batch_scan_notify_threshold, Callback cb) {
- LOG(INFO) << __func__ << " in shim layer";
- bluetooth::shim::GetScanning()->BatchScanConifgStorage(
- batch_scan_full_max, batch_scan_trunc_max, batch_scan_notify_threshold,
- client_if);
- do_in_jni_thread(FROM_HERE, base::Bind(cb, btm_status_value(BTM_SUCCESS)));
- }
-
- /* Enable batchscan */
- virtual void BatchscanEnable(int scan_mode, int scan_interval,
- int scan_window, int addr_type, int discard_rule,
- Callback cb) {
- LOG(INFO) << __func__ << " in shim layer";
- auto batch_scan_mode =
- static_cast<bluetooth::hci::BatchScanMode>(scan_mode);
- auto batch_scan_discard_rule =
- static_cast<bluetooth::hci::BatchScanDiscardRule>(discard_rule);
- bluetooth::shim::GetScanning()->BatchScanEnable(
- batch_scan_mode, scan_window, scan_interval, batch_scan_discard_rule);
- do_in_jni_thread(FROM_HERE, base::Bind(cb, btm_status_value(BTM_SUCCESS)));
- }
-
- /* Disable batchscan */
- virtual void BatchscanDisable(Callback cb) {
- LOG(INFO) << __func__ << " in shim layer";
- bluetooth::shim::GetScanning()->BatchScanDisable();
- do_in_jni_thread(FROM_HERE, base::Bind(cb, btm_status_value(BTM_SUCCESS)));
- }
-
- /* Read out batchscan reports */
- void BatchscanReadReports(int client_if, int scan_mode) {
- LOG(INFO) << __func__ << " in shim layer";
- auto batch_scan_mode =
- static_cast<bluetooth::hci::BatchScanMode>(scan_mode);
- auto scanner_id = static_cast<bluetooth::hci::ScannerId>(client_if);
- bluetooth::shim::GetScanning()->BatchScanReadReport(scanner_id,
- batch_scan_mode);
- }
-
- void StartSync(uint8_t sid, RawAddress address, uint16_t skip,
- uint16_t timeout, StartSyncCb start_cb, SyncReportCb report_cb,
- SyncLostCb lost_cb) {
- LOG(INFO) << __func__ << " in shim layer";
- // This function doesn't implement in the old stack
- }
-
- void StopSync(uint16_t handle) {
- LOG(INFO) << __func__ << " in shim layer";
- // This function doesn't implement in the old stack
- }
-
- void RegisterCallbacks(ScanningCallbacks* callbacks) {
- LOG(INFO) << __func__ << " in shim layer";
- scanning_callbacks_ = callbacks;
- }
-
- void OnScannerRegistered(const bluetooth::hci::Uuid app_uuid,
- bluetooth::hci::ScannerId scanner_id,
- ScanningStatus status) {
- auto uuid = bluetooth::Uuid::From128BitBE(app_uuid.To128BitBE());
- do_in_jni_thread(FROM_HERE,
- base::Bind(&ScanningCallbacks::OnScannerRegistered,
- base::Unretained(scanning_callbacks_), uuid,
- scanner_id, status));
- }
-
- void OnScanResult(uint16_t event_type, uint8_t address_type,
- bluetooth::hci::Address address, uint8_t primary_phy,
- uint8_t secondary_phy, uint8_t advertising_sid,
- int8_t tx_power, int8_t rssi,
- uint16_t periodic_advertising_interval,
- std::vector<uint8_t> advertising_data) {
- RawAddress raw_address = ToRawAddress(address);
-
- do_in_jni_thread(
- FROM_HERE,
- base::BindOnce(&BleScannerInterfaceImpl::handle_remote_properties,
- base::Unretained(this), raw_address, address_type,
- advertising_data));
-
- do_in_jni_thread(
- FROM_HERE,
- base::BindOnce(&ScanningCallbacks::OnScanResult,
- base::Unretained(scanning_callbacks_), event_type,
- address_type, raw_address, primary_phy, secondary_phy,
- advertising_sid, tx_power, rssi,
- periodic_advertising_interval, advertising_data));
-
- // TODO: Remove when StartInquiry in GD part implemented
- btm_ble_process_adv_pkt_cont_for_inquiry(
- event_type, address_type, raw_address, primary_phy, secondary_phy,
- advertising_sid, tx_power, rssi, periodic_advertising_interval,
- advertising_data);
- }
-
- void OnTrackAdvFoundLost(bluetooth::hci::AdvertisingFilterOnFoundOnLostInfo
- on_found_on_lost_info) {
- AdvertisingTrackInfo track_info = {};
- RawAddress raw_address =
- ToRawAddress(on_found_on_lost_info.advertiser_address);
- track_info.advertiser_address = raw_address;
- track_info.advertiser_address_type =
- on_found_on_lost_info.advertiser_address_type;
- track_info.scanner_id = on_found_on_lost_info.scanner_id;
- track_info.filter_index = on_found_on_lost_info.filter_index;
- track_info.advertiser_state = on_found_on_lost_info.advertiser_state;
- track_info.advertiser_info_present =
- static_cast<uint8_t>(on_found_on_lost_info.advertiser_info_present);
- if (on_found_on_lost_info.advertiser_info_present ==
- bluetooth::hci::AdvtInfoPresent::ADVT_INFO_PRESENT) {
- track_info.tx_power = on_found_on_lost_info.tx_power;
- track_info.rssi = on_found_on_lost_info.rssi;
- track_info.time_stamp = on_found_on_lost_info.time_stamp;
- auto adv_data = on_found_on_lost_info.adv_packet;
- track_info.adv_packet_len = (uint8_t)adv_data.size();
- track_info.adv_packet.reserve(adv_data.size());
- track_info.adv_packet.insert(track_info.adv_packet.end(),
- adv_data.begin(), adv_data.end());
- auto scan_rsp_data = on_found_on_lost_info.scan_response;
- track_info.scan_response_len = (uint8_t)scan_rsp_data.size();
- track_info.scan_response.reserve(adv_data.size());
- track_info.scan_response.insert(track_info.scan_response.end(),
- scan_rsp_data.begin(),
- scan_rsp_data.end());
- }
- do_in_jni_thread(
- FROM_HERE,
- base::BindOnce(&ScanningCallbacks::OnTrackAdvFoundLost,
- base::Unretained(scanning_callbacks_), track_info));
- }
-
- void OnBatchScanReports(int client_if, int status, int report_format,
- int num_records, std::vector<uint8_t> data) {
- do_in_jni_thread(
- FROM_HERE,
- base::BindOnce(&ScanningCallbacks::OnBatchScanReports,
- base::Unretained(scanning_callbacks_), client_if, status,
- report_format, num_records, data));
- }
-
- void OnBatchScanThresholdCrossed(int client_if) {
- do_in_jni_thread(
- FROM_HERE,
- base::BindOnce(&ScanningCallbacks::OnBatchScanThresholdCrossed,
- base::Unretained(scanning_callbacks_), client_if));
- }
-
- void OnTimeout() {}
-
- void OnFilterEnable(bluetooth::hci::Enable enable, uint8_t status){};
-
- void OnFilterParamSetup(uint8_t available_spaces,
- bluetooth::hci::ApcfAction action, uint8_t status){};
-
- void OnFilterConfigCallback(bluetooth::hci::ApcfFilterType filter_type,
- uint8_t available_spaces,
- bluetooth::hci::ApcfAction action,
- uint8_t status){};
-
- ScanningCallbacks* scanning_callbacks_;
-
- private:
- bool parse_filter_command(
- bluetooth::hci::AdvertisingPacketContentFilterCommand&
- advertising_packet_content_filter_command,
- ApcfCommand apcf_command) {
- advertising_packet_content_filter_command.filter_type =
- static_cast<bluetooth::hci::ApcfFilterType>(apcf_command.type);
- bluetooth::hci::Address address = ToGdAddress(apcf_command.address);
- advertising_packet_content_filter_command.address = address;
- advertising_packet_content_filter_command.application_address_type =
- static_cast<bluetooth::hci::ApcfApplicationAddressType>(
- apcf_command.addr_type);
-
- if (!apcf_command.uuid.IsEmpty()) {
- uint8_t uuid_len = apcf_command.uuid.GetShortestRepresentationSize();
- switch (uuid_len) {
- case bluetooth::Uuid::kNumBytes16: {
- advertising_packet_content_filter_command.uuid =
- bluetooth::hci::Uuid::From16Bit(apcf_command.uuid.As16Bit());
- } break;
- case bluetooth::Uuid::kNumBytes32: {
- advertising_packet_content_filter_command.uuid =
- bluetooth::hci::Uuid::From32Bit(apcf_command.uuid.As32Bit());
- } break;
- case bluetooth::Uuid::kNumBytes128: {
- advertising_packet_content_filter_command.uuid =
- bluetooth::hci::Uuid::From128BitBE(
- apcf_command.uuid.To128BitBE());
- } break;
- default:
- LOG_WARN("illegal UUID length %d", (uint16_t)uuid_len);
- return false;
- }
- }
-
- if (!apcf_command.uuid_mask.IsEmpty()) {
- uint8_t uuid_len = apcf_command.uuid.GetShortestRepresentationSize();
- switch (uuid_len) {
- case bluetooth::Uuid::kNumBytes16: {
- advertising_packet_content_filter_command.uuid_mask =
- bluetooth::hci::Uuid::From16Bit(apcf_command.uuid_mask.As16Bit());
- } break;
- case bluetooth::Uuid::kNumBytes32: {
- advertising_packet_content_filter_command.uuid_mask =
- bluetooth::hci::Uuid::From32Bit(apcf_command.uuid_mask.As32Bit());
- } break;
- case bluetooth::Uuid::kNumBytes128: {
- advertising_packet_content_filter_command.uuid_mask =
- bluetooth::hci::Uuid::From128BitBE(
- apcf_command.uuid_mask.To128BitBE());
- } break;
- default:
- LOG_WARN("illegal UUID length %d", (uint16_t)uuid_len);
- return false;
- }
- }
-
- advertising_packet_content_filter_command.name.assign(
- apcf_command.name.begin(), apcf_command.name.end());
- advertising_packet_content_filter_command.company = apcf_command.company;
- advertising_packet_content_filter_command.company_mask =
- apcf_command.company_mask;
- advertising_packet_content_filter_command.data.assign(
- apcf_command.data.begin(), apcf_command.data.end());
- advertising_packet_content_filter_command.data_mask.assign(
- apcf_command.data_mask.begin(), apcf_command.data_mask.end());
- return true;
- }
-
- void handle_remote_properties(RawAddress bd_addr, tBLE_ADDR_TYPE addr_type,
- std::vector<uint8_t> advertising_data) {
- // skip anonymous advertisment
- if (addr_type == BLE_ADDR_ANONYMOUS) {
- return;
- }
-
- auto device_type = bluetooth::hci::DeviceType::LE;
- uint8_t flag_len;
- const uint8_t* p_flag = AdvertiseDataParser::GetFieldByType(
- advertising_data, BTM_BLE_AD_TYPE_FLAG, &flag_len);
- if (p_flag != NULL && flag_len != 0) {
- if ((BTM_BLE_BREDR_NOT_SPT & *p_flag) == 0) {
- device_type = bluetooth::hci::DeviceType::DUAL;
- }
- }
-
- uint8_t remote_name_len;
- const uint8_t* p_eir_remote_name = AdvertiseDataParser::GetFieldByType(
- advertising_data, BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
-
- if (p_eir_remote_name == NULL) {
- p_eir_remote_name = AdvertiseDataParser::GetFieldByType(
- advertising_data, BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
- }
-
- // update device name
- if ((addr_type != BLE_ADDR_RANDOM) || (p_eir_remote_name)) {
- if (!find_address_cache(bd_addr)) {
- add_address_cache(bd_addr);
-
- if (p_eir_remote_name) {
- if (remote_name_len > BD_NAME_LEN + 1 ||
- (remote_name_len == BD_NAME_LEN + 1 &&
- p_eir_remote_name[BD_NAME_LEN] != '\0')) {
- LOG_INFO("%s dropping invalid packet - device name too long: %d",
- __func__, remote_name_len);
- return;
- }
-
- bt_bdname_t bdname;
- memcpy(bdname.name, p_eir_remote_name, remote_name_len);
- if (remote_name_len < BD_NAME_LEN + 1)
- bdname.name[remote_name_len] = '\0';
-
- btif_dm_update_ble_remote_properties(bd_addr, bdname.name,
- device_type);
- }
- }
- }
- if (!bluetooth::shim::is_gd_stack_started_up()) {
- LOG_WARN("Gd stack is stopped, return");
- return;
- }
- auto* storage_module = bluetooth::shim::GetStorage();
- bluetooth::hci::Address address = ToGdAddress(bd_addr);
-
- // update device type
- auto mutation = storage_module->Modify();
- bluetooth::storage::Device device =
- storage_module->GetDeviceByLegacyKey(address);
- mutation.Add(device.SetDeviceType(device_type));
- mutation.Commit();
-
- // update address type
- auto mutation2 = storage_module->Modify();
- bluetooth::storage::LeDevice le_device = device.Le();
- mutation2.Add(
- le_device.SetAddressType((bluetooth::hci::AddressType)addr_type));
- mutation2.Commit();
- }
-
- void add_address_cache(const RawAddress& p_bda) {
- // Remove the oldest entries
- while (remote_bdaddr_cache_.size() >= remote_bdaddr_cache_max_size_) {
- const RawAddress& raw_address = remote_bdaddr_cache_ordered_.front();
- remote_bdaddr_cache_.erase(raw_address);
- remote_bdaddr_cache_ordered_.pop();
- }
- remote_bdaddr_cache_.insert(p_bda);
- remote_bdaddr_cache_ordered_.push(p_bda);
- }
-
- bool find_address_cache(const RawAddress& p_bda) {
- return (remote_bdaddr_cache_.find(p_bda) != remote_bdaddr_cache_.end());
- }
-
- void init_address_cache(void) {
- remote_bdaddr_cache_.clear();
- remote_bdaddr_cache_ordered_ = {};
- }
-
- // all access to this variable should be done on the jni thread
- std::set<RawAddress> remote_bdaddr_cache_;
- std::queue<RawAddress> remote_bdaddr_cache_ordered_;
- const size_t remote_bdaddr_cache_max_size_ = 1024;
-};
-
-BleScannerInterfaceImpl* bt_le_scanner_instance = nullptr;
-
-BleScannerInterface* bluetooth::shim::get_ble_scanner_instance() {
- if (bt_le_scanner_instance == nullptr) {
- bt_le_scanner_instance = new BleScannerInterfaceImpl();
- }
- return bt_le_scanner_instance;
-}
-
-void bluetooth::shim::init_scanning_manager() {
- bt_le_scanner_instance->Init();
-}