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

Commit 5f0b365c authored by Myles Watson's avatar Myles Watson
Browse files

Register for connection requests

SCO shouldn't rely on ACL for this.

Bug: 301661850
Test: mma -j32
Flag: EXEMPT, no logical change
Change-Id: Ie2c82bc620a0114e0b29ff58027d7208ad11cb06
parent 170949de
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ constexpr EventCode AclConnectionEvents[] = {
    EventCode::CONNECTION_PACKET_TYPE_CHANGED,
    EventCode::ROLE_CHANGE,
    EventCode::CONNECTION_COMPLETE,
    EventCode::CONNECTION_REQUEST,
    EventCode::AUTHENTICATION_COMPLETE,
    EventCode::READ_CLOCK_OFFSET_COMPLETE,
    EventCode::MODE_CHANGE,
+6 −34
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include "hci/acl_manager/acl_scheduler.h"
#include "hci/acl_manager/assembler.h"
#include "hci/acl_manager/round_robin_scheduler.h"
#include "hci/class_of_device.h"
#include "hci/controller.h"
#include "hci/event_checkers.h"
#include "hci/remote_name_request.h"
@@ -70,6 +71,7 @@ struct classic_impl : public security::ISecurityManagerListener {
    acl_connection_interface_ = hci_layer_->GetAclConnectionInterface(
        handler_->BindOn(this, &classic_impl::on_classic_event),
        handler_->BindOn(this, &classic_impl::on_classic_disconnect),
        handler_->BindOn(this, &classic_impl::on_incoming_connection),
        handler_->BindOn(this, &classic_impl::on_read_remote_version_information));
  }

@@ -85,9 +87,6 @@ struct classic_impl : public security::ISecurityManagerListener {
      case EventCode::CONNECTION_COMPLETE:
        on_connection_complete(event_packet);
        break;
      case EventCode::CONNECTION_REQUEST:
        on_incoming_connection(event_packet);
        break;
      case EventCode::CONNECTION_PACKET_TYPE_CHANGED:
        on_connection_packet_type_changed(event_packet);
        break;
@@ -243,10 +242,7 @@ struct classic_impl : public security::ISecurityManagerListener {
    return connections.send_packet_upward(handle, cb);
  }

  void on_incoming_connection(EventView packet) {
    ConnectionRequestView request = ConnectionRequestView::Create(packet);
    ASSERT(request.IsValid());
    Address address = request.GetBdAddr();
  void on_incoming_connection(Address address, ClassOfDevice cod) {
    if (client_callbacks_ == nullptr) {
      LOG_ERROR("No callbacks to call");
      auto reason = RejectConnectionReason::LIMITED_RESOURCES;
@@ -254,39 +250,15 @@ struct classic_impl : public security::ISecurityManagerListener {
      return;
    }

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

      case ConnectionRequestLinkType::ACL:
        // Need to upstream Cod information when getting connection_request
    client_handler_->CallOn(
            client_callbacks_,
            &ConnectionCallbacks::OnConnectRequest,
            address,
            request.GetClassOfDevice());
        break;

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

      default:
        LOG_ERROR(
            "Request has unknown ConnectionRequestLinkType %s",
            ConnectionRequestLinkTypeText(request.GetLinkType()).c_str());
        return;
    }
        client_callbacks_, &ConnectionCallbacks::OnConnectRequest, address, cod);

    acl_scheduler_->RegisterPendingIncomingConnection(address);

    if (is_classic_link_already_connected(address)) {
      auto reason = RejectConnectionReason::UNACCEPTABLE_BD_ADDR;
      this->reject_connection(RejectConnectionRequestBuilder::Create(address, reason));
    } else if (should_accept_connection_.Run(address, request.GetClassOfDevice())) {
    } else if (should_accept_connection_.Run(address, cod)) {
      this->accept_connection(address);
    } else {
      auto reason = RejectConnectionReason::LIMITED_RESOURCES;  // TODO: determine reason
+0 −3
Original line number Diff line number Diff line
@@ -36,9 +36,6 @@ class ConnectionCallbacks {
  virtual void OnConnectRequest(Address, ClassOfDevice) = 0;
  // Invoked when controller sends Connection Complete event with non-Success error code
  virtual void OnConnectFail(Address, ErrorCode reason, bool locally_initiated) = 0;

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

}  // namespace acl_manager
+0 −3
Original line number Diff line number Diff line
@@ -32,9 +32,6 @@ class MockConnectionCallback : public ConnectionCallbacks {
      void, OnConnectSuccess, (std::unique_ptr<ClassicAclConnection> connection), (override));
  MOCK_METHOD(void, OnConnectRequest, (Address, ClassOfDevice), (override));
  MOCK_METHOD(void, OnConnectFail, (Address, ErrorCode reason, bool locally_initiated), (override));

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

}  // namespace acl_manager
+0 −24
Original line number Diff line number Diff line
@@ -1364,30 +1364,6 @@ 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));
}

class AclManagerWithConnectionAssemblerTest : public AclManagerWithConnectionTest {
 protected:
  void SetUp() override {
Loading