Loading system/gd/l2cap/classic/internal/link_manager.cc +18 −8 Original line number Diff line number Diff line Loading @@ -254,6 +254,12 @@ void LinkManager::OnConnectSuccess(std::unique_ptr<hci::acl_manager::ClassicAclC pending_dynamic_channels_.erase(device); pending_dynamic_channels_callbacks_.erase(device); } // Notify link property listener if (link_property_callback_handler_ != nullptr) { link_property_callback_handler_->CallOn( link_property_listener_, &LinkPropertyListener::OnLinkConnected, device, link->GetAclHandle()); } // Notify security manager if (link_security_interface_listener_handler_ != nullptr) { link_security_interface_listener_handler_->CallOn( Loading Loading @@ -304,6 +310,10 @@ void LinkManager::OnDisconnect(hci::Address device, hci::ErrorCode status) { link_security_interface_listener_handler_->CallOn( link_security_interface_listener_, &LinkSecurityInterfaceListener::OnLinkDisconnected, device); } if (link_property_callback_handler_ != nullptr) { link_property_callback_handler_->CallOn(link_property_listener_, &LinkPropertyListener::OnLinkDisconnected, device); } links_.erase(device); } Loading @@ -326,10 +336,10 @@ void LinkManager::OnEncryptionChange(hci::Address device, hci::EncryptionEnabled void LinkManager::OnReadRemoteVersionInformation( hci::Address device, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version) { if (link_security_interface_listener_handler_ != nullptr) { link_security_interface_listener_handler_->CallOn( link_security_interface_listener_, &LinkSecurityInterfaceListener::OnReadRemoteVersionInformation, if (link_property_callback_handler_ != nullptr) { link_property_callback_handler_->CallOn( link_property_listener_, &LinkPropertyListener::OnReadRemoteVersionInformation, device, lmp_version, manufacturer_name, Loading @@ -339,10 +349,10 @@ void LinkManager::OnReadRemoteVersionInformation( void LinkManager::OnReadRemoteExtendedFeatures( hci::Address device, uint8_t page_number, uint8_t max_page_number, uint64_t features) { if (link_security_interface_listener_handler_ != nullptr) { link_security_interface_listener_handler_->CallOn( link_security_interface_listener_, &LinkSecurityInterfaceListener::OnReadRemoteExtendedFeatures, if (link_property_callback_handler_ != nullptr) { link_property_callback_handler_->CallOn( link_property_listener_, &LinkPropertyListener::OnReadRemoteExtendedFeatures, device, page_number, max_page_number, Loading system/gd/l2cap/classic/link_property_listener.h +2 −2 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ class LinkPropertyListener { /** * Invoked when an ACL link is connected. */ virtual void OnLinkConnected(hci::Address remote) {} virtual void OnLinkConnected(hci::Address remote, uint16_t handle) {} /** * Invoked when an ACL link is disconnected. Loading @@ -49,7 +49,7 @@ class LinkPropertyListener { hci::Address remote, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version) {} /** * Invoked when received remote features and remote exnteded features for a given link * Invoked when received remote features and remote extended features for a given link */ virtual void OnReadRemoteExtendedFeatures( hci::Address remote, uint8_t page_number, uint8_t max_page_number, uint64_t features) {} Loading system/gd/l2cap/classic/link_security_interface.h +0 −12 Original line number Diff line number Diff line Loading @@ -114,18 +114,6 @@ class LinkSecurityInterfaceListener { * @param encrypted */ virtual void OnEncryptionChange(hci::Address remote, bool encrypted) {} /** * Invoked when received remote version information for a given link */ virtual void OnReadRemoteVersionInformation( hci::Address remote, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version) {} /** * Invoked when received remote features and remote exnteded features for a given link */ virtual void OnReadRemoteExtendedFeatures( hci::Address device, uint8_t page_number, uint8_t max_page_number, uint64_t features) {} }; } // namespace classic Loading system/main/shim/l2c_api.cc +70 −28 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ #include <unordered_map> #include <unordered_set> #include "main/shim/l2c_api.h" #include "bta/include/bta_dm_acl.h" #include "gd/l2cap/classic/l2cap_classic_module.h" #include "gd/l2cap/le/l2cap_le_module.h" Loading @@ -30,17 +29,22 @@ #include "main/shim/btm.h" #include "main/shim/entry.h" #include "main/shim/helpers.h" #include "main/shim/l2c_api.h" #include "main/shim/stack.h" #include "osi/include/allocator.h" #include "stack/btm/btm_sec.h" #include "stack/include/acl_hci_link_interface.h" #include "stack/include/btm_api.h" #include "stack/include/btu.h" #include "stack/include/sco_hci_link_interface.h" extern void gatt_notify_conn_update(const RawAddress& remote, uint16_t interval, uint16_t latency, uint16_t timeout, tHCI_STATUS status); void process_ssr_event(tHCI_STATUS status, uint16_t handle, uint16_t max_tx_lat, uint16_t max_rx_lat); namespace bluetooth { namespace shim { Loading Loading @@ -322,6 +326,68 @@ struct RemoteFeature { std::unordered_map<RawAddress, RemoteFeature> remote_feature_map_; struct LinkPropertyListenerShim : public bluetooth::l2cap::classic::LinkPropertyListener { std::unordered_map<hci::Address, uint16_t> address_to_handle_; void OnLinkConnected(hci::Address remote, uint16_t handle) override { address_to_handle_[remote] = handle; } void OnLinkDisconnected(hci::Address remote) override { address_to_handle_.erase(remote); } void OnReadRemoteVersionInformation(hci::Address remote, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version) override { auto bda = bluetooth::ToRawAddress(remote); auto& entry = remote_feature_map_[bda]; entry.lmp_version = lmp_version; entry.manufacturer_name = manufacturer_name; entry.sub_version = sub_version; entry.version_info_received = true; } void OnReadRemoteExtendedFeatures(hci::Address remote, uint8_t page_number, uint8_t max_page_number, uint64_t features) override { uint16_t handle = address_to_handle_[remote]; uint8_t* features_array = (uint8_t*)&features; if (page_number == 0) { btm_read_remote_features_complete(handle, features_array); } else { btm_read_remote_ext_features_complete(handle, page_number, max_page_number, features_array); } } void OnRoleChange(hci::Address remote, hci::Role role) override { btm_blacklist_role_change_device(ToRawAddress(remote), HCI_SUCCESS); btm_acl_role_changed(HCI_SUCCESS, ToRawAddress(remote), static_cast<uint8_t>(role)); } void OnReadClockOffset(hci::Address remote, uint16_t clock_offset) override { btm_sec_update_clock_offset(address_to_handle_[remote], clock_offset); } void OnModeChange(hci::Address remote, hci::Mode mode, uint16_t interval) override { btm_sco_chk_pend_unpark(HCI_SUCCESS, address_to_handle_[remote]); btm_pm_proc_mode_change(HCI_SUCCESS, address_to_handle_[remote], static_cast<tHCI_MODE>(mode), interval); } void OnSniffSubrating(hci::Address remote, uint16_t max_tx_lat, uint16_t max_rx_lat, uint16_t min_remote_timeout, uint16_t min_local_timeout) override { process_ssr_event(HCI_SUCCESS, address_to_handle_[remote], max_tx_lat, max_rx_lat); } } link_property_listener_shim_; class SecurityListenerShim : public bluetooth::l2cap::classic::LinkSecurityInterfaceListener { public: Loading Loading @@ -359,33 +425,6 @@ class SecurityListenerShim btm_sec_encrypt_change(handle, HCI_SUCCESS, encrypted); } void OnReadRemoteVersionInformation(bluetooth::hci::Address remote, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version) override { auto bda = bluetooth::ToRawAddress(remote); auto& entry = remote_feature_map_[bda]; entry.lmp_version = lmp_version; entry.manufacturer_name = manufacturer_name; entry.sub_version = sub_version; entry.version_info_received = true; } void OnReadRemoteExtendedFeatures(bluetooth::hci::Address remote, uint8_t page_number, uint8_t max_page_number, uint64_t features) override { auto bda = bluetooth::ToRawAddress(remote); uint16_t handle = address_to_handle_[bda]; uint8_t* features_array = (uint8_t*)&features; if (page_number == 0) { btm_read_remote_features_complete(handle, features_array); } else { btm_read_remote_ext_features_complete(handle, page_number, max_page_number, features_array); } } void UpdateLinkHoldForSecurity(RawAddress remote, bool is_bonding) { if (address_to_interface_.count(remote) == 0) { return; Loading Loading @@ -496,6 +535,9 @@ bool L2CA_ReadRemoteVersion(const RawAddress& addr, uint8_t* lmp_version, void L2CA_UseLegacySecurityModule() { LOG_INFO("GD L2cap is using legacy security module"); GetL2capClassicModule()->SetLinkPropertyListener( GetGdShimHandler(), &link_property_listener_shim_); GetL2capClassicModule()->InjectSecurityEnforcementInterface( &security_enforcement_shim_); security_interface_ = GetL2capClassicModule()->GetSecurityInterface( Loading Loading
system/gd/l2cap/classic/internal/link_manager.cc +18 −8 Original line number Diff line number Diff line Loading @@ -254,6 +254,12 @@ void LinkManager::OnConnectSuccess(std::unique_ptr<hci::acl_manager::ClassicAclC pending_dynamic_channels_.erase(device); pending_dynamic_channels_callbacks_.erase(device); } // Notify link property listener if (link_property_callback_handler_ != nullptr) { link_property_callback_handler_->CallOn( link_property_listener_, &LinkPropertyListener::OnLinkConnected, device, link->GetAclHandle()); } // Notify security manager if (link_security_interface_listener_handler_ != nullptr) { link_security_interface_listener_handler_->CallOn( Loading Loading @@ -304,6 +310,10 @@ void LinkManager::OnDisconnect(hci::Address device, hci::ErrorCode status) { link_security_interface_listener_handler_->CallOn( link_security_interface_listener_, &LinkSecurityInterfaceListener::OnLinkDisconnected, device); } if (link_property_callback_handler_ != nullptr) { link_property_callback_handler_->CallOn(link_property_listener_, &LinkPropertyListener::OnLinkDisconnected, device); } links_.erase(device); } Loading @@ -326,10 +336,10 @@ void LinkManager::OnEncryptionChange(hci::Address device, hci::EncryptionEnabled void LinkManager::OnReadRemoteVersionInformation( hci::Address device, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version) { if (link_security_interface_listener_handler_ != nullptr) { link_security_interface_listener_handler_->CallOn( link_security_interface_listener_, &LinkSecurityInterfaceListener::OnReadRemoteVersionInformation, if (link_property_callback_handler_ != nullptr) { link_property_callback_handler_->CallOn( link_property_listener_, &LinkPropertyListener::OnReadRemoteVersionInformation, device, lmp_version, manufacturer_name, Loading @@ -339,10 +349,10 @@ void LinkManager::OnReadRemoteVersionInformation( void LinkManager::OnReadRemoteExtendedFeatures( hci::Address device, uint8_t page_number, uint8_t max_page_number, uint64_t features) { if (link_security_interface_listener_handler_ != nullptr) { link_security_interface_listener_handler_->CallOn( link_security_interface_listener_, &LinkSecurityInterfaceListener::OnReadRemoteExtendedFeatures, if (link_property_callback_handler_ != nullptr) { link_property_callback_handler_->CallOn( link_property_listener_, &LinkPropertyListener::OnReadRemoteExtendedFeatures, device, page_number, max_page_number, Loading
system/gd/l2cap/classic/link_property_listener.h +2 −2 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ class LinkPropertyListener { /** * Invoked when an ACL link is connected. */ virtual void OnLinkConnected(hci::Address remote) {} virtual void OnLinkConnected(hci::Address remote, uint16_t handle) {} /** * Invoked when an ACL link is disconnected. Loading @@ -49,7 +49,7 @@ class LinkPropertyListener { hci::Address remote, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version) {} /** * Invoked when received remote features and remote exnteded features for a given link * Invoked when received remote features and remote extended features for a given link */ virtual void OnReadRemoteExtendedFeatures( hci::Address remote, uint8_t page_number, uint8_t max_page_number, uint64_t features) {} Loading
system/gd/l2cap/classic/link_security_interface.h +0 −12 Original line number Diff line number Diff line Loading @@ -114,18 +114,6 @@ class LinkSecurityInterfaceListener { * @param encrypted */ virtual void OnEncryptionChange(hci::Address remote, bool encrypted) {} /** * Invoked when received remote version information for a given link */ virtual void OnReadRemoteVersionInformation( hci::Address remote, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version) {} /** * Invoked when received remote features and remote exnteded features for a given link */ virtual void OnReadRemoteExtendedFeatures( hci::Address device, uint8_t page_number, uint8_t max_page_number, uint64_t features) {} }; } // namespace classic Loading
system/main/shim/l2c_api.cc +70 −28 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ #include <unordered_map> #include <unordered_set> #include "main/shim/l2c_api.h" #include "bta/include/bta_dm_acl.h" #include "gd/l2cap/classic/l2cap_classic_module.h" #include "gd/l2cap/le/l2cap_le_module.h" Loading @@ -30,17 +29,22 @@ #include "main/shim/btm.h" #include "main/shim/entry.h" #include "main/shim/helpers.h" #include "main/shim/l2c_api.h" #include "main/shim/stack.h" #include "osi/include/allocator.h" #include "stack/btm/btm_sec.h" #include "stack/include/acl_hci_link_interface.h" #include "stack/include/btm_api.h" #include "stack/include/btu.h" #include "stack/include/sco_hci_link_interface.h" extern void gatt_notify_conn_update(const RawAddress& remote, uint16_t interval, uint16_t latency, uint16_t timeout, tHCI_STATUS status); void process_ssr_event(tHCI_STATUS status, uint16_t handle, uint16_t max_tx_lat, uint16_t max_rx_lat); namespace bluetooth { namespace shim { Loading Loading @@ -322,6 +326,68 @@ struct RemoteFeature { std::unordered_map<RawAddress, RemoteFeature> remote_feature_map_; struct LinkPropertyListenerShim : public bluetooth::l2cap::classic::LinkPropertyListener { std::unordered_map<hci::Address, uint16_t> address_to_handle_; void OnLinkConnected(hci::Address remote, uint16_t handle) override { address_to_handle_[remote] = handle; } void OnLinkDisconnected(hci::Address remote) override { address_to_handle_.erase(remote); } void OnReadRemoteVersionInformation(hci::Address remote, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version) override { auto bda = bluetooth::ToRawAddress(remote); auto& entry = remote_feature_map_[bda]; entry.lmp_version = lmp_version; entry.manufacturer_name = manufacturer_name; entry.sub_version = sub_version; entry.version_info_received = true; } void OnReadRemoteExtendedFeatures(hci::Address remote, uint8_t page_number, uint8_t max_page_number, uint64_t features) override { uint16_t handle = address_to_handle_[remote]; uint8_t* features_array = (uint8_t*)&features; if (page_number == 0) { btm_read_remote_features_complete(handle, features_array); } else { btm_read_remote_ext_features_complete(handle, page_number, max_page_number, features_array); } } void OnRoleChange(hci::Address remote, hci::Role role) override { btm_blacklist_role_change_device(ToRawAddress(remote), HCI_SUCCESS); btm_acl_role_changed(HCI_SUCCESS, ToRawAddress(remote), static_cast<uint8_t>(role)); } void OnReadClockOffset(hci::Address remote, uint16_t clock_offset) override { btm_sec_update_clock_offset(address_to_handle_[remote], clock_offset); } void OnModeChange(hci::Address remote, hci::Mode mode, uint16_t interval) override { btm_sco_chk_pend_unpark(HCI_SUCCESS, address_to_handle_[remote]); btm_pm_proc_mode_change(HCI_SUCCESS, address_to_handle_[remote], static_cast<tHCI_MODE>(mode), interval); } void OnSniffSubrating(hci::Address remote, uint16_t max_tx_lat, uint16_t max_rx_lat, uint16_t min_remote_timeout, uint16_t min_local_timeout) override { process_ssr_event(HCI_SUCCESS, address_to_handle_[remote], max_tx_lat, max_rx_lat); } } link_property_listener_shim_; class SecurityListenerShim : public bluetooth::l2cap::classic::LinkSecurityInterfaceListener { public: Loading Loading @@ -359,33 +425,6 @@ class SecurityListenerShim btm_sec_encrypt_change(handle, HCI_SUCCESS, encrypted); } void OnReadRemoteVersionInformation(bluetooth::hci::Address remote, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version) override { auto bda = bluetooth::ToRawAddress(remote); auto& entry = remote_feature_map_[bda]; entry.lmp_version = lmp_version; entry.manufacturer_name = manufacturer_name; entry.sub_version = sub_version; entry.version_info_received = true; } void OnReadRemoteExtendedFeatures(bluetooth::hci::Address remote, uint8_t page_number, uint8_t max_page_number, uint64_t features) override { auto bda = bluetooth::ToRawAddress(remote); uint16_t handle = address_to_handle_[bda]; uint8_t* features_array = (uint8_t*)&features; if (page_number == 0) { btm_read_remote_features_complete(handle, features_array); } else { btm_read_remote_ext_features_complete(handle, page_number, max_page_number, features_array); } } void UpdateLinkHoldForSecurity(RawAddress remote, bool is_bonding) { if (address_to_interface_.count(remote) == 0) { return; Loading Loading @@ -496,6 +535,9 @@ bool L2CA_ReadRemoteVersion(const RawAddress& addr, uint8_t* lmp_version, void L2CA_UseLegacySecurityModule() { LOG_INFO("GD L2cap is using legacy security module"); GetL2capClassicModule()->SetLinkPropertyListener( GetGdShimHandler(), &link_property_listener_shim_); GetL2capClassicModule()->InjectSecurityEnforcementInterface( &security_enforcement_shim_); security_interface_ = GetL2capClassicModule()->GetSecurityInterface( Loading