21 #include "ns3/simulator.h"
24 #include "ns3/lte-rlc-am-header.h"
25 #include "ns3/lte-rlc-am.h"
26 #include "ns3/lte-rlc-sdu-status-tag.h"
27 #include "ns3/lte-rlc-tag.h"
88 .AddConstructor<LteRlcAm> ()
123 RlcTag txonQueueHolTimeTag;
124 m_txonBuffer.front ()->PeekPacketTag (txonQueueHolTimeTag);
128 RlcTag retxQueueHolTimeTag;
129 Time retxQueueHolDelay (0);
183 rlcAmHeader.SetAckSn (
m_vrR);
199 NS_LOG_LOGIC (
"Sending data from Retransmission Buffer");
203 if ( packet->
GetSize () <= bytes )
220 NS_LOG_LOGIC (
"Tx opportunity too small for retransmission of the packet (" << packet->
GetSize () <<
" bytes)");
246 uint32_t nextSegmentSize = bytes - 4;
247 uint32_t nextSegmentId = 1;
248 uint32_t dataFieldTotalSize = 0;
249 uint32_t dataFieldAddedSize = 0;
250 std::vector < Ptr<Packet> > dataField;
263 NS_LOG_LOGIC (
"Next segment size = " << nextSegmentSize);
270 while ( firstSegment && (firstSegment->
GetSize () > 0) && (nextSegmentSize > 0) )
272 NS_LOG_LOGIC (
"WHILE ( firstSegment && firstSegment->GetSize > 0 && nextSegmentSize > 0 )");
274 NS_LOG_LOGIC (
" nextSegmentSize = " << nextSegmentSize);
275 if ( (firstSegment->
GetSize () > nextSegmentSize) ||
277 (firstSegment->
GetSize () > 2047)
282 uint32_t currSegmentSize = std::min (firstSegment->
GetSize (), nextSegmentSize);
284 NS_LOG_LOGIC (
" IF ( firstSegment > nextSegmentSize ||");
312 if (firstSegment->
GetSize () > 0)
319 NS_LOG_LOGIC (
" Txon buffer: Give back the remaining segment");
344 dataFieldAddedSize = newSegment->
GetSize ();
345 dataFieldTotalSize += dataFieldAddedSize;
346 dataField.push_back (newSegment);
354 nextSegmentSize -= dataFieldAddedSize;
362 else if ( (nextSegmentSize - firstSegment->
GetSize () <= 2) || (
m_txonBuffer.size () == 0) )
364 NS_LOG_LOGIC (
" IF nextSegmentSize - firstSegment->GetSize () <= 2 || txonBuffer.size == 0");
367 dataFieldAddedSize = firstSegment->
GetSize ();
368 dataFieldTotalSize += dataFieldAddedSize;
369 dataField.push_back (firstSegment);
377 nextSegmentSize -= dataFieldAddedSize;
386 NS_LOG_LOGIC (
" Next segment size = " << nextSegmentSize);
395 NS_LOG_LOGIC (
" IF firstSegment < NextSegmentSize && txonBuffer.size > 0");
397 dataFieldAddedSize = firstSegment->
GetSize ();
398 dataFieldTotalSize += dataFieldAddedSize;
399 dataField.push_back (firstSegment);
405 rlcAmHeader.PushLengthIndicator (firstSegment->
GetSize ());
407 nextSegmentSize -= ((nextSegmentId % 2) ? (2) : (1)) + dataFieldAddedSize;
416 NS_LOG_LOGIC (
" Next segment size = " << nextSegmentSize);
432 rlcAmHeader.SetSequenceNumber (
m_vtS++ );
435 rlcAmHeader.SetSegmentOffset (0);
438 uint8_t framingInfo = 0;
439 std::vector< Ptr<Packet> >::iterator it;
440 it = dataField.begin ();
444 (*it)->RemovePacketTag (tag);
455 (*it)->AddPacketTag (tag);
458 while (it < dataField.end ())
460 NS_LOG_LOGIC (
"Adding SDU/segment to packet, length = " << (*it)->GetSize ());
468 (*it)->RemovePacketTag (tag);
478 (*it)->AddPacketTag (tag);
481 rlcAmHeader.SetFramingInfo (framingInfo);
529 m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber ().GetValue () ) = packet->
Copy ();
541 params.layer = layer;
571 if ( rlcAmHeader.IsDataPdu () )
628 NS_LOG_LOGIC (
"PDU segment received ( SN = " << seqNumber <<
" )");
632 NS_LOG_LOGIC (
"PDU received ( SN = " << seqNumber <<
" )");
636 NS_ASSERT_MSG (
false,
"Neither a PDU segment nor a PDU received");
651 RlcTag txonQueueHolTimeTag;
652 Time txonQueueHolDelay (0);
655 m_txonBuffer.front ()->PeekPacketTag (txonQueueHolTimeTag);
660 RlcTag retxQueueHolTimeTag;
661 Time retxQueueHolDelay (0);
664 m_retxBuffer.front ().m_pdu->PeekPacketTag (retxQueueHolTimeTag);
719 NS_LOG_LOGIC (
"Place PDU in the reception buffer ( SN = " << seqNumber <<
" )");
734 if ( seqNumber >=
m_vrH )
736 m_vrH = seqNumber + 1;
767 if ( seqNumber ==
m_vrR )
780 "Too many segments. PDU Reassembly process didn't work");
930 else if ( rlcAmHeader.IsControlPdu () )
948 NS_LOG_INFO (
"ACKed SN = " << seqNumberValue <<
" from txedBuffer");
956 NS_LOG_INFO (
"ACKed SN = " << seqNumberValue <<
" from retxBuffer");
968 uint16_t seqNumberValue;
969 while (seqNumber <
m_vtS)
971 seqNumberValue = seqNumber.
GetValue ();
974 NS_LOG_INFO (
"Move SN = " << seqNumberValue <<
" to retxBuffer");
985 NS_LOG_INFO (
"Incr RETX_COUNT for SN = " << seqNumberValue);
988 NS_LOG_INFO (
"Max RETX_COUNT for SN = " << seqNumberValue);
1029 m_vrR <<
" <= " << seqNumber <<
" <= " <<
m_vrMr);
1035 if ( (
m_vrR <= seqNumber) && (seqNumber <
m_vrMr ) )
1037 NS_LOG_LOGIC (seqNumber <<
" is INSIDE the receiving window");
1042 NS_LOG_LOGIC (seqNumber <<
" is OUTSIDE the receiving window");
1055 bool expectedSnLost;
1059 expectedSnLost =
true;
1065 expectedSnLost =
false;
1071 uint8_t extensionBit;
1072 uint16_t lengthIndicator;
1078 if ( extensionBit == 0 )
1088 if ( lengthIndicator >= packet->
GetSize () )
1090 NS_LOG_LOGIC (
"INTERNAL ERROR: Not enough data in the packet (" << packet->
GetSize () <<
"). Needed LI=" << lengthIndicator);
1101 while ( extensionBit == 1 );
1103 std::list < Ptr<Packet> >::iterator it;
1108 else NS_LOG_LOGIC (
"Reassembling State = Unknown state");
1111 NS_LOG_LOGIC (
"Framing Info = " << (uint16_t)framingInfo);
1115 if (!expectedSnLost)
1120 switch (framingInfo)
1160 NS_LOG_LOGIC (
"INTERNAL ERROR: Transition not possible. FI = " << (uint32_t) framingInfo);
1166 switch (framingInfo)
1231 NS_LOG_LOGIC (
"INTERNAL ERROR: Transition not possible. FI = " << (uint32_t) framingInfo);
1246 switch (framingInfo)
1336 NS_LOG_LOGIC (
"INTERNAL ERROR: Transition not possible. FI = " << (uint32_t) framingInfo);
1342 switch (framingInfo)
1453 NS_LOG_LOGIC (
"INTERNAL ERROR: Transition not possible. FI = " << (uint32_t) framingInfo);