Copy packets before send them to MAC layer
authorManuel Requena <manuel.requena@cttc.es>
Mon, 05 Mar 2012 17:39:16 +0100
changeset 8667 5fcab10ff001
parent 8666 cd02fdf79147
child 8668 765a57edd37e
Copy packets before send them to MAC layer
src/lte/model/lte-rlc-am.cc
--- a/src/lte/model/lte-rlc-am.cc	Mon Mar 05 11:40:36 2012 +0100
+++ b/src/lte/model/lte-rlc-am.cc	Mon Mar 05 17:39:16 2012 +0100
@@ -98,7 +98,7 @@
 void
 LteRlcAm::DoTransmitPdcpPdu (Ptr<Packet> p)
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << p->GetSize ());
 
   /** Store arrival time */
   Time now = Simulator::Now ();
@@ -191,11 +191,15 @@
   else if ( m_retxBufferSize > 0 )
     {
       NS_LOG_LOGIC ("Sending data from Retransmission Buffer");
-
-      Ptr<Packet> packet = m_retxBuffer.at (m_vtA.GetValue ()).m_pdu;
+      
+      Ptr<Packet> packet = m_retxBuffer.at (m_vtA.GetValue ()).m_pdu->Copy ();
 
       if ( packet->GetSize () <= bytes )
         {
+          LteRlcAmHeader rlcAmHeader;
+          packet->PeekHeader (rlcAmHeader);
+          NS_LOG_LOGIC ("AM RLC header: " << rlcAmHeader);
+
           // Send RLC PDU to MAC layer
           LteMacSapProvider::TransmitPduParameters params;
           params.pdu = packet;
@@ -205,6 +209,12 @@
           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 if ( m_txonBufferSize > 0 )
     {
@@ -478,7 +488,12 @@
   // Store new PDU into the Transmitted PDU Buffer
   NS_LOG_LOGIC ("Put transmitted PDU in the txedBuffer");
   m_txedBufferSize += packet->GetSize ();
-  m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber ().GetValue () ) = packet;
+  m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber ().GetValue () ) = packet->Copy ();
+  
+  // Sender timestamp
+  RlcTag rlcTag (Simulator::Now ());
+  packet->AddByteTag (rlcTag);
+  m_txPdu (m_rnti, m_lcid, packet->GetSize ());
 
   // Send RLC PDU to MAC layer
   LteMacSapProvider::TransmitPduParameters params;
@@ -498,11 +513,21 @@
 void
 LteRlcAm::DoReceivePdu (Ptr<Packet> p)
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << p->GetSize ());
+
+  // Receiver timestamp
+  RlcTag rlcTag;
+  Time delay;
+  if (p->FindFirstMatchingByteTag (rlcTag))
+    {
+      delay = Simulator::Now() - rlcTag.GetSenderTimestamp ();
+    }
+  m_rxPdu (m_rnti, m_lcid, p->GetSize (), delay.GetNanoSeconds ());
 
   // Get RLC header parameters
   LteRlcAmHeader rlcAmHeader;
   p->PeekHeader (rlcAmHeader);
+  NS_LOG_LOGIC ("AM RLC header: " << rlcAmHeader);
 
   if ( rlcAmHeader.IsDataPdu () )
     {
@@ -893,7 +918,7 @@
           if (m_txedBuffer.at (seqNumberValue))
             {
               NS_LOG_INFO ("Move SN = " << seqNumberValue << " to retxBuffer");
-              m_retxBuffer.at (seqNumberValue).m_pdu = m_txedBuffer.at (seqNumberValue);
+              m_retxBuffer.at (seqNumberValue).m_pdu = m_txedBuffer.at (seqNumberValue)->Copy ();
               m_retxBuffer.at (seqNumberValue).m_retxCount = 0;
               m_retxBufferSize += m_retxBuffer.at (seqNumberValue).m_pdu->GetSize ();