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

Commit fb32facd authored by Hansong Zhang's avatar Hansong Zhang Committed by Martin Brabham
Browse files

L2cap: Move LinkSecurityInterface impl to LinkManager

Handle the event in LinkManager. When the proxy is deleted, if there is
still pending request in proxy itself, it will crash. Move it to
LinkManager to ensure the request won't go away.

Tag: #gd-refactor
Test: cert/run --host
Change-Id: Id6a0fcdd55e73e236d14cef36d96c42b2bc69efa
parent 40d49027
Loading
Loading
Loading
Loading
+44 −42
Original line number Diff line number Diff line
@@ -139,73 +139,75 @@ void LinkManager::TriggerPairing(Link* link) {
  link->ReadClockOffset();
}

/**
 * The implementation for LinkSecurityInterface, which allows the SecurityModule to access some link functionalities.
 * Note: All public methods implementing this interface are invoked from external context.
 */
struct LinkSecurityInterfaceImpl : public LinkSecurityInterface {
 public:
  LinkSecurityInterfaceImpl(os::Handler* handler, LinkManager* link_manager, Link* link)
      : handler_(handler), link_manager_(link_manager), link_(link), remote_(link_->GetDevice().GetAddress()) {}

  hci::Address GetRemoteAddress() override {
    return remote_;
void LinkManager::handle_link_security_hold(hci::Address remote) {
  auto link = GetLink(remote);
  if (link == nullptr) {
    LOG_WARN("Remote is disconnected");
    return;
  }

  void Hold() override {
    handler_->CallOn(this, &LinkSecurityInterfaceImpl::handle_hold);
  link->AcquireSecurityHold();
}

  void handle_hold() {
    if (link_manager_->GetLink(remote_) == nullptr) {
void LinkManager::handle_link_security_release(hci::Address remote) {
  auto link = GetLink(remote);
  if (link == nullptr) {
    LOG_WARN("Remote is disconnected");
    return;
  }
    link_->AcquireSecurityHold();
  }

  void Release() override {
    handler_->CallOn(this, &LinkSecurityInterfaceImpl::handle_release);
  link->ReleaseSecurityHold();
}

  void handle_release() {
    if (link_manager_->GetLink(remote_) == nullptr) {
void LinkManager::handle_link_security_disconnect(hci::Address remote) {
  auto link = GetLink(remote);
  if (link == nullptr) {
    LOG_WARN("Remote is disconnected");
    return;
  }
    link_->ReleaseSecurityHold();
  link->Disconnect();
}

  void Disconnect() override {
    handler_->CallOn(this, &LinkSecurityInterfaceImpl::handle_disconnect);
  }

  void handle_disconnect() {
    if (link_manager_->GetLink(remote_) == nullptr) {
void LinkManager::handle_link_security_ensure_authenticated(hci::Address remote) {
  auto link = GetLink(remote);
  if (link == nullptr) {
    LOG_WARN("Remote is disconnected");
    return;
  }
    link_->Disconnect();
  if (!link->IsAuthenticated()) {
    link->Authenticate();
  }
}

  void EnsureAuthenticated() override {
    handler_->CallOn(this, &LinkSecurityInterfaceImpl::handle_ensure_authenticated);
/**
 * The implementation for LinkSecurityInterface, which allows the SecurityModule to access some link functionalities.
 * Note: All public methods implementing this interface are invoked from external context.
 */
class LinkSecurityInterfaceImpl : public LinkSecurityInterface {
 public:
  LinkSecurityInterfaceImpl(os::Handler* handler, LinkManager* link_manager, Link* link)
      : handler_(handler), link_manager_(link_manager), remote_(link->GetDevice().GetAddress()) {}

  hci::Address GetRemoteAddress() override {
    return remote_;
  }

  void handle_ensure_authenticated() {
    if (link_manager_->GetLink(remote_) == nullptr) {
      LOG_WARN("Remote is disconnected");
      return;
  void Hold() override {
    handler_->CallOn(link_manager_, &LinkManager::handle_link_security_hold, remote_);
  }

    if (!link_->IsAuthenticated()) {
      link_->Authenticate();
  void Release() override {
    handler_->CallOn(link_manager_, &LinkManager::handle_link_security_release, remote_);
  }

  void Disconnect() override {
    handler_->CallOn(link_manager_, &LinkManager::handle_link_security_disconnect, remote_);
  }

  void EnsureAuthenticated() override {
    handler_->CallOn(link_manager_, &LinkManager::handle_link_security_ensure_authenticated, remote_);
  }

  os::Handler* handler_;
  LinkManager* link_manager_;
  Link* link_;
  hci::Address remote_;
};

+7 −0
Original line number Diff line number Diff line
@@ -82,6 +82,13 @@ class LinkManager : public hci::acl_manager::ConnectionCallbacks {
 private:
  void TriggerPairing(Link* link);

  // Handles requests from LinkSecurityInterface
  friend class LinkSecurityInterfaceImpl;
  void handle_link_security_hold(hci::Address remote);
  void handle_link_security_release(hci::Address remote);
  void handle_link_security_disconnect(hci::Address remote);
  void handle_link_security_ensure_authenticated(hci::Address remote);

  // Dependencies
  os::Handler* l2cap_handler_;
  hci::AclManager* acl_manager_;