From 2fa9d9a22cea52d76e2c592deaac78d72c70b9d6 Mon Sep 17 00:00:00 2001 From: Manuel Requena Date: Thu, 13 Dec 2012 19:44:33 +0100 Subject: [PATCH] Process txedBuffer as the retxBuffer if retxBuffer is empty --- src/lte/model/lte-rlc-am.cc | 63 +++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/src/lte/model/lte-rlc-am.cc b/src/lte/model/lte-rlc-am.cc index e184c40d0..b2ff53336 100644 --- a/src/lte/model/lte-rlc-am.cc +++ b/src/lte/model/lte-rlc-am.cc @@ -205,6 +205,48 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId) { 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 = 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 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId) 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 newSegment = firstSegment->CreateFragment (0, currSegmentSize); @@ -1445,6 +1487,12 @@ LteRlcAm::DoReportBufferStatus (void) 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 @@ LteRlcAm::DoReportBufferStatus (void) // 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 @@ LteRlcAm::DoReportBufferStatus (void) 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 @@ LteRlcAm::ExpirePollRetransmitTimer (void) 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 (); }