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

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

L2CAP ERTM: Close channel on error

Add a reference to ILink to send disconnection request.

Bug: 145006212
Test: bluetooth_test_gd
Change-Id: I2214cc0f69d7a1281e92f60c92a23484f4f3766d
parent 0173eb15
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -34,8 +34,9 @@ Link::Link(os::Handler* l2cap_handler, std::unique_ptr<hci::AclConnection> acl_c
           DynamicChannelServiceManagerImpl* dynamic_service_manager,
           FixedChannelServiceManagerImpl* fixed_service_manager)
    : l2cap_handler_(l2cap_handler), acl_connection_(std::move(acl_connection)),
      data_pipeline_manager_(l2cap_handler, acl_connection_->GetAclQueueEnd()), parameter_provider_(parameter_provider),
      dynamic_service_manager_(dynamic_service_manager), fixed_service_manager_(fixed_service_manager),
      data_pipeline_manager_(l2cap_handler, this, acl_connection_->GetAclQueueEnd()),
      parameter_provider_(parameter_provider), dynamic_service_manager_(dynamic_service_manager),
      fixed_service_manager_(fixed_service_manager),
      signalling_manager_(l2cap_handler_, this, &data_pipeline_manager_, dynamic_service_manager_,
                          &dynamic_channel_allocator_, fixed_service_manager_) {
  ASSERT(l2cap_handler_ != nullptr);
+0 −1
Original line number Diff line number Diff line
@@ -112,7 +112,6 @@ class ClassicSignallingManager {
  l2cap::internal::DynamicChannelAllocator* channel_allocator_;
  FixedChannelServiceManagerImpl* fixed_service_manager_;
  std::unique_ptr<os::EnqueueBuffer<packet::BasePacketBuilder>> enqueue_buffer_;
  PendingCommand last_sent_command_;
  std::queue<PendingCommand> pending_commands_;
  os::Alarm alarm_;
  SignalId next_signal_id_ = kInitialSignalId;
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ namespace internal {
void DataPipelineManager::AttachChannel(Cid cid, std::shared_ptr<ChannelImpl> channel) {
  ASSERT(sender_map_.find(cid) == sender_map_.end());
  sender_map_.emplace(std::piecewise_construct, std::forward_as_tuple(cid),
                      std::forward_as_tuple(handler_, scheduler_.get(), channel));
                      std::forward_as_tuple(handler_, link_, scheduler_.get(), channel));
}

void DataPipelineManager::DetachChannel(Cid cid) {
+5 −3
Original line number Diff line number Diff line
@@ -39,11 +39,12 @@
namespace bluetooth {
namespace l2cap {
namespace internal {
class ILink;

/**
 * Manages data pipeline from channel queue end to link queue end, per link.
 * Contains a Scheduler and Receiver per link.
 * Contains a Sender and its corrsponding DataController per attached channel.
 * Contains a Sender and its corresponding DataController per attached channel.
 */
class DataPipelineManager {
 public:
@@ -54,8 +55,8 @@ class DataPipelineManager {
  using LowerDequeue = UpperEnqueue;
  using LowerQueueUpEnd = common::BidiQueueEnd<LowerEnqueue, LowerDequeue>;

  DataPipelineManager(os::Handler* handler, LowerQueueUpEnd* link_queue_up_end)
      : handler_(handler), scheduler_(std::make_unique<Fifo>(this, link_queue_up_end, handler)),
  DataPipelineManager(os::Handler* handler, ILink* link, LowerQueueUpEnd* link_queue_up_end)
      : handler_(handler), link_(link), scheduler_(std::make_unique<Fifo>(this, link_queue_up_end, handler)),
        receiver_(link_queue_up_end, handler, this) {}

  virtual void AttachChannel(Cid cid, std::shared_ptr<ChannelImpl> channel);
@@ -67,6 +68,7 @@ class DataPipelineManager {

 private:
  os::Handler* handler_;
  ILink* link_;
  std::unique_ptr<Scheduler> scheduler_;
  Receiver receiver_;
  std::unordered_map<Cid, Sender> sender_map_;
+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ namespace testing {
class MockDataPipelineManager : public DataPipelineManager {
 public:
  MockDataPipelineManager(os::Handler* handler, LowerQueueUpEnd* link_queue_up_end)
      : DataPipelineManager(handler, link_queue_up_end) {}
      : DataPipelineManager(handler, nullptr, link_queue_up_end) {}
  MOCK_METHOD(void, AttachChannel, (Cid, std::shared_ptr<ChannelImpl>), (override));
  MOCK_METHOD(void, DetachChannel, (Cid), (override));
  MOCK_METHOD(DataController*, GetDataController, (Cid), (override));
Loading