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

Commit 7f1f783a authored by Hansong Zhang's avatar Hansong Zhang Committed by Automerger Merge Worker
Browse files

L2cap: Move LinkSecurityInterface impl to LinkManager am: fb32facd

Change-Id: I1536fef5fe6c05d2202be9a5370c2bf8cedf14be
parents 5871093d fb32facd
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_;