Loading system/gd/l2cap/classic/internal/link_manager.cc +11 −1 Original line number Diff line number Diff line Loading @@ -88,7 +88,11 @@ void LinkManager::ConnectDynamicChannelServices(hci::Address device, auto* link = GetLink(device); if (link == nullptr) { acl_manager_->CreateConnection(device); // TODO: Resume the channel connection after link is established if (pending_dynamic_channels_.find(device) != pending_dynamic_channels_.end()) { pending_dynamic_channels_[device].push_back(psm); } else { pending_dynamic_channels_[device] = {psm}; } return; } link->SendConnectionRequest(psm, link->ReserveDynamicChannel()); Loading Loading @@ -121,6 +125,12 @@ void LinkManager::OnConnectSuccess(std::unique_ptr<hci::AclConnection> acl_conne fixed_channel_service.second->NotifyChannelCreation( std::make_unique<FixedChannel>(fixed_channel_impl, l2cap_handler_)); } if (pending_dynamic_channels_.find(device) != pending_dynamic_channels_.end()) { for (Psm psm : pending_dynamic_channels_[device]) { link->SendConnectionRequest(psm, link->ReserveDynamicChannel()); } pending_dynamic_channels_.erase(device); } // Remove device from pending links list, if any auto pending_link = pending_links_.find(device); if (pending_link == pending_links_.end()) { Loading system/gd/l2cap/classic/internal/link_manager.h +1 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,7 @@ class LinkManager : public hci::ConnectionCallbacks { // Internal states std::unordered_map<hci::Address, PendingLink> pending_links_; std::unordered_map<hci::Address, Link> links_; std::unordered_map<hci::Address, std::list<Psm>> pending_dynamic_channels_; DISALLOW_COPY_AND_ASSIGN(LinkManager); }; Loading system/gd/l2cap/classic/internal/signalling_manager.cc +24 −20 Original line number Diff line number Diff line Loading @@ -53,11 +53,11 @@ ClassicSignallingManager::~ClassicSignallingManager() { void ClassicSignallingManager::OnCommandReject(CommandRejectView command_reject_view) { SignalId signal_id = command_reject_view.GetIdentifier(); if (pending_command_.signal_id_ != signal_id) { if (last_sent_command_.signal_id_ != signal_id) { LOG_WARN("Unknown command reject"); return; } pending_command_ = {}; handle_send_next_command(); LOG_INFO("Command rejected"); } Loading Loading @@ -147,19 +147,20 @@ void ClassicSignallingManager::OnConnectionRequest(SignalId signal_id, Psm psm, void ClassicSignallingManager::OnConnectionResponse(SignalId signal_id, Cid cid, Cid remote_cid, ConnectionResponseResult result, ConnectionResponseStatus status) { if (pending_command_.signal_id_ != signal_id || pending_command_.command_code_ != CommandCode::CONNECTION_REQUEST) { if (last_sent_command_.signal_id_ != signal_id || last_sent_command_.command_code_ != CommandCode::CONNECTION_REQUEST) { LOG_WARN("Received unexpected connection response"); return; } if (pending_command_.source_cid_ != cid) { LOG_WARN("SCID doesn't match: expected %d, received %d", pending_command_.source_cid_, cid); if (last_sent_command_.source_cid_ != cid) { LOG_WARN("SCID doesn't match: expected %d, received %d", last_sent_command_.source_cid_, cid); return; } if (result != ConnectionResponseResult::SUCCESS) { return; } Psm pending_psm = pending_command_.psm_; pending_command_ = {}; Psm pending_psm = last_sent_command_.psm_; last_sent_command_ = {}; auto new_channel = link_->AllocateReservedDynamicChannel(cid, pending_psm, remote_cid, {}); if (new_channel == nullptr) { LOG_WARN("Can't allocate dynamic channel"); Loading @@ -169,6 +170,7 @@ void ClassicSignallingManager::OnConnectionResponse(SignalId signal_id, Cid cid, dynamic_service_manager_->GetService(pending_psm)->NotifyChannelCreation(std::move(channel)); SendConfigurationRequest(remote_cid, {}); alarm_.Cancel(); handle_send_next_command(); } void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid cid, Continuation is_continuation, Loading @@ -181,6 +183,7 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci auto response = ConfigurationResponseBuilder::Create(signal_id.Value(), cid, is_continuation, ConfigurationResponseResult::SUCCESS, {}); enqueue_buffer_->Enqueue(std::move(response), handler_); handle_send_next_command(); } void ClassicSignallingManager::OnConfigurationResponse(SignalId signal_id, Cid cid, Continuation is_continuation, Loading @@ -201,8 +204,8 @@ void ClassicSignallingManager::OnDisconnectionRequest(SignalId signal_id, Cid ci } void ClassicSignallingManager::OnDisconnectionResponse(SignalId signal_id, Cid cid, Cid remote_cid) { if (pending_command_.signal_id_ != signal_id || pending_command_.command_code_ != CommandCode::DISCONNECTION_REQUEST) { if (last_sent_command_.signal_id_ != signal_id || last_sent_command_.command_code_ != CommandCode::DISCONNECTION_REQUEST) { return; } Loading @@ -225,7 +228,7 @@ void ClassicSignallingManager::OnEchoRequest(SignalId signal_id, const PacketVie } void ClassicSignallingManager::OnEchoResponse(SignalId signal_id, const PacketView<kLittleEndian>& packet) { if (pending_command_.signal_id_ != signal_id || pending_command_.command_code_ != CommandCode::ECHO_REQUEST) { if (last_sent_command_.signal_id_ != signal_id || last_sent_command_.command_code_ != CommandCode::ECHO_REQUEST) { return; } LOG_INFO("Echo response received"); Loading Loading @@ -256,7 +259,8 @@ void ClassicSignallingManager::OnInformationRequest(SignalId signal_id, Informat } void ClassicSignallingManager::OnInformationResponse(SignalId signal_id, const InformationResponseView& view) { if (pending_command_.signal_id_ != signal_id || pending_command_.command_code_ != CommandCode::INFORMATION_REQUEST) { if (last_sent_command_.signal_id_ != signal_id || last_sent_command_.command_code_ != CommandCode::INFORMATION_REQUEST) { return; } if (view.GetResult() != InformationRequestResult::SUCCESS) { Loading Loading @@ -391,16 +395,16 @@ void ClassicSignallingManager::handle_send_next_command() { if (pending_commands_.empty()) { return; } pending_command_ = std::move(pending_commands_.front()); last_sent_command_ = std::move(pending_commands_.front()); pending_commands_.pop(); auto signal_id = pending_command_.signal_id_; auto psm = pending_command_.psm_; auto source_cid = pending_command_.source_cid_; auto destination_cid = pending_command_.destination_cid_; auto info_type = pending_command_.info_type_; auto config = std::move(pending_command_.config_); switch (pending_command_.command_code_) { auto signal_id = last_sent_command_.signal_id_; auto psm = last_sent_command_.psm_; auto source_cid = last_sent_command_.source_cid_; auto destination_cid = last_sent_command_.destination_cid_; auto info_type = last_sent_command_.info_type_; auto config = std::move(last_sent_command_.config_); switch (last_sent_command_.command_code_) { case CommandCode::CONNECTION_REQUEST: { auto builder = ConnectionRequestBuilder::Create(signal_id.Value(), psm, source_cid); enqueue_buffer_->Enqueue(std::move(builder), handler_); Loading Loading @@ -431,7 +435,7 @@ void ClassicSignallingManager::handle_send_next_command() { break; } default: LOG_WARN("Unsupported command code 0x%x", static_cast<int>(pending_command_.command_code_)); LOG_WARN("Unsupported command code 0x%x", static_cast<int>(last_sent_command_.command_code_)); } } Loading system/gd/l2cap/classic/internal/signalling_manager.h +1 −1 Original line number Diff line number Diff line Loading @@ -108,7 +108,7 @@ class ClassicSignallingManager { DynamicChannelAllocator* channel_allocator_; FixedChannelServiceManagerImpl* fixed_service_manager_; std::unique_ptr<os::EnqueueBuffer<packet::BasePacketBuilder>> enqueue_buffer_; PendingCommand pending_command_; PendingCommand last_sent_command_; std::queue<PendingCommand> pending_commands_; os::Alarm alarm_; SignalId next_signal_id_ = kInvalidSignalId; Loading Loading
system/gd/l2cap/classic/internal/link_manager.cc +11 −1 Original line number Diff line number Diff line Loading @@ -88,7 +88,11 @@ void LinkManager::ConnectDynamicChannelServices(hci::Address device, auto* link = GetLink(device); if (link == nullptr) { acl_manager_->CreateConnection(device); // TODO: Resume the channel connection after link is established if (pending_dynamic_channels_.find(device) != pending_dynamic_channels_.end()) { pending_dynamic_channels_[device].push_back(psm); } else { pending_dynamic_channels_[device] = {psm}; } return; } link->SendConnectionRequest(psm, link->ReserveDynamicChannel()); Loading Loading @@ -121,6 +125,12 @@ void LinkManager::OnConnectSuccess(std::unique_ptr<hci::AclConnection> acl_conne fixed_channel_service.second->NotifyChannelCreation( std::make_unique<FixedChannel>(fixed_channel_impl, l2cap_handler_)); } if (pending_dynamic_channels_.find(device) != pending_dynamic_channels_.end()) { for (Psm psm : pending_dynamic_channels_[device]) { link->SendConnectionRequest(psm, link->ReserveDynamicChannel()); } pending_dynamic_channels_.erase(device); } // Remove device from pending links list, if any auto pending_link = pending_links_.find(device); if (pending_link == pending_links_.end()) { Loading
system/gd/l2cap/classic/internal/link_manager.h +1 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,7 @@ class LinkManager : public hci::ConnectionCallbacks { // Internal states std::unordered_map<hci::Address, PendingLink> pending_links_; std::unordered_map<hci::Address, Link> links_; std::unordered_map<hci::Address, std::list<Psm>> pending_dynamic_channels_; DISALLOW_COPY_AND_ASSIGN(LinkManager); }; Loading
system/gd/l2cap/classic/internal/signalling_manager.cc +24 −20 Original line number Diff line number Diff line Loading @@ -53,11 +53,11 @@ ClassicSignallingManager::~ClassicSignallingManager() { void ClassicSignallingManager::OnCommandReject(CommandRejectView command_reject_view) { SignalId signal_id = command_reject_view.GetIdentifier(); if (pending_command_.signal_id_ != signal_id) { if (last_sent_command_.signal_id_ != signal_id) { LOG_WARN("Unknown command reject"); return; } pending_command_ = {}; handle_send_next_command(); LOG_INFO("Command rejected"); } Loading Loading @@ -147,19 +147,20 @@ void ClassicSignallingManager::OnConnectionRequest(SignalId signal_id, Psm psm, void ClassicSignallingManager::OnConnectionResponse(SignalId signal_id, Cid cid, Cid remote_cid, ConnectionResponseResult result, ConnectionResponseStatus status) { if (pending_command_.signal_id_ != signal_id || pending_command_.command_code_ != CommandCode::CONNECTION_REQUEST) { if (last_sent_command_.signal_id_ != signal_id || last_sent_command_.command_code_ != CommandCode::CONNECTION_REQUEST) { LOG_WARN("Received unexpected connection response"); return; } if (pending_command_.source_cid_ != cid) { LOG_WARN("SCID doesn't match: expected %d, received %d", pending_command_.source_cid_, cid); if (last_sent_command_.source_cid_ != cid) { LOG_WARN("SCID doesn't match: expected %d, received %d", last_sent_command_.source_cid_, cid); return; } if (result != ConnectionResponseResult::SUCCESS) { return; } Psm pending_psm = pending_command_.psm_; pending_command_ = {}; Psm pending_psm = last_sent_command_.psm_; last_sent_command_ = {}; auto new_channel = link_->AllocateReservedDynamicChannel(cid, pending_psm, remote_cid, {}); if (new_channel == nullptr) { LOG_WARN("Can't allocate dynamic channel"); Loading @@ -169,6 +170,7 @@ void ClassicSignallingManager::OnConnectionResponse(SignalId signal_id, Cid cid, dynamic_service_manager_->GetService(pending_psm)->NotifyChannelCreation(std::move(channel)); SendConfigurationRequest(remote_cid, {}); alarm_.Cancel(); handle_send_next_command(); } void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid cid, Continuation is_continuation, Loading @@ -181,6 +183,7 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci auto response = ConfigurationResponseBuilder::Create(signal_id.Value(), cid, is_continuation, ConfigurationResponseResult::SUCCESS, {}); enqueue_buffer_->Enqueue(std::move(response), handler_); handle_send_next_command(); } void ClassicSignallingManager::OnConfigurationResponse(SignalId signal_id, Cid cid, Continuation is_continuation, Loading @@ -201,8 +204,8 @@ void ClassicSignallingManager::OnDisconnectionRequest(SignalId signal_id, Cid ci } void ClassicSignallingManager::OnDisconnectionResponse(SignalId signal_id, Cid cid, Cid remote_cid) { if (pending_command_.signal_id_ != signal_id || pending_command_.command_code_ != CommandCode::DISCONNECTION_REQUEST) { if (last_sent_command_.signal_id_ != signal_id || last_sent_command_.command_code_ != CommandCode::DISCONNECTION_REQUEST) { return; } Loading @@ -225,7 +228,7 @@ void ClassicSignallingManager::OnEchoRequest(SignalId signal_id, const PacketVie } void ClassicSignallingManager::OnEchoResponse(SignalId signal_id, const PacketView<kLittleEndian>& packet) { if (pending_command_.signal_id_ != signal_id || pending_command_.command_code_ != CommandCode::ECHO_REQUEST) { if (last_sent_command_.signal_id_ != signal_id || last_sent_command_.command_code_ != CommandCode::ECHO_REQUEST) { return; } LOG_INFO("Echo response received"); Loading Loading @@ -256,7 +259,8 @@ void ClassicSignallingManager::OnInformationRequest(SignalId signal_id, Informat } void ClassicSignallingManager::OnInformationResponse(SignalId signal_id, const InformationResponseView& view) { if (pending_command_.signal_id_ != signal_id || pending_command_.command_code_ != CommandCode::INFORMATION_REQUEST) { if (last_sent_command_.signal_id_ != signal_id || last_sent_command_.command_code_ != CommandCode::INFORMATION_REQUEST) { return; } if (view.GetResult() != InformationRequestResult::SUCCESS) { Loading Loading @@ -391,16 +395,16 @@ void ClassicSignallingManager::handle_send_next_command() { if (pending_commands_.empty()) { return; } pending_command_ = std::move(pending_commands_.front()); last_sent_command_ = std::move(pending_commands_.front()); pending_commands_.pop(); auto signal_id = pending_command_.signal_id_; auto psm = pending_command_.psm_; auto source_cid = pending_command_.source_cid_; auto destination_cid = pending_command_.destination_cid_; auto info_type = pending_command_.info_type_; auto config = std::move(pending_command_.config_); switch (pending_command_.command_code_) { auto signal_id = last_sent_command_.signal_id_; auto psm = last_sent_command_.psm_; auto source_cid = last_sent_command_.source_cid_; auto destination_cid = last_sent_command_.destination_cid_; auto info_type = last_sent_command_.info_type_; auto config = std::move(last_sent_command_.config_); switch (last_sent_command_.command_code_) { case CommandCode::CONNECTION_REQUEST: { auto builder = ConnectionRequestBuilder::Create(signal_id.Value(), psm, source_cid); enqueue_buffer_->Enqueue(std::move(builder), handler_); Loading Loading @@ -431,7 +435,7 @@ void ClassicSignallingManager::handle_send_next_command() { break; } default: LOG_WARN("Unsupported command code 0x%x", static_cast<int>(pending_command_.command_code_)); LOG_WARN("Unsupported command code 0x%x", static_cast<int>(last_sent_command_.command_code_)); } } Loading
system/gd/l2cap/classic/internal/signalling_manager.h +1 −1 Original line number Diff line number Diff line Loading @@ -108,7 +108,7 @@ class ClassicSignallingManager { DynamicChannelAllocator* channel_allocator_; FixedChannelServiceManagerImpl* fixed_service_manager_; std::unique_ptr<os::EnqueueBuffer<packet::BasePacketBuilder>> enqueue_buffer_; PendingCommand pending_command_; PendingCommand last_sent_command_; std::queue<PendingCommand> pending_commands_; os::Alarm alarm_; SignalId next_signal_id_ = kInvalidSignalId; Loading