From 3026d8392dbdf3552fd0d5133546d0ba559dc050 Mon Sep 17 00:00:00 2001 From: Manuel Requena Date: Mon, 5 Mar 2012 17:39:16 +0100 Subject: [PATCH] Copy packets before send them to MAC layer --- src/lte/model/lte-rlc-am.cc | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/lte/model/lte-rlc-am.cc b/src/lte/model/lte-rlc-am.cc index 530183a32..812fb3132 100644 --- a/src/lte/model/lte-rlc-am.cc +++ b/src/lte/model/lte-rlc-am.cc @@ -98,7 +98,7 @@ LteRlcAm::GetTypeId (void) void LteRlcAm::DoTransmitPdcpPdu (Ptr p) { - NS_LOG_FUNCTION (this); + NS_LOG_FUNCTION (this << p->GetSize ()); /** Store arrival time */ Time now = Simulator::Now (); @@ -191,11 +191,15 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes) else if ( m_retxBufferSize > 0 ) { NS_LOG_LOGIC ("Sending data from Retransmission Buffer"); - - Ptr packet = m_retxBuffer.at (m_vtA.GetValue ()).m_pdu; + + Ptr 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 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes) 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 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes) // 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 @@ LteRlcAm::DoNotifyHarqDeliveryFailure () void LteRlcAm::DoReceivePdu (Ptr 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 @@ LteRlcAm::DoReceivePdu (Ptr p) 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 ();