Skip to content

Commit 27337db

Browse files
committed
Rlc: converting LteRlcSdu chunk to tag
As it is not real packet data, just metadata for communication between protocol layers (RLC to MAC and PacketFlowManager). Supposed to be removed in MAC after it served its purposed, but that's not so easy due to packet nesting.
1 parent 3938a88 commit 27337db

File tree

17 files changed

+101
-88
lines changed

17 files changed

+101
-88
lines changed

src/simu5g/stack/mac/LteMacEnb.cc

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "simu5g/stack/rlc/packet/LteRlcPdu_m.h"
3535
#include "simu5g/stack/rlc/packet/LteRlcPdu_m.h"
3636
#include "simu5g/stack/rlc/packet/LteRlcNewDataTag_m.h"
37+
#include "simu5g/stack/rlc/packet/PdcpTrackingTag_m.h"
3738
#include "simu5g/stack/packetFlowManager/PacketFlowManagerBase.h"
3839
#include "simu5g/stack/rlc/um/LteRlcUm.h"
3940
#include "simu5g/stack/pdcp/NrPdcpEnb.h"
@@ -562,6 +563,13 @@ void LteMacEnb::macPduMake(MacCid cid)
562563
ASSERT(pkt != nullptr);
563564

564565
drop(pkt);
566+
567+
// Remove PdcpTrackingTag as it's no longer needed below MAC layer
568+
// TODO It won't succeed if tag is on a packet *inside* an lteRlcFragment,
569+
// but removing those would be very complicated. Tag will be removed anyway
570+
// on the receiver side.
571+
pkt->removeTagIfPresent<PdcpTrackingTag>();
572+
565573
auto macPkt = macPacket->removeAtFront<LteMacPdu>();
566574
macPkt->pushSdu(pkt);
567575
macPacket->insertAtFront(macPkt);
@@ -678,8 +686,8 @@ bool LteMacEnb::bufferizePacket(cPacket *cpkt)
678686
// build the virtual packet corresponding to this incoming packet
679687
// remove the tag since it's just a notification
680688
pkt->removeTag<LteRlcNewDataTag>();
681-
auto rlcSdu = pkt->peekAtFront<LteRlcSdu>();
682-
PacketInfo vpkt(rlcSdu->getLengthMainPacket(), pkt->getTimestamp());
689+
auto pdcpTag = pkt->getTag<PdcpTrackingTag>();
690+
PacketInfo vpkt(pdcpTag->getOriginalPacketLength(), pkt->getTimestamp());
683691
vqueue->pushBack(vpkt);
684692

685693
delete pkt;

src/simu5g/stack/mac/LteMacUe.cc

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
#include "simu5g/stack/mac/packet/LteSchedulingGrant.h"
2323
#include "simu5g/stack/mac/scheduler/LteSchedulerUeUl.h"
2424
#include "simu5g/stack/rlc/packet/LteRlcPdu_m.h"
25-
#include "simu5g/stack/rlc/packet/LteRlcSdu_m.h"
2625
#include "simu5g/stack/rlc/packet/LteRlcNewDataTag_m.h"
26+
#include "simu5g/stack/rlc/packet/PdcpTrackingTag_m.h"
2727

2828
namespace simu5g {
2929

@@ -272,8 +272,8 @@ bool LteMacUe::bufferizePacket(cPacket *cpkt)
272272
pkt->removeTag<LteRlcNewDataTag>();
273273
// update the virtual buffer for this connection
274274
// build the virtual packet corresponding to this incoming packet
275-
auto rlcSdu = pkt->peekAtFront<LteRlcSdu>();
276-
PacketInfo vpkt(rlcSdu->getLengthMainPacket(), pkt->getTimestamp());
275+
auto pdcpTag = pkt->getTag<PdcpTrackingTag>();
276+
PacketInfo vpkt(pdcpTag->getOriginalPacketLength(), pkt->getTimestamp());
277277
vqueue->pushBack(vpkt);
278278

279279
delete pkt;
@@ -378,6 +378,12 @@ void LteMacUe::macPduMake(MacCid cid)
378378
auto pkt = check_and_cast<Packet *>(connInfo.queue->popFront());
379379
drop(pkt);
380380

381+
// Remove PdcpTrackingTag as it's no longer needed below MAC layer
382+
// TODO It won't succeed if tag is on a packet *inside* an lteRlcFragment,
383+
// but removing those would be very complicated. Tag will be removed anyway
384+
// on the receiver side.
385+
pkt->removeTagIfPresent<PdcpTrackingTag>();
386+
381387
auto macPdu = macPkt->removeAtFront<LteMacPdu>();
382388
macPdu->pushSdu(pkt);
383389
macPkt->insertAtFront(macPdu);

src/simu5g/stack/packetFlowManager/PacketFlowManagerEnb.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include "simu5g/stack/pdcp/LtePdcp.h"
1515
#include "simu5g/stack/rlc/LteRlcDefs.h"
1616
#include "simu5g/stack/rlc/packet/LteRlcPdu_m.h"
17-
#include "simu5g/stack/rlc/packet/LteRlcSdu_m.h"
17+
#include "simu5g/stack/rlc/packet/PdcpTrackingTag_m.h"
1818
#include "simu5g/stack/mac/packet/LteMacPdu.h"
1919
#include "simu5g/common/LteCommon.h"
2020

@@ -264,8 +264,9 @@ void PacketFlowManagerEnb::insertRlcPdu(LogicalCid lcid, const inet::Ptr<LteRlcU
264264

265265
FramingInfo fi = rlcPdu->getFramingInfo();
266266
for (size_t idx = 0; idx < rlcPdu->getNumSdu(); ++idx) {
267-
auto rlcSdu = rlcPdu->getSdu(idx)->peekAtFront<LteRlcSdu>();
268-
unsigned int pdcpSno = rlcSdu->getSnoMainPacket();
267+
auto sduPacket = rlcPdu->getSdu(idx);
268+
auto pdcpTag = sduPacket->getTag<PdcpTrackingTag>();
269+
unsigned int pdcpSno = pdcpTag->getPdcpSequenceNumber();
269270
size_t pdcpPduLength = rlcPdu->getSduSize(idx); // TODO fix with size of the chunk!!
270271

271272
EV << "PacketFlowManagerEnb::insertRlcPdu - pdcpSdu " << pdcpSno << " with length: " << pdcpPduLength << " bytes" << endl;
@@ -865,4 +866,3 @@ void PacketFlowManagerEnb::finish()
865866
}
866867

867868
} //namespace
868-

src/simu5g/stack/packetFlowManager/PacketFlowManagerUe.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include "simu5g/stack/pdcp/LtePdcp.h"
1515
#include "simu5g/stack/rlc/LteRlcDefs.h"
1616
#include "simu5g/stack/rlc/packet/LteRlcPdu_m.h"
17-
#include "simu5g/stack/rlc/packet/LteRlcSdu_m.h"
17+
#include "simu5g/stack/rlc/packet/PdcpTrackingTag_m.h"
1818
#include "simu5g/stack/mac/packet/LteMacPdu.h"
1919

2020
#include "simu5g/common/LteControlInfo.h"
@@ -161,8 +161,9 @@ void PacketFlowManagerUe::insertRlcPdu(LogicalCid lcid, const inet::Ptr<LteRlcUm
161161

162162
FramingInfo fi = rlcPdu->getFramingInfo();
163163
for (size_t idx = 0; idx < rlcPdu->getNumSdu(); ++idx) {
164-
auto rlcSdu = rlcPdu->getSdu(idx)->peekAtFront<LteRlcSdu>();
165-
unsigned int pdcpSno = rlcSdu->getSnoMainPacket();
164+
auto sduPacket = rlcPdu->getSdu(idx);
165+
auto pdcpTag = sduPacket->getTag<PdcpTrackingTag>();
166+
unsigned int pdcpSno = pdcpTag->getPdcpSequenceNumber();
166167
size_t pdcpPduLength = rlcPdu->getSduSize(idx); // TODO fix with size of the chunk!!
167168

168169
EV << pfmType << "::insertRlcPdu - pdcpSdu " << pdcpSno << " with length: " << pdcpPduLength << " bytes" << endl;
@@ -505,4 +506,3 @@ void PacketFlowManagerUe::finish()
505506
}
506507

507508
} //namespace
508-

src/simu5g/stack/pdcp/LtePdcp.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "simu5g/stack/packetFlowManager/PacketFlowManagerBase.h"
1919
#include "simu5g/stack/pdcp/packet/LteRohcPdu_m.h"
20+
#include "simu5g/stack/rlc/packet/PdcpTrackingTag_m.h"
2021

2122
namespace simu5g {
2223

@@ -195,6 +196,8 @@ void LtePdcpBase::fromLowerLayer(cPacket *pktAux)
195196
auto pkt = check_and_cast<Packet *>(pktAux);
196197
emit(receivedPacketFromLowerLayerSignal_, pkt);
197198

199+
ASSERT(pkt->findTag<PdcpTrackingTag>() == nullptr);
200+
198201
auto lteInfo = pkt->getTag<FlowControlInfo>();
199202

200203
MacCid cid = MacCid(lteInfo->getSourceId(), lteInfo->getLcid());

src/simu5g/stack/rlc/am/AmRxQueue.cc

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "simu5g/common/LteControlInfo.h"
1616
#include "simu5g/stack/mac/LteMacBase.h"
1717
#include "simu5g/stack/rlc/am/LteRlcAm.h"
18+
#include "simu5g/stack/rlc/packet/PdcpTrackingTag_m.h"
1819

1920
namespace simu5g {
2021

@@ -353,10 +354,6 @@ void AmRxQueue::passUp(const int index)
353354

354355
pkt->trim();
355356

356-
auto sdu = pkt->popAtFront<LteRlcAmSdu>();
357-
358-
EV << NOW << " AmRxQueue::passUp passing up SDU[" << sdu->getSnoMainPacket() << "] referenced by PDU at position " << index << endl;
359-
360357
auto ci = pkt->getTag<FlowControlInfo>();
361358

362359
Direction dir = (Direction)ci->getDirection();
@@ -717,4 +714,3 @@ AmRxQueue::~AmRxQueue()
717714
}
718715

719716
} //namespace
720-

src/simu5g/stack/rlc/am/AmRxQueue.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#include "simu5g/stack/rlc/LteRlcDefs.h"
2121
#include "simu5g/stack/rlc/am/LteRlcAm.h"
2222
#include "simu5g/stack/rlc/packet/LteRlcPdu_m.h"
23-
#include "simu5g/stack/rlc/packet/LteRlcSdu_m.h"
2423

2524
namespace simu5g {
2625

@@ -145,4 +144,3 @@ class AmRxQueue : public cSimpleModule
145144
} //namespace
146145

147146
#endif
148-

src/simu5g/stack/rlc/am/AmTxQueue.cc

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "simu5g/stack/rlc/am/AmTxQueue.h"
1313
#include "simu5g/stack/rlc/am/LteRlcAm.h"
1414
#include "simu5g/stack/mac/LteMacBase.h"
15+
#include "simu5g/stack/rlc/packet/PdcpTrackingTag_m.h"
1516

1617
namespace simu5g {
1718

@@ -81,8 +82,7 @@ AmTxQueue::~AmTxQueue()
8182
void AmTxQueue::enque(Packet *pkt)
8283
{
8384
EV << NOW << " AmTxQueue::enque - inserting new SDU " << endl;
84-
// Buffer the SDU
85-
auto sdu = pkt->peekAtFront<LteRlcAmSdu>();
85+
8686
sduQueue_.insert(pkt);
8787

8888
// Check if there are waiting SDUs
@@ -101,7 +101,7 @@ std::deque<Packet *> *AmTxQueue::fragmentFrame(Packet *frame, std::deque<int>& w
101101
EV_DEBUG << "Fragmenting " << *frame << " into " << rlcFragDesc.totalFragments_ << " fragments.\n";
102102
B offset = B(0);
103103
std::deque<Packet *> *fragments = new std::deque<Packet *>();
104-
const auto& frameHeader = frame->peekAtFront<LteRlcAmSdu>();
104+
auto pdcpTag = frame->getTag<PdcpTrackingTag>();
105105
windowsIndex.clear();
106106
RlcWindowDesc tmp = txWindowDesc_;
107107
B fragUnit = B(rlcFragDesc.fragUnit_);
@@ -122,7 +122,7 @@ std::deque<Packet *> *AmTxQueue::fragmentFrame(Packet *frame, std::deque<int>& w
122122
pdu->setSnoFragment(tmp.seqNum_);
123123
pdu->setFirstSn(rlcFragDesc.firstSn_);
124124
pdu->setLastSn(rlcFragDesc.firstSn_ + rlcFragDesc.totalFragments_ - 1);
125-
pdu->setSnoMainPacket(frameHeader->getSnoMainPacket());
125+
pdu->setSnoMainPacket(pdcpTag->getPdcpSequenceNumber());
126126
pdu->setTxNumber(0);
127127
fragment->insertAtFront(pdu);
128128
EV_TRACE << "Created " << *fragment << " fragment.\n";
@@ -160,7 +160,6 @@ void AmTxQueue::addPdus()
160160
EV << NOW << " AmTxQueue::addPdus - No pending SDU has been found" << endl;
161161
// Get the first available SDU (buffer has already been checked to be non-empty)
162162
auto pkt = check_and_cast<Packet *>(sduQueue_.pop());
163-
auto header = pkt->peekAtFront<LteRlcAmSdu>();
164163

165164
int nrFragments = ceil((double)pkt->getByteLength() / (double)fragDesc_.fragUnit_);
166165

@@ -809,4 +808,3 @@ void AmTxQueue::handleMessage(cMessage *msg)
809808
}
810809

811810
} //namespace
812-

src/simu5g/stack/rlc/am/AmTxQueue.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#include "simu5g/stack/pdcp/packet/LtePdcpPdu_m.h"
2222
#include "simu5g/stack/rlc/LteRlcDefs.h"
2323
#include "simu5g/stack/rlc/packet/LteRlcPdu_m.h"
24-
#include "simu5g/stack/rlc/packet/LteRlcSdu_m.h"
2524
#include "simu5g/stack/rlc/am/LteRlcAm.h"
2625

2726
namespace simu5g {
@@ -236,4 +235,3 @@ class AmTxQueue : public cSimpleModule
236235
} //namespace
237236

238237
#endif
239-

src/simu5g/stack/rlc/am/LteRlcAm.cc

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "simu5g/stack/rlc/am/AmRxQueue.h"
1818
#include "simu5g/stack/mac/packet/LteMacSduRequest.h"
1919
#include "simu5g/stack/rlc/packet/LteRlcNewDataTag_m.h"
20+
#include "simu5g/stack/rlc/packet/PdcpTrackingTag_m.h"
2021

2122
namespace simu5g {
2223

@@ -112,12 +113,13 @@ void LteRlcAm::handleUpperMessage(cPacket *pktAux)
112113
if (txbuf == nullptr)
113114
txbuf = createTxBuffer(cid);
114115

115-
// Create a new RLC packet
116-
auto rlcPkt = makeShared<LteRlcAmSdu>();
117-
rlcPkt->setSnoMainPacket(lteInfo->getSequenceNumber());
118-
rlcPkt->setChunkLength(B(RLC_HEADER_AM));
119-
pkt->insertAtFront(rlcPkt);
116+
// Add PDCP tracking information
117+
auto pdcpTag = pkt->addTag<PdcpTrackingTag>();
118+
pdcpTag->setPdcpSequenceNumber(lteInfo->getSequenceNumber());
119+
pdcpTag->setOriginalPacketLength(pkt->getByteLength());
120+
120121
drop(pkt);
122+
121123
EV << NOW << " LteRlcAm : handleUpperMessage sending to AM TX Queue" << endl;
122124
// Fragment Packet
123125
txbuf->enque(pkt);
@@ -228,10 +230,12 @@ void LteRlcAm::indicateNewDataToMac(cPacket *pktAux) {
228230
// (MAC is only interested in FlowControlInfo tag and size)
229231

230232
auto newData = new Packet("AM-NewData");
231-
auto rlcSdu = inet::makeShared<LteRlcSdu>();
232-
rlcSdu->setLengthMainPacket(pkt->getByteLength());
233233

234-
newData->insertAtFront(rlcSdu);
234+
// Add PDCP tracking information
235+
auto lteInfo = pkt->getTag<FlowControlInfo>();
236+
auto pdcpTag = newData->addTag<PdcpTrackingTag>();
237+
pdcpTag->setPdcpSequenceNumber(lteInfo->getSequenceNumber());
238+
pdcpTag->setOriginalPacketLength(pkt->getByteLength());
235239

236240
// add tag to indicate new data availability to MAC
237241
newData->addTag<LteRlcNewDataTag>();

0 commit comments

Comments
 (0)