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

Commit 0dba16fe authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "L2CAP: Store dynamic channel connection requests when no link"

parents f01ffa2c cddd70ad
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -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());
@@ -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()) {
+1 −0
Original line number Diff line number Diff line
@@ -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);
};

+24 −20
Original line number Diff line number Diff line
@@ -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");
}
@@ -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");
@@ -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,
@@ -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,
@@ -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;
  }

@@ -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");
@@ -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) {
@@ -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_);
@@ -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_));
  }
}

+1 −1
Original line number Diff line number Diff line
@@ -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;