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