Fix bug in reassemble of RLC UM PDUs
authorManuel Requena <manuel.requena@cttc.es>
Mon, 16 Apr 2012 12:50:22 +0200
changeset 8709 a64f5b0ff6f7
parent 8708 108d9d416b4c
child 8710 2607329559dd
Fix bug in reassemble of RLC UM PDUs
src/lte/model/lte-rlc-um.cc
src/lte/model/lte-rlc-um.h
--- 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);