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

Commit 320c782e authored by Chris Manton's avatar Chris Manton
Browse files

Extend l2cap functionality for CoC

Keep packets flowing after reception
Add search for channel using remote id

Bug: 143697964
Test: Verified using wireshark

Change-Id: I238c23f58f215316223bf28548422759016bc8ab
parent e9d4c0e2
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -115,6 +115,15 @@ std::shared_ptr<DynamicChannelImpl> DynamicChannelAllocator::FindChannelByCid(Ci
  return channels_.find(cid)->second;
}

std::shared_ptr<DynamicChannelImpl> DynamicChannelAllocator::FindChannelByRemoteCid(Cid remote_cid) {
  for (auto& channel : channels_) {
    if (channel.second->GetRemoteCid() == remote_cid) {
      return channel.second;
    }
  }
  return nullptr;
}

size_t DynamicChannelAllocator::NumberOfChannels() const {
  return channels_.size();
}
+1 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ class DynamicChannelAllocator {
  bool IsPsmUsed(Psm psm) const;

  std::shared_ptr<DynamicChannelImpl> FindChannelByCid(Cid cid);
  std::shared_ptr<DynamicChannelImpl> FindChannelByRemoteCid(Cid cid);

  // Returns number of open, but not reserved channels
  size_t NumberOfChannels() const;
+16 −1
Original line number Diff line number Diff line
@@ -152,7 +152,7 @@ void ClassicSignallingManager::OnConnectionRequest(SignalId signal_id, Psm psm,
  dynamic_service_manager_->GetService(psm)->NotifyChannelCreation(std::move(channel));
}

void ClassicSignallingManager::OnConnectionResponse(SignalId signal_id, Cid cid, Cid remote_cid,
void ClassicSignallingManager::OnConnectionResponse(SignalId signal_id, Cid remote_cid, Cid cid,
                                                    ConnectionResponseResult result, ConnectionResponseStatus status) {
  if (pending_commands_.empty()) {
    LOG_WARN("Unexpected response: no pending request");
@@ -207,6 +207,15 @@ void ClassicSignallingManager::OnConfigurationResponse(SignalId signal_id, Cid c

  auto last_sent_command = std::move(pending_commands_.front());
  pending_commands_.pop();

  auto channel = channel_allocator_->FindChannelByRemoteCid(cid);
  if (channel == nullptr) {
    LOG_WARN("Configuration request for an unknown channel");
    return;
  }
  // TODO(cmanton) verify configuration parameters are satisfied
  // TODO(cmanton) Indicate channel is open if config params are agreed upon
  handle_send_next_command();
}

void ClassicSignallingManager::OnDisconnectionRequest(SignalId signal_id, Cid cid, Cid remote_cid) {
@@ -220,6 +229,7 @@ void ClassicSignallingManager::OnDisconnectionRequest(SignalId signal_id, Cid ci
  enqueue_buffer_->Enqueue(std::move(builder), handler_);
  channel->OnClosed(hci::ErrorCode::SUCCESS);
  link_->FreeDynamicChannel(cid);
  handle_send_next_command();
}

void ClassicSignallingManager::OnDisconnectionResponse(SignalId signal_id, Cid cid, Cid remote_cid) {
@@ -243,6 +253,7 @@ void ClassicSignallingManager::OnDisconnectionResponse(SignalId signal_id, Cid c

  channel->OnClosed(hci::ErrorCode::SUCCESS);
  link_->FreeDynamicChannel(cid);
  handle_send_next_command();
}

void ClassicSignallingManager::OnEchoRequest(SignalId signal_id, const PacketView<kLittleEndian>& packet) {
@@ -251,6 +262,7 @@ void ClassicSignallingManager::OnEchoRequest(SignalId signal_id, const PacketVie
  raw_builder->AddOctets(packet_vector);
  auto builder = EchoResponseBuilder::Create(signal_id.Value(), std::move(raw_builder));
  enqueue_buffer_->Enqueue(std::move(builder), handler_);
  handle_send_next_command();
}

void ClassicSignallingManager::OnEchoResponse(SignalId signal_id, const PacketView<kLittleEndian>& packet) {
@@ -265,6 +277,7 @@ void ClassicSignallingManager::OnEchoResponse(SignalId signal_id, const PacketVi
    return;
  }
  LOG_INFO("Echo response received");
  handle_send_next_command();
}

void ClassicSignallingManager::OnInformationRequest(SignalId signal_id, InformationRequestInfoType type) {
@@ -289,6 +302,7 @@ void ClassicSignallingManager::OnInformationRequest(SignalId signal_id, Informat
      return;
    }
  }
  handle_send_next_command();
}

void ClassicSignallingManager::OnInformationResponse(SignalId signal_id, const InformationResponseView& view) {
@@ -306,6 +320,7 @@ void ClassicSignallingManager::OnInformationResponse(SignalId signal_id, const I
  if (view.GetResult() != InformationRequestResult::SUCCESS) {
    return;
  }
  handle_send_next_command();
}

void ClassicSignallingManager::on_incoming_packet() {