diff --git a/src/lte/model/lte-rlc-um.cc b/src/lte/model/lte-rlc-um.cc index 794571591..19a276f0e 100644 --- a/src/lte/model/lte-rlc-um.cc +++ b/src/lte/model/lte-rlc-um.cc @@ -88,18 +88,13 @@ LteRlcUm::DoTransmitPdcpPdu (Ptr p) if (m_txBufferSize + p->GetSize () <= m_maxTxBufferSize) { - /** Store arrival time */ - RlcTag timeTag (Simulator::Now ()); - p->AddPacketTag (timeTag); - /** Store PDCP PDU */ - LteRlcSduStatusTag tag; tag.SetStatus (LteRlcSduStatusTag::FULL_SDU); p->AddPacketTag (tag); NS_LOG_LOGIC ("Tx Buffer: New packet added"); - m_txBuffer.push_back (p); + m_txBuffer.push_back (TxPdu (p, Simulator::Now ())); m_txBufferSize += p->GetSize (); NS_LOG_LOGIC ("NumOfBuffers = " << m_txBuffer.size() ); NS_LOG_LOGIC ("txBufferSize = " << m_txBufferSize); @@ -153,13 +148,15 @@ LteRlcUm::DoNotifyTxOpportunity (LteMacSapUser::TxOpportunityParameters txOpPara return; } + Ptr firstSegment = m_txBuffer.begin ()->m_pdu->Copy (); + Time firstSegmentTime = m_txBuffer.begin ()->m_waitingSince; + NS_LOG_LOGIC ("SDUs in TxBuffer = " << m_txBuffer.size ()); - NS_LOG_LOGIC ("First SDU buffer = " << *(m_txBuffer.begin())); - NS_LOG_LOGIC ("First SDU size = " << (*(m_txBuffer.begin()))->GetSize ()); + NS_LOG_LOGIC ("First SDU buffer = " << firstSegment); + NS_LOG_LOGIC ("First SDU size = " << firstSegment->GetSize ()); NS_LOG_LOGIC ("Next segment size = " << nextSegmentSize); NS_LOG_LOGIC ("Remove SDU from TxBuffer"); - Ptr firstSegment = (*(m_txBuffer.begin ()))->Copy (); - m_txBufferSize -= (*(m_txBuffer.begin()))->GetSize (); + m_txBufferSize -= firstSegment->GetSize (); NS_LOG_LOGIC ("txBufferSize = " << m_txBufferSize ); m_txBuffer.erase (m_txBuffer.begin ()); @@ -209,12 +206,12 @@ LteRlcUm::DoNotifyTxOpportunity (LteMacSapUser::TxOpportunityParameters txOpPara { firstSegment->AddPacketTag (oldTag); - m_txBuffer.insert (m_txBuffer.begin (), firstSegment); - m_txBufferSize += (*(m_txBuffer.begin()))->GetSize (); + m_txBuffer.insert (m_txBuffer.begin (), TxPdu (firstSegment, firstSegmentTime)); + m_txBufferSize += m_txBuffer.begin()->m_pdu->GetSize (); NS_LOG_LOGIC (" TX buffer: Give back the remaining segment"); NS_LOG_LOGIC (" TX buffers = " << m_txBuffer.size ()); - NS_LOG_LOGIC (" Front buffer size = " << (*(m_txBuffer.begin()))->GetSize ()); + NS_LOG_LOGIC (" Front buffer size = " << m_txBuffer.begin()->m_pdu->GetSize ()); NS_LOG_LOGIC (" txBufferSize = " << m_txBufferSize ); } else @@ -275,8 +272,8 @@ LteRlcUm::DoNotifyTxOpportunity (LteMacSapUser::TxOpportunityParameters txOpPara NS_LOG_LOGIC (" SDUs in TxBuffer = " << m_txBuffer.size ()); if (m_txBuffer.size () > 0) { - NS_LOG_LOGIC (" First SDU buffer = " << *(m_txBuffer.begin())); - NS_LOG_LOGIC (" First SDU size = " << (*(m_txBuffer.begin()))->GetSize ()); + NS_LOG_LOGIC (" First SDU buffer = " << m_txBuffer.begin()->m_pdu); + NS_LOG_LOGIC (" First SDU size = " << m_txBuffer.begin()->m_pdu->GetSize ()); } NS_LOG_LOGIC (" Next segment size = " << nextSegmentSize); @@ -305,15 +302,16 @@ LteRlcUm::DoNotifyTxOpportunity (LteMacSapUser::TxOpportunityParameters txOpPara NS_LOG_LOGIC (" SDUs in TxBuffer = " << m_txBuffer.size ()); if (m_txBuffer.size () > 0) { - NS_LOG_LOGIC (" First SDU buffer = " << *(m_txBuffer.begin())); - NS_LOG_LOGIC (" First SDU size = " << (*(m_txBuffer.begin()))->GetSize ()); + NS_LOG_LOGIC (" First SDU buffer = " << m_txBuffer.begin()->m_pdu); + NS_LOG_LOGIC (" First SDU size = " << m_txBuffer.begin()->m_pdu->GetSize ()); } NS_LOG_LOGIC (" Next segment size = " << nextSegmentSize); NS_LOG_LOGIC (" Remove SDU from TxBuffer"); // (more segments) - firstSegment = (*(m_txBuffer.begin ()))->Copy (); - m_txBufferSize -= (*(m_txBuffer.begin()))->GetSize (); + firstSegment = m_txBuffer.begin ()->m_pdu->Copy (); + firstSegmentTime = m_txBuffer.begin ()->m_waitingSince; + m_txBufferSize -= firstSegment->GetSize (); m_txBuffer.erase (m_txBuffer.begin ()); NS_LOG_LOGIC (" txBufferSize = " << m_txBufferSize ); } @@ -379,7 +377,7 @@ LteRlcUm::DoNotifyTxOpportunity (LteMacSapUser::TxOpportunityParameters txOpPara // Sender timestamp RlcTag rlcTag (Simulator::Now ()); - packet->ReplacePacketTag (rlcTag); + packet->AddByteTag (rlcTag, 1, rlcHeader.GetSerializedSize ()); m_txPdu (m_rnti, m_lcid, packet->GetSize ()); // Send RLC PDU to MAC layer @@ -414,8 +412,10 @@ LteRlcUm::DoReceivePdu (LteMacSapUser::ReceivePduParameters rxPduParams) // Receiver timestamp RlcTag rlcTag; Time delay; - NS_ASSERT_MSG (rxPduParams.p->PeekPacketTag (rlcTag), "RlcTag is missing"); - rxPduParams.p->RemovePacketTag (rlcTag); + + bool ret = rxPduParams.p->FindFirstMatchingByteTag (rlcTag); + NS_ASSERT_MSG (ret, "RlcTag is missing"); + delay = Simulator::Now() - rlcTag.GetSenderTimestamp (); m_rxPdu (m_rnti, m_lcid, rxPduParams.p->GetSize (), delay.GetNanoSeconds ()); @@ -1123,10 +1123,7 @@ LteRlcUm::DoReportBufferStatus (void) if (! m_txBuffer.empty ()) { - RlcTag holTimeTag; - NS_ASSERT_MSG (m_txBuffer.front ()->PeekPacketTag (holTimeTag), "RlcTag is missing"); - m_txBuffer.front ()->PeekPacketTag (holTimeTag); - holDelay = Simulator::Now () - holTimeTag.GetSenderTimestamp (); + holDelay = Simulator::Now () - m_txBuffer.front().m_waitingSince; queueSize = m_txBufferSize + 2 * m_txBuffer.size (); // Data in tx queue + estimated headers size } diff --git a/src/lte/model/lte-rlc-um.h b/src/lte/model/lte-rlc-um.h index 5cbcbca42..97ac7136d 100644 --- a/src/lte/model/lte-rlc-um.h +++ b/src/lte/model/lte-rlc-um.h @@ -97,7 +97,28 @@ private: private: uint32_t m_maxTxBufferSize; ///< maximum transmit buffer status uint32_t m_txBufferSize; ///< transmit buffer size - std::vector < Ptr > m_txBuffer; ///< Transmission buffer + /** + * \brief Store an incoming (from layer above us) PDU, waiting to transmit it + */ + struct TxPdu + { + /** + * \brief TxPdu default constructor + * \param pdu the PDU + * \param time the arrival time + */ + TxPdu (const Ptr &pdu, const Time &time) : + m_pdu (pdu), + m_waitingSince (time) + { } + + TxPdu () = delete; + + Ptr m_pdu; ///< PDU + Time m_waitingSince; ///< Layer arrival time + }; + + std::vector < TxPdu > m_txBuffer; ///< Transmission buffer std::map > m_rxBuffer; ///< Reception buffer std::vector < Ptr > m_reasBuffer; ///< Reassembling buffer