Loading system/gd/hci/le_scanning_manager.cc +65 −2 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include "module.h" #include "os/handler.h" #include "os/log.h" #include "storage/storage_module.h" namespace bluetooth { namespace hci { Loading Loading @@ -235,12 +236,14 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { HciLayer* hci_layer, Controller* controller, AclManager* acl_manager, VendorSpecificEventManager* vendor_specific_event_manager) { VendorSpecificEventManager* vendor_specific_event_manager, storage::StorageModule* storage_module) { module_handler_ = handler; hci_layer_ = hci_layer; controller_ = controller; acl_manager_ = acl_manager; vendor_specific_event_manager_ = vendor_specific_event_manager; storage_module_ = storage_module; le_address_manager_ = acl_manager->GetLeAddressManager(); le_scanning_interface_ = hci_layer_->GetLeScanningInterface( module_handler_->BindOn(this, &LeScanningManager::impl::handle_scan_results)); Loading Loading @@ -719,6 +722,17 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); } bool is_bonded(Address target_address) { for (auto device : storage_module_->GetBondedDevices()) { if (device.GetAddress() == target_address) { LOG_DEBUG("Addresses match!"); return true; } } LOG_DEBUG("Addresse DON'Ts match!"); return false; } void scan_filter_parameter_setup( ApcfAction action, uint8_t filter_index, AdvertisingFilterParameter advertising_filter_parameter) { if (!is_filter_supported_) { Loading @@ -726,6 +740,7 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { return; } auto entry = remove_me_later_map_.find(filter_index); switch (action) { case ApcfAction::ADD: le_scanning_interface_->EnqueueCommand( Loading @@ -748,11 +763,33 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { le_scanning_interface_->EnqueueCommand( LeAdvFilterDeleteFilteringParametersBuilder::Create(filter_index), module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); // IRK Scanning if (entry != remove_me_later_map_.end()) { // Don't want to remove for a bonded device if (!is_bonded(entry->second.GetAddress())) { le_address_manager_->RemoveDeviceFromResolvingList( static_cast<PeerAddressType>(entry->second.GetAddressType()), entry->second.GetAddress()); } remove_me_later_map_.erase(filter_index); } break; case ApcfAction::CLEAR: le_scanning_interface_->EnqueueCommand( LeAdvFilterClearFilteringParametersBuilder::Create(), module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); // IRK Scanning if (entry != remove_me_later_map_.end()) { // Don't want to remove for a bonded device if (!is_bonded(entry->second.GetAddress())) { le_address_manager_->RemoveDeviceFromResolvingList( static_cast<PeerAddressType>(entry->second.GetAddressType()), entry->second.GetAddress()); } remove_me_later_map_.erase(filter_index); } break; default: LOG_ERROR("Unknown action type: %d", (uint16_t)action); Loading Loading @@ -808,6 +845,8 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { } } std::unordered_map<uint8_t, AddressWithType> remove_me_later_map_; void update_address_filter( ApcfAction action, uint8_t filter_index, Loading Loading @@ -835,14 +874,35 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { action, filter_index, address, ApcfApplicationAddressType::NOT_APPLICABLE), module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); if (!is_empty_128bit(irk)) { // If an entry exists for this filter index, replace data because the filter has been // updated. auto entry = remove_me_later_map_.find(filter_index); // IRK Scanning if (entry != remove_me_later_map_.end()) { // Don't want to remove for a bonded device if (!is_bonded(entry->second.GetAddress())) { le_address_manager_->RemoveDeviceFromResolvingList( static_cast<PeerAddressType>(entry->second.GetAddressType()), entry->second.GetAddress()); } remove_me_later_map_.erase(filter_index); } // Now replace it with a new one std::array<uint8_t, 16> empty_irk; le_address_manager_->AddDeviceToResolvingList( static_cast<PeerAddressType>(address_type), address, irk, empty_irk); remove_me_later_map_.emplace(filter_index, AddressWithType(address, static_cast<AddressType>(address_type))); } } else { le_scanning_interface_->EnqueueCommand( LeAdvFilterClearBroadcasterAddressBuilder::Create(filter_index), module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); auto entry = remove_me_later_map_.find(filter_index); if (entry != remove_me_later_map_.end()) { // TODO(optedoblivion): If not bonded le_address_manager_->RemoveDeviceFromResolvingList(static_cast<PeerAddressType>(address_type), address); remove_me_later_map_.erase(filter_index); } } } Loading Loading @@ -1519,6 +1579,7 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { Controller* controller_; AclManager* acl_manager_; VendorSpecificEventManager* vendor_specific_event_manager_; storage::StorageModule* storage_module_; LeScanningInterface* le_scanning_interface_; LeAddressManager* le_address_manager_; bool address_manager_registered_ = false; Loading Loading @@ -1578,6 +1639,7 @@ void LeScanningManager::ListDependencies(ModuleList* list) const { list->add<VendorSpecificEventManager>(); list->add<Controller>(); list->add<AclManager>(); list->add<storage::StorageModule>(); } void LeScanningManager::Start() { Loading @@ -1586,7 +1648,8 @@ void LeScanningManager::Start() { GetDependency<HciLayer>(), GetDependency<Controller>(), GetDependency<AclManager>(), GetDependency<VendorSpecificEventManager>()); GetDependency<VendorSpecificEventManager>(), GetDependency<storage::StorageModule>()); } void LeScanningManager::Stop() { Loading Loading
system/gd/hci/le_scanning_manager.cc +65 −2 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include "module.h" #include "os/handler.h" #include "os/log.h" #include "storage/storage_module.h" namespace bluetooth { namespace hci { Loading Loading @@ -235,12 +236,14 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { HciLayer* hci_layer, Controller* controller, AclManager* acl_manager, VendorSpecificEventManager* vendor_specific_event_manager) { VendorSpecificEventManager* vendor_specific_event_manager, storage::StorageModule* storage_module) { module_handler_ = handler; hci_layer_ = hci_layer; controller_ = controller; acl_manager_ = acl_manager; vendor_specific_event_manager_ = vendor_specific_event_manager; storage_module_ = storage_module; le_address_manager_ = acl_manager->GetLeAddressManager(); le_scanning_interface_ = hci_layer_->GetLeScanningInterface( module_handler_->BindOn(this, &LeScanningManager::impl::handle_scan_results)); Loading Loading @@ -719,6 +722,17 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); } bool is_bonded(Address target_address) { for (auto device : storage_module_->GetBondedDevices()) { if (device.GetAddress() == target_address) { LOG_DEBUG("Addresses match!"); return true; } } LOG_DEBUG("Addresse DON'Ts match!"); return false; } void scan_filter_parameter_setup( ApcfAction action, uint8_t filter_index, AdvertisingFilterParameter advertising_filter_parameter) { if (!is_filter_supported_) { Loading @@ -726,6 +740,7 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { return; } auto entry = remove_me_later_map_.find(filter_index); switch (action) { case ApcfAction::ADD: le_scanning_interface_->EnqueueCommand( Loading @@ -748,11 +763,33 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { le_scanning_interface_->EnqueueCommand( LeAdvFilterDeleteFilteringParametersBuilder::Create(filter_index), module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); // IRK Scanning if (entry != remove_me_later_map_.end()) { // Don't want to remove for a bonded device if (!is_bonded(entry->second.GetAddress())) { le_address_manager_->RemoveDeviceFromResolvingList( static_cast<PeerAddressType>(entry->second.GetAddressType()), entry->second.GetAddress()); } remove_me_later_map_.erase(filter_index); } break; case ApcfAction::CLEAR: le_scanning_interface_->EnqueueCommand( LeAdvFilterClearFilteringParametersBuilder::Create(), module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); // IRK Scanning if (entry != remove_me_later_map_.end()) { // Don't want to remove for a bonded device if (!is_bonded(entry->second.GetAddress())) { le_address_manager_->RemoveDeviceFromResolvingList( static_cast<PeerAddressType>(entry->second.GetAddressType()), entry->second.GetAddress()); } remove_me_later_map_.erase(filter_index); } break; default: LOG_ERROR("Unknown action type: %d", (uint16_t)action); Loading Loading @@ -808,6 +845,8 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { } } std::unordered_map<uint8_t, AddressWithType> remove_me_later_map_; void update_address_filter( ApcfAction action, uint8_t filter_index, Loading Loading @@ -835,14 +874,35 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { action, filter_index, address, ApcfApplicationAddressType::NOT_APPLICABLE), module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); if (!is_empty_128bit(irk)) { // If an entry exists for this filter index, replace data because the filter has been // updated. auto entry = remove_me_later_map_.find(filter_index); // IRK Scanning if (entry != remove_me_later_map_.end()) { // Don't want to remove for a bonded device if (!is_bonded(entry->second.GetAddress())) { le_address_manager_->RemoveDeviceFromResolvingList( static_cast<PeerAddressType>(entry->second.GetAddressType()), entry->second.GetAddress()); } remove_me_later_map_.erase(filter_index); } // Now replace it with a new one std::array<uint8_t, 16> empty_irk; le_address_manager_->AddDeviceToResolvingList( static_cast<PeerAddressType>(address_type), address, irk, empty_irk); remove_me_later_map_.emplace(filter_index, AddressWithType(address, static_cast<AddressType>(address_type))); } } else { le_scanning_interface_->EnqueueCommand( LeAdvFilterClearBroadcasterAddressBuilder::Create(filter_index), module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete)); auto entry = remove_me_later_map_.find(filter_index); if (entry != remove_me_later_map_.end()) { // TODO(optedoblivion): If not bonded le_address_manager_->RemoveDeviceFromResolvingList(static_cast<PeerAddressType>(address_type), address); remove_me_later_map_.erase(filter_index); } } } Loading Loading @@ -1519,6 +1579,7 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { Controller* controller_; AclManager* acl_manager_; VendorSpecificEventManager* vendor_specific_event_manager_; storage::StorageModule* storage_module_; LeScanningInterface* le_scanning_interface_; LeAddressManager* le_address_manager_; bool address_manager_registered_ = false; Loading Loading @@ -1578,6 +1639,7 @@ void LeScanningManager::ListDependencies(ModuleList* list) const { list->add<VendorSpecificEventManager>(); list->add<Controller>(); list->add<AclManager>(); list->add<storage::StorageModule>(); } void LeScanningManager::Start() { Loading @@ -1586,7 +1648,8 @@ void LeScanningManager::Start() { GetDependency<HciLayer>(), GetDependency<Controller>(), GetDependency<AclManager>(), GetDependency<VendorSpecificEventManager>()); GetDependency<VendorSpecificEventManager>(), GetDependency<storage::StorageModule>()); } void LeScanningManager::Stop() { Loading