Loading system/gd/hci/acl_manager/classic_impl.h +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading system/gd/hci/acl_manager/connection_callbacks.h +4 −0 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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 Loading system/gd/hci/acl_manager_test.cc +30 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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_; Loading Loading @@ -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)); Loading Loading @@ -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 Loading system/gd/hci/facade/acl_manager_facade.cc +10 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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( Loading system/gd/l2cap/classic/internal/link_manager.cc +9 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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 Loading
system/gd/hci/acl_manager/classic_impl.h +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
system/gd/hci/acl_manager/connection_callbacks.h +4 −0 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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 Loading
system/gd/hci/acl_manager_test.cc +30 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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_; Loading Loading @@ -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)); Loading Loading @@ -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 Loading
system/gd/hci/facade/acl_manager_facade.cc +10 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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( Loading
system/gd/l2cap/classic/internal/link_manager.cc +9 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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