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
diff --git a/system/gd/hci/acl_manager/classic_impl.h b/system/gd/hci/acl_manager/classic_impl.h
index 3d0c5c9..4c9d955 100644
--- a/system/gd/hci/acl_manager/classic_impl.h
+++ b/system/gd/hci/acl_manager/classic_impl.h
@@ -166,6 +166,22 @@
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;
diff --git a/system/gd/hci/acl_manager/connection_callbacks.h b/system/gd/hci/acl_manager/connection_callbacks.h
index 0f9473d..9a72654 100644
--- a/system/gd/hci/acl_manager/connection_callbacks.h
+++ b/system/gd/hci/acl_manager/connection_callbacks.h
@@ -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 @@
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
diff --git a/system/gd/hci/acl_manager_test.cc b/system/gd/hci/acl_manager_test.cc
index 5f174fd..fea1849 100644
--- a/system/gd/hci/acl_manager_test.cc
+++ b/system/gd/hci/acl_manager_test.cc
@@ -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 @@
}
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 @@
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 @@
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
diff --git a/system/gd/hci/facade/acl_manager_facade.cc b/system/gd/hci/facade/acl_manager_facade.cc
index f867b00..374d388 100644
--- a/system/gd/hci/facade/acl_manager_facade.cc
+++ b/system/gd/hci/facade/acl_manager_facade.cc
@@ -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 @@
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(
diff --git a/system/gd/l2cap/classic/internal/link_manager.cc b/system/gd/l2cap/classic/internal/link_manager.cc
index a80216e..cda9395 100644
--- a/system/gd/l2cap/classic/internal/link_manager.cc
+++ b/system/gd/l2cap/classic/internal/link_manager.cc
@@ -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 @@
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",
diff --git a/system/gd/l2cap/classic/internal/link_manager.h b/system/gd/l2cap/classic/internal/link_manager.h
index 1726226..19feefc 100644
--- a/system/gd/l2cap/classic/internal/link_manager.h
+++ b/system/gd/l2cap/classic/internal/link_manager.h
@@ -21,6 +21,7 @@
#include "hci/acl_manager/classic_acl_connection.h"
#include "hci/address.h"
+#include "hci/class_of_device.h"
#include "l2cap/classic/dynamic_channel_manager.h"
#include "l2cap/classic/fixed_channel_manager.h"
#include "l2cap/classic/internal/dynamic_channel_service_manager_impl.h"
@@ -65,6 +66,10 @@
Link* GetLink(hci::Address device);
void OnConnectSuccess(std::unique_ptr<hci::acl_manager::ClassicAclConnection> acl_connection) override;
void OnConnectFail(hci::Address device, hci::ErrorCode reason) override;
+
+ void HACK_OnEscoConnectRequest(hci::Address, hci::ClassOfDevice) override;
+ void HACK_OnScoConnectRequest(hci::Address, hci::ClassOfDevice) override;
+
virtual void OnDisconnect(hci::Address device, hci::ErrorCode status);
void OnAuthenticationComplete(hci::ErrorCode hci_status, hci::Address device);
void OnEncryptionChange(hci::Address device, hci::EncryptionEnabled enabled);
diff --git a/system/main/shim/acl.cc b/system/main/shim/acl.cc
index dd27f3c..05e647e 100644
--- a/system/main/shim/acl.cc
+++ b/system/main/shim/acl.cc
@@ -39,6 +39,8 @@
#include "gd/hci/acl_manager/connection_management_callbacks.h"
#include "gd/hci/acl_manager/le_acl_connection.h"
#include "gd/hci/acl_manager/le_connection_management_callbacks.h"
+#include "gd/hci/address.h"
+#include "gd/hci/class_of_device.h"
#include "gd/hci/controller.h"
#include "gd/os/handler.h"
#include "gd/os/queue.h"
@@ -1173,6 +1175,20 @@
hci::ErrorCodeText(reason).c_str()));
}
+void shim::legacy::Acl::HACK_OnEscoConnectRequest(hci::Address address,
+ hci::ClassOfDevice cod) {
+ const RawAddress bd_addr = ToRawAddress(address);
+ LOG_ERROR("Remote ESCO connect request unsupported remote:%s",
+ PRIVATE_ADDRESS(bd_addr));
+}
+
+void shim::legacy::Acl::HACK_OnScoConnectRequest(hci::Address address,
+ hci::ClassOfDevice cod) {
+ const RawAddress bd_addr = ToRawAddress(address);
+ LOG_ERROR("Remote SCO connect request unsupported remote:%s",
+ PRIVATE_ADDRESS(bd_addr));
+}
+
void shim::legacy::Acl::OnLeConnectSuccess(
hci::AddressWithType address_with_type,
std::unique_ptr<hci::acl_manager::LeAclConnection> connection) {
diff --git a/system/main/shim/acl.h b/system/main/shim/acl.h
index 2a2db86..a5b6c64 100644
--- a/system/main/shim/acl.h
+++ b/system/main/shim/acl.h
@@ -23,6 +23,7 @@
#include "gd/hci/acl_manager/le_connection_callbacks.h"
#include "gd/hci/address.h"
#include "gd/hci/address_with_type.h"
+#include "gd/hci/class_of_device.h"
#include "gd/os/handler.h"
#include "gd/packet/raw_builder.h"
#include "main/shim/acl_legacy_interface.h"
@@ -47,6 +48,10 @@
void OnConnectSuccess(
std::unique_ptr<hci::acl_manager::ClassicAclConnection>) override;
void OnConnectFail(hci::Address, hci::ErrorCode reason) override;
+
+ void HACK_OnEscoConnectRequest(hci::Address, hci::ClassOfDevice) override;
+ void HACK_OnScoConnectRequest(hci::Address, hci::ClassOfDevice) override;
+
void OnClassicLinkDisconnected(uint16_t handle, hci::ErrorCode reason);
// hci::acl_manager::LeConnectionCallbacks