Process txedBuffer as the retxBuffer if retxBuffer is empty
authorManuel Requena <manuel.requena@cttc.es>
Thu, 13 Dec 2012 19:44:33 +0100
changeset 9533 e371deb84f14
parent 9532 70a98fe1bf91
child 9534 dd0e48ae0ab6
Process txedBuffer as the retxBuffer if retxBuffer is empty
src/lte/model/lte-rlc-am.cc
--- a/src/lte/model/lte-rlc-am.cc	Thu Dec 13 18:46:05 2012 +0100
+++ b/src/lte/model/lte-rlc-am.cc	Thu Dec 13 19:44:33 2012 +0100
@@ -205,6 +205,48 @@
     {
       NS_LOG_LOGIC ("Sending data from Transmission Buffer");
     }
+  else if ( m_txedBufferSize > 0 )
+    {
+      NS_LOG_LOGIC ("Sending data from Transmitted Buffer");
+
+      NS_LOG_INFO ("VT(A)     = " << m_vtA);
+      NS_LOG_INFO ("VT(S)     = " << m_vtS);
+
+      uint16_t vta = m_vtA.GetValue ();
+      Ptr<Packet> packet = m_txedBuffer.at (vta)->Copy ();
+
+      if ( packet->GetSize () <= bytes )
+        {
+          NS_LOG_INFO ("Move SN = " << vta << " to retxBuffer");
+          m_retxBuffer.at (vta).m_pdu = m_txedBuffer.at (vta)->Copy ();
+          m_retxBuffer.at (vta).m_retxCount = 1;
+          m_retxBufferSize += m_retxBuffer.at (vta).m_pdu->GetSize ();
+
+          m_txedBufferSize -= m_txedBuffer.at (vta)->GetSize ();
+          m_txedBuffer.at (vta) = 0;
+
+          LteRlcAmHeader rlcAmHeader;
+          packet->PeekHeader (rlcAmHeader);
+          NS_LOG_LOGIC ("RLC header: " << rlcAmHeader);
+
+          // Send RLC PDU to MAC layer
+          LteMacSapProvider::TransmitPduParameters params;
+          params.pdu = packet;
+          params.rnti = m_rnti;
+          params.lcid = m_lcid;
+          params.layer = layer;
+          params.harqProcessId = harqId;
+
+          m_macSapProvider->TransmitPdu (params);
+          return;
+        }
+      else
+        {
+          NS_LOG_LOGIC ("Tx opportunity too small for retransmission of the packet (" << packet->GetSize () << " bytes)");
+          NS_LOG_LOGIC ("Waiting for bigger tx opportunity");
+          return;
+        }
+    }
   else
     {
       NS_LOG_LOGIC ("No data pending");
@@ -262,7 +304,7 @@
 
           NS_LOG_LOGIC ("    IF ( firstSegment > nextSegmentSize ||");
           NS_LOG_LOGIC ("         firstSegment > 2047 )");
-          
+
           // Segment txBuffer.FirstBuffer and
           // Give back the remaining segment to the transmission buffer
           Ptr<Packet> newSegment = firstSegment->CreateFragment (0, currSegmentSize);
@@ -1445,6 +1487,12 @@
 
   Time now = Simulator::Now ();
 
+  NS_LOG_LOGIC ("txonBufferSize = " << m_txonBufferSize);
+  NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize);
+  NS_LOG_LOGIC ("txedBufferSize = " << m_txedBufferSize);
+  NS_LOG_LOGIC ("VT(A) = " << m_vtA);
+  NS_LOG_LOGIC ("VT(S) = " << m_vtS);
+
   // Transmission Queue HOL time
   Time txonQueueHolDelay (0);
   if ( m_txonBufferSize > 0 )
@@ -1456,10 +1504,15 @@
 
   // Retransmission Queue HOL time
   Time retxQueueHolDelay (0);
+  RlcTag retxQueueHolTimeTag;
   if ( m_retxBufferSize > 0 )
     {
-      RlcTag retxQueueHolTimeTag;
-//       m_retxBuffer.front ().m_pdu->PeekPacketTag (retxQueueHolTimeTag);
+      m_retxBuffer.at (m_vtA.GetValue ()).m_pdu->PeekPacketTag (retxQueueHolTimeTag);
+      retxQueueHolDelay = now - retxQueueHolTimeTag.GetSenderTimestamp ();
+    }
+  else if ( m_txedBufferSize > 0 )
+    {
+      m_txedBuffer.at (m_vtA.GetValue ())->PeekPacketTag (retxQueueHolTimeTag);
       retxQueueHolDelay = now - retxQueueHolTimeTag.GetSenderTimestamp ();
     }
 
@@ -1468,7 +1521,7 @@
   r.lcid = m_lcid;
   r.txQueueSize = m_txonBufferSize;
   r.txQueueHolDelay = txonQueueHolDelay.GetMilliSeconds ();
-  r.retxQueueSize = m_retxBufferSize;
+  r.retxQueueSize = m_retxBufferSize + m_txedBufferSize;
   r.retxQueueHolDelay = retxQueueHolDelay.GetMilliSeconds ();
 
   if ( m_statusPduRequested && ! m_statusProhibitTimer.IsRunning () )
@@ -1536,9 +1589,7 @@
   NS_LOG_LOGIC ("txonBufferSize = " << m_txonBufferSize);
   NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize);
   NS_LOG_LOGIC ("txedBufferSize = " << m_txedBufferSize);
-
   NS_LOG_LOGIC ("statusPduRequested = " << m_statusPduRequested);
-  NS_LOG_LOGIC ("VT(S) = " << m_vtS);
 
   DoReportBufferStatus ();
 }