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

Commit 8ea3c8a7 authored by Hansong Zhang's avatar Hansong Zhang
Browse files

GD L2cap: Pass more link callbacks to Security

Send Remote version request and supported feature request upon link
connection.
Security might be interested in LMP version and features, and ACL handle
(for legacy).

Tag: #gd-refactor
Bug: 141555841
Test: cert/run --host
Change-Id: I8c2f373cbdc2850a26c424fb370a041f4e183555
parent 30c7eda3
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