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

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

L2CAP ERTM initial commit

Test: compiles
Bug: 143963260
Change-Id: Ica0c7dcf9c39774a83c3340d8377af9bbc5bce83
parent 935fbc39
Loading
Loading
Loading
Loading
+845 −2

File changed.

Preview size limit exceeded, changes collapsed.

+53 −0
Original line number Diff line number Diff line
@@ -43,16 +43,69 @@ class ErtmController : public DataController {
  using UpperQueueDownEnd = common::BidiQueueEnd<UpperEnqueue, UpperDequeue>;
  ErtmController(Cid cid, Cid remote_cid, UpperQueueDownEnd* channel_queue_end, os::Handler* handler,
                 Scheduler* scheduler);
  ~ErtmController();
  // Segmentation is handled here
  void OnSdu(std::unique_ptr<packet::BasePacketBuilder> sdu) override;
  void OnPdu(BasicFrameView pdu) override;
  std::unique_ptr<BasicFrameBuilder> GetNextPacket() override;

 private:
  [[maybe_unused]] Cid cid_;
  [[maybe_unused]] Cid remote_cid_;
  [[maybe_unused]] os::EnqueueBuffer<UpperEnqueue> enqueue_buffer_;
  [[maybe_unused]] os::Handler* handler_;
  std::queue<std::unique_ptr<BasicFrameBuilder>> pdu_queue_;
  [[maybe_unused]] Scheduler* scheduler_;
  // TODO: Support FCS
  [[maybe_unused]] FcsType fcs_type_ = FcsType::NO_FCS;

  class PacketViewForReassembly : public packet::PacketView<kLittleEndian> {
   public:
    PacketViewForReassembly(const PacketView& packetView) : PacketView(packetView) {}
    PacketViewForReassembly(nullptr_t) : PacketView(nullptr) {}
    void AppendPacketView(packet::PacketView<kLittleEndian> to_append) {
      Append(to_append);
    }
  };

  class CopyablePacketBuilder : public packet::BasePacketBuilder {
   public:
    CopyablePacketBuilder(std::unique_ptr<packet::BasePacketBuilder> builder) : builder_(builder.release()) {}

    void Serialize(BitInserter& it) const override;

    size_t size() const override;

    std::unique_ptr<packet::BasePacketBuilder> Create();

   private:
    std::shared_ptr<packet::BasePacketBuilder> builder_;
  };

  PacketViewForReassembly reassembly_stage_{nullptr};
  SegmentationAndReassembly sar_state_ = SegmentationAndReassembly::END;

  void stage_for_reassembly(SegmentationAndReassembly sar, const packet::PacketView<kLittleEndian>& payload);
  void send_pdu(std::unique_ptr<BasicFrameBuilder> pdu);

  void close_channel();

  // Configuration options
  // TODO: Configure these number
  [[maybe_unused]] uint16_t local_tx_window_ = 10;
  [[maybe_unused]] uint16_t local_max_transmit_ = 20;
  [[maybe_unused]] uint16_t local_retransmit_timeout_ms_ = 2000;
  [[maybe_unused]] uint16_t local_monitor_timeout_ms_ = 12000;
  [[maybe_unused]] uint16_t local_mps_ = 1010;

  [[maybe_unused]] uint16_t remote_tx_window_ = 10;
  [[maybe_unused]] uint16_t remote_max_transmit_ = 20;
  [[maybe_unused]] uint16_t remote_retransmit_timeout_ms_ = 2000;
  [[maybe_unused]] uint16_t remote_monitor_timeout_ms_ = 12000;
  [[maybe_unused]] uint16_t remote_mps_ = 1010;

  struct impl;
  std::unique_ptr<impl> pimpl_;
};

}  // namespace internal