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

Commit f682b6dc authored by Chris Manton's avatar Chris Manton
Browse files

gd: Plumb remote esco/sco connection requests through GD

Bug: 183476377
Test: gd/cert/run
Tag: #refactor
BYPASS_LONG_LINES_REASON: Bluetooth likes 120 lines

Change-Id: Ib36d3fded252a51be550510f11cc102df2277512
parent cc770b24
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -166,6 +166,22 @@ struct classic_impl : public security::ISecurityManagerListener {
      this->reject_connection(RejectConnectionRequestBuilder::Create(address, reason));
      return;
    }

    switch (request.GetLinkType()) {
      case ConnectionRequestLinkType::SCO:
        client_handler_->CallOn(
            client_callbacks_, &ConnectionCallbacks::HACK_OnScoConnectRequest, address, request.GetClassOfDevice());
        return;

      case ConnectionRequestLinkType::ACL:
        break;

      case ConnectionRequestLinkType::ESCO:
        client_handler_->CallOn(
            client_callbacks_, &ConnectionCallbacks::HACK_OnEscoConnectRequest, address, request.GetClassOfDevice());
        return;
    }

    incoming_connecting_address_ = address;
    if (is_classic_link_already_connected(address)) {
      auto reason = RejectConnectionReason::UNACCEPTABLE_BD_ADDR;
+4 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <memory>
#include "hci/acl_manager/classic_acl_connection.h"
#include "hci/address.h"
#include "hci/class_of_device.h"
#include "hci/hci_packets.h"
#include "os/handler.h"

@@ -33,6 +34,9 @@ class ConnectionCallbacks {
  virtual void OnConnectSuccess(std::unique_ptr<ClassicAclConnection>) = 0;
  // Invoked when controller sends Connection Complete event with non-Success error code
  virtual void OnConnectFail(Address, ErrorCode reason) = 0;

  virtual void HACK_OnEscoConnectRequest(Address, ClassOfDevice) = 0;
  virtual void HACK_OnScoConnectRequest(Address, ClassOfDevice) = 0;
};

}  // namespace acl_manager
+30 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@

#include "common/bind.h"
#include "hci/address.h"
#include "hci/class_of_device.h"
#include "hci/controller.h"
#include "hci/hci_layer.h"
#include "os/thread.h"
@@ -405,6 +406,9 @@ class AclManagerNoCallbacksTest : public ::testing::Test {
    }
    MOCK_METHOD(void, OnConnectFail, (Address, ErrorCode reason), (override));

    MOCK_METHOD(void, HACK_OnEscoConnectRequest, (Address, ClassOfDevice), (override));
    MOCK_METHOD(void, HACK_OnScoConnectRequest, (Address, ClassOfDevice), (override));

    std::list<std::shared_ptr<ClassicAclConnection>> connections_;
    std::unique_ptr<std::promise<void>> connection_promise_;
  } mock_connection_callback_;
@@ -448,6 +452,8 @@ class AclManagerWithConnectionTest : public AclManagerTest {
      last_command = test_hci_layer_->GetCommand(OpCode::CREATE_CONNECTION);
    }

    EXPECT_CALL(mock_connection_management_callbacks_, OnRoleChange(hci::ErrorCode::SUCCESS, Role::CENTRAL));

    auto first_connection = GetConnectionFuture();
    test_hci_layer_->IncomingEvent(
        ConnectionCompleteBuilder::Create(ErrorCode::SUCCESS, handle_, remote, LinkType::ACL, Enable::DISABLED));
@@ -1459,6 +1465,30 @@ TEST_F(AclManagerLifeCycleTest, unregister_le_before_enhanced_connection_complet
  ASSERT_NE(connection_future_status, std::future_status::ready);
}

TEST_F(AclManagerWithConnectionTest, remote_sco_connect_request) {
  ClassOfDevice class_of_device;

  EXPECT_CALL(mock_connection_callback_, HACK_OnScoConnectRequest(remote, class_of_device));

  test_hci_layer_->IncomingEvent(
      ConnectionRequestBuilder::Create(remote, class_of_device, ConnectionRequestLinkType::SCO));
  fake_registry_.SynchronizeModuleHandler(&HciLayer::Factory, std::chrono::milliseconds(20));
  fake_registry_.SynchronizeModuleHandler(&AclManager::Factory, std::chrono::milliseconds(20));
  fake_registry_.SynchronizeModuleHandler(&HciLayer::Factory, std::chrono::milliseconds(20));
}

TEST_F(AclManagerWithConnectionTest, remote_esco_connect_request) {
  ClassOfDevice class_of_device;

  EXPECT_CALL(mock_connection_callback_, HACK_OnEscoConnectRequest(remote, class_of_device));

  test_hci_layer_->IncomingEvent(
      ConnectionRequestBuilder::Create(remote, class_of_device, ConnectionRequestLinkType::ESCO));
  fake_registry_.SynchronizeModuleHandler(&HciLayer::Factory, std::chrono::milliseconds(20));
  fake_registry_.SynchronizeModuleHandler(&AclManager::Factory, std::chrono::milliseconds(20));
  fake_registry_.SynchronizeModuleHandler(&HciLayer::Factory, std::chrono::milliseconds(20));
}

}  // namespace
}  // namespace acl_manager
}  // namespace hci
+10 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@
#include "common/bind.h"
#include "grpc/grpc_event_queue.h"
#include "hci/acl_manager.h"
#include "hci/address.h"
#include "hci/class_of_device.h"
#include "hci/facade/acl_manager_facade.grpc.pb.h"
#include "hci/facade/acl_manager_facade.pb.h"
#include "hci/hci_packets.h"
@@ -367,6 +369,14 @@ class AclManagerFacadeService : public AclManagerFacade::Service, public Connect
    current_connection_request_++;
  }

  void HACK_OnEscoConnectRequest(Address address, ClassOfDevice cod) override {
    LOG_ERROR("Remote ESCO connect request unimplemented");
  }

  void HACK_OnScoConnectRequest(Address address, ClassOfDevice cod) override {
    LOG_ERROR("Remote SCO connect request unimplemented");
  }

  class Connection : public ConnectionManagementCallbacks {
   public:
    Connection(
+9 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include "hci/acl_manager/classic_acl_connection.h"
#include "hci/address.h"
#include "hci/class_of_device.h"
#include "l2cap/classic/internal/link.h"
#include "l2cap/internal/scheduler_fifo.h"
#include "os/log.h"
@@ -313,6 +314,14 @@ void LinkManager::OnConnectFail(hci::Address device, hci::ErrorCode reason) {
  pending_links_.erase(pending_link);
}

void LinkManager::HACK_OnEscoConnectRequest(hci::Address device, hci::ClassOfDevice cod) {
  LOG_ERROR("Remote ESCO connect request unimplemented");
}

void LinkManager::HACK_OnScoConnectRequest(hci::Address device, hci::ClassOfDevice cod) {
  LOG_ERROR("Remote SCO connect request unimplemented");
}

void LinkManager::OnDisconnect(hci::Address device, hci::ErrorCode status) {
  auto* link = GetLink(device);
  ASSERT_LOG(link != nullptr, "Device %s is disconnected with reason 0x%x, but not in local database",
Loading