Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1cecd19f authored by Hansong Zhang's avatar Hansong Zhang Committed by Automerger Merge Worker
Browse files

L2cap: Reroute link callbacks to new listener am: aad611cb am: 49e15b16

Original change: https://android-review.googlesource.com/c/platform/system/bt/+/1544764

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I1e1a66de2566fde57d0d9680410a32110ec03f14
parents add47999 49e15b16
Loading
Loading
Loading
Loading
+18 −8
Original line number Diff line number Diff line
@@ -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(
@@ -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);
}

@@ -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,
@@ -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,
+2 −2
Original line number Diff line number Diff line
@@ -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.
@@ -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) {}
+0 −12
Original line number Diff line number Diff line
@@ -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
+70 −28
Original line number Diff line number Diff line
@@ -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"
@@ -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 {

@@ -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:
@@ -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;
@@ -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(