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

Commit 4dbe2ebf authored by Hansong Zhang's avatar Hansong Zhang Committed by Automerger Merge Worker
Browse files

GD L2cap: Pass more link callbacks to Security am: 8ea3c8a7 am: 6d33d687

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

Change-Id: Id5f9bb435acafe23986a53a32a15be3ccbe4d3f9
parents 6d9f089c 6d33d687
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -43,6 +43,9 @@ class MockClassicAclConnection : public ClassicAclConnection {
  MOCK_METHOD(Address, GetAddress, (), (const, override));
  MOCK_METHOD(bool, Disconnect, (DisconnectReason reason), (override));
  MOCK_METHOD(void, RegisterCallbacks, (ConnectionManagementCallbacks * callbacks, os::Handler* handler), (override));
  MOCK_METHOD(bool, ReadRemoteVersionInformation, (), (override));
  MOCK_METHOD(bool, ReadRemoteSupportedFeatures, (), (override));
  MOCK_METHOD(bool, ReadRemoteExtendedFeatures, (uint8_t), (override));

  QueueUpEnd* GetAclQueueEnd() const override {
    return acl_queue_.GetUpEnd();
+23 −9
Original line number Diff line number Diff line
@@ -36,16 +36,28 @@ using RetransmissionAndFlowControlMode = DynamicChannelConfigurationOption::Retr
using ConnectionResult = DynamicChannelManager::ConnectionResult;
using ConnectionResultCode = DynamicChannelManager::ConnectionResultCode;

Link::Link(os::Handler* l2cap_handler, std::unique_ptr<hci::acl_manager::ClassicAclConnection> acl_connection,
Link::Link(
    os::Handler* l2cap_handler,
    std::unique_ptr<hci::acl_manager::ClassicAclConnection> acl_connection,
    l2cap::internal::ParameterProvider* parameter_provider,
    DynamicChannelServiceManagerImpl* dynamic_service_manager,
           FixedChannelServiceManagerImpl* fixed_service_manager, LinkManager* link_manager)
    : l2cap_handler_(l2cap_handler), acl_connection_(std::move(acl_connection)),
    FixedChannelServiceManagerImpl* fixed_service_manager,
    LinkManager* link_manager)
    : l2cap_handler_(l2cap_handler),
      acl_connection_(std::move(acl_connection)),
      data_pipeline_manager_(l2cap_handler, this, acl_connection_->GetAclQueueEnd()),
      parameter_provider_(parameter_provider), dynamic_service_manager_(dynamic_service_manager),
      fixed_service_manager_(fixed_service_manager), link_manager_(link_manager),
      signalling_manager_(l2cap_handler_, this, &data_pipeline_manager_, dynamic_service_manager_,
                          &dynamic_channel_allocator_, fixed_service_manager_) {
      parameter_provider_(parameter_provider),
      dynamic_service_manager_(dynamic_service_manager),
      fixed_service_manager_(fixed_service_manager),
      link_manager_(link_manager),
      signalling_manager_(
          l2cap_handler_,
          this,
          &data_pipeline_manager_,
          dynamic_service_manager_,
          &dynamic_channel_allocator_,
          fixed_service_manager_),
      acl_handle_(acl_connection_->GetHandle()) {
  ASSERT(l2cap_handler_ != nullptr);
  ASSERT(acl_connection_ != nullptr);
  ASSERT(parameter_provider_ != nullptr);
@@ -403,6 +415,7 @@ void Link::OnReadRemoteVersionInformationComplete(
      lmp_version,
      manufacturer_name,
      sub_version);
  link_manager_->OnReadRemoteVersionInformation(GetDevice().GetAddress(), lmp_version, manufacturer_name, sub_version);
}
void Link::OnReadRemoteExtendedFeaturesComplete(uint8_t page_number, uint8_t max_page_number, uint64_t features) {
  LOG_INFO(
@@ -410,6 +423,7 @@ void Link::OnReadRemoteExtendedFeaturesComplete(uint8_t page_number, uint8_t max
      page_number,
      max_page_number,
      static_cast<unsigned long>(features));
  link_manager_->OnReadRemoteExtendedFeatures(GetDevice().GetAddress(), page_number, max_page_number, features);
}

void Link::AddEncryptionChangeListener(EncryptionChangeListener listener) {
+5 −0
Original line number Diff line number Diff line
@@ -183,6 +183,10 @@ class Link : public l2cap::internal::ILink, public hci::acl_manager::ConnectionM
  };
  void AddEncryptionChangeListener(EncryptionChangeListener);

  uint16_t GetAclHandle() const {
    return acl_handle_;
  }

 private:
  friend class DumpsysHelper;
  void connect_to_pending_dynamic_channels();
@@ -200,6 +204,7 @@ class Link : public l2cap::internal::ILink, public hci::acl_manager::ConnectionM
  std::unordered_map<Cid, PendingDynamicChannelConnection> local_cid_to_pending_dynamic_channel_connection_map_;
  os::Alarm link_idle_disconnect_alarm_{l2cap_handler_};
  ClassicSignallingManager signalling_manager_;
  uint16_t acl_handle_;
  Mtu remote_connectionless_mtu_ = kMinimumClassicMtu;
  bool remote_extended_feature_received_ = false;
  bool remote_supports_ertm_ = false;
+39 −1
Original line number Diff line number Diff line
@@ -170,7 +170,10 @@ void LinkManager::handle_link_security_ensure_encrypted(hci::Address remote) {
class LinkSecurityInterfaceImpl : public LinkSecurityInterface {
 public:
  LinkSecurityInterfaceImpl(os::Handler* handler, LinkManager* link_manager, Link* link)
      : handler_(handler), link_manager_(link_manager), remote_(link->GetDevice().GetAddress()) {}
      : handler_(handler),
        link_manager_(link_manager),
        remote_(link->GetDevice().GetAddress()),
        acl_handle_(link->GetAclHandle()) {}

  hci::Address GetRemoteAddress() override {
    return remote_;
@@ -196,9 +199,14 @@ class LinkSecurityInterfaceImpl : public LinkSecurityInterface {
    handler_->CallOn(link_manager_, &LinkManager::handle_link_security_ensure_encrypted, remote_);
  }

  uint16_t GetAclHandle() override {
    return acl_handle_;
  }

  os::Handler* handler_;
  LinkManager* link_manager_;
  hci::Address remote_;
  uint16_t acl_handle_;
};

void LinkManager::OnConnectSuccess(std::unique_ptr<hci::acl_manager::ClassicAclConnection> acl_connection) {
@@ -212,6 +220,9 @@ void LinkManager::OnConnectSuccess(std::unique_ptr<hci::acl_manager::ClassicAclC
  ASSERT(link != nullptr);
  link->SendInformationRequest(InformationRequestInfoType::EXTENDED_FEATURES_SUPPORTED);
  link->SendInformationRequest(InformationRequestInfoType::FIXED_CHANNELS_SUPPORTED);
  link->ReadRemoteVersionInformation();
  link->ReadRemoteSupportedFeatures();
  link->ReadRemoteExtendedFeatures(1);

  // Allocate and distribute channels for all registered fixed channel services
  auto fixed_channel_services = fixed_channel_service_manager_->GetRegisteredServices();
@@ -286,6 +297,7 @@ void LinkManager::OnAuthenticationComplete(hci::Address device) {
        link_security_interface_listener_, &LinkSecurityInterfaceListener::OnAuthenticationComplete, device);
  }
}

void LinkManager::OnEncryptionChange(hci::Address device, hci::EncryptionEnabled enabled) {
  if (link_security_interface_listener_handler_ != nullptr) {
    link_security_interface_listener_handler_->CallOn(
@@ -296,6 +308,32 @@ 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,
        device,
        lmp_version,
        manufacturer_name,
        sub_version);
  }
}

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,
        device,
        page_number,
        max_page_number,
        features);
  }
}

}  // namespace internal
}  // namespace classic
}  // namespace l2cap
+4 −0
Original line number Diff line number Diff line
@@ -67,6 +67,10 @@ class LinkManager : public hci::acl_manager::ConnectionCallbacks {
  virtual void OnDisconnect(hci::Address device, hci::ErrorCode status);
  void OnAuthenticationComplete(hci::Address device);
  void OnEncryptionChange(hci::Address device, hci::EncryptionEnabled enabled);
  void OnReadRemoteVersionInformation(
      hci::Address device, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version);
  void OnReadRemoteExtendedFeatures(
      hci::Address device, uint8_t page_number, uint8_t max_page_number, uint64_t features);

  // FixedChannelManager methods

Loading