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

Commit bfdadcb3 authored by Hansong Zhang's avatar Hansong Zhang
Browse files

Route SCO packets in HCI manager

Test: cert/run
Tag: #refactor
Bug: 195344796
Change-Id: I4dff6522cf2e501e301669a22a7df133092fd8ca
parent 70333c8f
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -75,6 +75,10 @@ class FuzzHciLayer : public HciLayer {
    return iso_queue_.GetUpEnd();
  }

  common::BidiQueueEnd<hci::ScoBuilder, hci::ScoView>* GetScoQueueEnd() override {
    return sco_queue_.GetUpEnd();
  }

  void RegisterEventHandler(hci::EventCode event, common::ContextualCallback<void(hci::EventView)> handler) override {
    event_handlers_[event] = handler;
  }
@@ -161,6 +165,7 @@ class FuzzHciLayer : public HciLayer {
  FuzzedDataProvider* auto_reply_fdp;

  common::BidiQueue<hci::AclView, hci::AclBuilder> acl_queue_{3};
  common::BidiQueue<hci::ScoView, hci::ScoBuilder> sco_queue_{3};
  common::BidiQueue<hci::IsoView, hci::IsoBuilder> iso_queue_{3};
  os::fuzz::DevNullQueue<AclBuilder>* acl_dev_null_;
  os::fuzz::FuzzInjectQueue<AclView>* acl_inject_;
+22 −1
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ struct HciLayer::impl {

  ~impl() {
    incoming_acl_buffer_.Clear();
    incoming_sco_buffer_.Clear();
    incoming_iso_buffer_.Clear();
    if (hci_timeout_alarm_ != nullptr) {
      delete hci_timeout_alarm_;
@@ -120,6 +121,14 @@ struct HciLayer::impl {
    hal_->sendAclData(bytes);
  }

  void on_outbound_sco_ready() {
    auto packet = sco_queue_.GetDownEnd()->TryDequeue();
    std::vector<uint8_t> bytes;
    BitInserter bi(bytes);
    packet->Serialize(bi);
    hal_->sendScoData(bytes);
  }

  void on_outbound_iso_ready() {
    auto packet = iso_queue_.GetDownEnd()->TryDequeue();
    std::vector<uint8_t> bytes;
@@ -349,6 +358,10 @@ struct HciLayer::impl {
  BidiQueue<AclView, AclBuilder> acl_queue_{3 /* TODO: Set queue depth */};
  os::EnqueueBuffer<AclView> incoming_acl_buffer_{acl_queue_.GetDownEnd()};

  // SCO packets
  BidiQueue<ScoView, ScoBuilder> sco_queue_{3 /* TODO: Set queue depth */};
  os::EnqueueBuffer<ScoView> incoming_sco_buffer_{sco_queue_.GetDownEnd()};

  // ISO packets
  BidiQueue<IsoView, IsoBuilder> iso_queue_{3 /* TODO: Set queue depth */};
  os::EnqueueBuffer<IsoView> incoming_iso_buffer_{iso_queue_.GetDownEnd()};
@@ -371,7 +384,9 @@ struct HciLayer::hal_callbacks : public hal::HciHalCallbacks {
  }

  void scoDataReceived(hal::HciPacket data_bytes) override {
    // Not implemented yet
    auto packet = packet::PacketView<packet::kLittleEndian>(std::make_shared<std::vector<uint8_t>>(move(data_bytes)));
    auto sco = std::make_unique<ScoView>(ScoView::Create(packet));
    module_.impl_->incoming_sco_buffer_.Enqueue(move(sco), module_.GetHandler());
  }

  void isoDataReceived(hal::HciPacket data_bytes) override {
@@ -392,6 +407,10 @@ common::BidiQueueEnd<AclBuilder, AclView>* HciLayer::GetAclQueueEnd() {
  return impl_->acl_queue_.GetUpEnd();
}

common::BidiQueueEnd<ScoBuilder, ScoView>* HciLayer::GetScoQueueEnd() {
  return impl_->sco_queue_.GetUpEnd();
}

common::BidiQueueEnd<IsoBuilder, IsoView>* HciLayer::GetIsoQueueEnd() {
  return impl_->iso_queue_.GetUpEnd();
}
@@ -539,6 +558,7 @@ void HciLayer::Start() {

  Handler* handler = GetHandler();
  impl_->acl_queue_.GetDownEnd()->RegisterDequeue(handler, BindOn(impl_, &impl::on_outbound_acl_ready));
  impl_->sco_queue_.GetDownEnd()->RegisterDequeue(handler, BindOn(impl_, &impl::on_outbound_sco_ready));
  impl_->iso_queue_.GetDownEnd()->RegisterDequeue(handler, BindOn(impl_, &impl::on_outbound_iso_ready));
  RegisterEventHandler(EventCode::COMMAND_COMPLETE, handler->BindOn(impl_, &impl::on_command_complete));
  RegisterEventHandler(EventCode::COMMAND_STATUS, handler->BindOn(impl_, &impl::on_command_status));
@@ -564,6 +584,7 @@ void HciLayer::Stop() {
  delete hal_callbacks_;

  impl_->acl_queue_.GetDownEnd()->UnregisterDequeue();
  impl_->sco_queue_.GetDownEnd()->UnregisterDequeue();
  impl_->iso_queue_.GetDownEnd()->UnregisterDequeue();
  delete impl_;
}
+2 −0
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ class HciLayer : public Module, public CommandInterface<CommandBuilder> {

  virtual common::BidiQueueEnd<AclBuilder, AclView>* GetAclQueueEnd();

  virtual common::BidiQueueEnd<ScoBuilder, ScoView>* GetScoQueueEnd();

  virtual common::BidiQueueEnd<IsoBuilder, IsoView>* GetIsoQueueEnd();

  virtual void RegisterEventHandler(EventCode event_code, common::ContextualCallback<void(EventView)> event_handler);