12#ifndef STACK_RLC_AM_BUFFER_RLCSDUSLIDINGWINDOWRECEPTIONBUFFER_H_
13#define STACK_RLC_AM_BUFFER_RLCSDUSLIDINGWINDOWRECEPTIONBUFFER_H_
16#include <inet/common/packet/Packet.h>
22#include "simu5g/stack/rlc/LteRlcDefs.h"
35 return start < other.start;
42struct SduReassemblyState {
44 inet::Packet *sduPointer;
45 std::list<ByteInterval> receivedIntervals;
48 SduReassemblyState(uint32_t length, inet::Packet *ptr)
49 : totalLength(length), sduPointer(ptr), isComplete(
false) {}
55 std::pair<bool, bool>
addSegment(uint32_t start, uint32_t end) {
58 if (end >= totalLength)
59 end = totalLength - 1;
62 for (
const auto &interval : receivedIntervals) {
63 if (start >= interval.start && end <= interval.end)
64 return {
false, isComplete};
68 auto it = std::lower_bound(receivedIntervals.begin(), receivedIntervals.end(), newInterval);
69 receivedIntervals.insert(it, newInterval);
72 for (
auto current = receivedIntervals.begin(); current != receivedIntervals.end(); ) {
73 auto next = std::next(current);
74 if (next != receivedIntervals.end() && next->start <= current->end + 1) {
75 current->end = std::max(current->end, next->end);
76 receivedIntervals.erase(next);
84 if (!receivedIntervals.empty()) {
85 const auto &first = receivedIntervals.front();
86 if (first.start == 0 && first.end == totalLength - 1)
90 return {
true, isComplete};
97 if (receivedIntervals.empty())
99 if (receivedIntervals.size() > 1)
101 return receivedIntervals.front().start != 0;
105class RlcSduSlidingWindowReceptionBuffer :
public omnetpp::cObject
108 RlcSduSlidingWindowReceptionBuffer(uint32_t windowSize,
const std::string &name);
109 ~RlcSduSlidingWindowReceptionBuffer()
override;
115 std::pair<bool, bool> handleSegment(uint32_t sn, uint32_t totalSduLength,
116 uint32_t start, uint32_t end,
117 inet::Packet *sduDataPtr);
120 virtual inet::Packet *consumeSdu(uint32_t sn);
123 virtual bool hasMissingByteSegmentBeforeLast(uint32_t sn);
126 virtual void handleReassemblyTimerExpiry(uint32_t rxNextStatusTrigger);
129 virtual StatusPduData generateStatusPduData();
132 virtual void updateRxHighestStatus();
135 virtual void updateRxNext();
137 virtual bool isReady(uint32_t sn)
const {
138 auto it = sduBuffer_.find(sn);
139 return it != sduBuffer_.end() && it->second.isComplete;
142 virtual bool inWindow(uint32_t sn)
const {
143 return sn >= rxNext_ && sn < rxNext_ + amWindowSize_;
146 virtual bool aboveWindow(uint32_t sn)
const {
147 return sn >= rxNext_ + amWindowSize_;
150 void discardSdu(uint32_t sn) { sduBuffer_.erase(sn); }
152 uint32_t getRxNext()
const {
return rxNext_; }
153 uint32_t getRxNextHighest()
const {
return rxNextHighest_; }
154 uint32_t getRxHighestStatus()
const {
return rxHighestStatus_; }
157 std::map<uint32_t, SduReassemblyState> sduBuffer_;
160 uint32_t rxNext_ = 0;
161 uint32_t rxNextHighest_ = 0;
162 uint32_t rxHighestStatus_ = 0;
163 uint32_t amWindowSize_;
164 uint32_t consumed_ = 0;
Definition AlertReceiver.h:24
Represents a range of bytes [start, end] within an SDU.
Definition RlcSduSlidingWindowReceptionBuffer.h:29
std::pair< bool, bool > addSegment(uint32_t start, uint32_t end)
Adds a new byte interval and merges overlapping or adjacent intervals.
Definition RlcSduSlidingWindowReceptionBuffer.h:55
bool hasMissingByteSegmentBeforeLast() const
Checks if there is a missing byte segment before the last byte of all received segments....
Definition RlcSduSlidingWindowReceptionBuffer.h:96