--- a/src/lte/model/lte-rlc-um.cc Mon Apr 16 11:42:50 2012 +0200
+++ b/src/lte/model/lte-rlc-um.cc Mon Apr 16 12:50:22 2012 +0200
@@ -104,7 +104,7 @@
if (bytes <= 2)
{
- // TODO ERROR: Header fix part is 2 bytes, we need more bytes for the data
+ // Stingy MAC: Header fix part is 2 bytes, we need more bytes for the data
NS_LOG_LOGIC ("TX opportunity too small = " << bytes);
return;
}
@@ -475,6 +475,7 @@
std::map <uint16_t, Ptr<Packet> >::iterator it;
uint16_t newVrUr;
+ SequenceNumber10 oldVrUr = m_vrUr;
it = m_rxBuffer.find (m_vrUr.GetValue ());
newVrUr = (it->first) + 1;
@@ -485,7 +486,7 @@
m_vrUr = newVrUr;
NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
- ReassembleSnLessThan (m_vrUr);
+ ReassembleSnInterval (oldVrUr, m_vrUr);
}
// m_vrUh can change previously, set new modulus base
@@ -576,7 +577,6 @@
if ( currSeqNumber != m_expectedSeqNumber )
{
expectedSnLost = true;
- // TODO LOSSES
NS_LOG_LOGIC ("There are losses. Expected SN = " << m_expectedSeqNumber << ". Current SN = " << currSeqNumber);
m_expectedSeqNumber = currSeqNumber + 1;
}
@@ -608,7 +608,6 @@
if ( lengthIndicator >= packet->GetSize () )
{
NS_LOG_LOGIC ("INTERNAL ERROR: Not enough data in the packet (" << packet->GetSize () << "). Needed LI=" << lengthIndicator);
- // TODO What to do in this case? Discard packet and continue? Or Assert?
}
// Split packet in two fragments
@@ -1060,28 +1059,32 @@
}
void
-LteRlcUm::ReassembleSnLessThan (SequenceNumber10 seqNumber)
+LteRlcUm::ReassembleSnInterval (SequenceNumber10 lowSeqNumber, SequenceNumber10 highSeqNumber)
{
- NS_LOG_LOGIC ("Reassemble SN < updated VR(UR)" );
+ NS_LOG_LOGIC ("Reassemble SN between " << lowSeqNumber << " and " << highSeqNumber);
std::map <uint16_t, Ptr<Packet> >::iterator it;
- it = m_rxBuffer.begin ();
-
- while ( (it != m_rxBuffer.end ()) && (it->first < seqNumber.GetValue ()) )
- {
- NS_LOG_LOGIC ("SN = " << it->first);
-
- // Reassemble RLC SDUs and deliver the PDCP PDU to upper layer
- ReassembleAndDeliver (it->second);
- std::map <uint16_t, Ptr<Packet> >::iterator it_tmp = it;
- ++it;
- m_rxBuffer.erase (it_tmp);
- }
+ SequenceNumber10 reassembleSn = lowSeqNumber;
+ NS_LOG_LOGIC ("reassembleSN = " << reassembleSn);
+ NS_LOG_LOGIC ("highSeqNumber = " << highSeqNumber);
+ while (reassembleSn < highSeqNumber)
+ {
+ NS_LOG_LOGIC ("reassembleSn < highSeqNumber");
+ it = m_rxBuffer.find (reassembleSn.GetValue ());
+ NS_LOG_LOGIC ("it->first = " << it->first);
+ NS_LOG_LOGIC ("it->second = " << it->second);
+ if (it != m_rxBuffer.end () )
+ {
+ NS_LOG_LOGIC ("SN = " << it->first);
- if (it != m_rxBuffer.end ())
- {
- NS_LOG_LOGIC ("(SN = " << it->first << ") >= " << m_vrUr.GetValue ());
+ // Reassemble RLC SDUs and deliver the PDCP PDU to upper layer
+ ReassembleAndDeliver (it->second);
+
+ m_rxBuffer.erase (it);
+ }
+
+ reassembleSn++;
}
}
@@ -1137,10 +1140,11 @@
{
newVrUr++;
}
+ SequenceNumber10 oldVrUr = m_vrUr;
m_vrUr = newVrUr;
NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
- ReassembleSnLessThan (m_vrUr);
+ ReassembleSnInterval (oldVrUr, m_vrUr);
if ( m_vrUh > m_vrUr)
{
--- a/src/lte/model/lte-rlc-um.h Mon Apr 16 11:42:50 2012 +0200
+++ b/src/lte/model/lte-rlc-um.h Mon Apr 16 12:50:22 2012 +0200
@@ -60,7 +60,7 @@
bool IsInsideReorderingWindow (SequenceNumber10 seqNumber);
void ReassembleOutsideWindow (void);
- void ReassembleSnLessThan (SequenceNumber10 seqNumber);
+ void ReassembleSnInterval (SequenceNumber10 lowSeqNumber, SequenceNumber10 highSeqNumber);
void ReassembleAndDeliver (Ptr<Packet> packet);