lte rlc um: Do not use a PacketTag to store the arrival time

This commit is contained in:
Natale Patriciello
2019-02-27 09:55:23 +01:00
parent c303096002
commit 66f1e9198c
2 changed files with 45 additions and 27 deletions

View File

@@ -88,18 +88,13 @@ LteRlcUm::DoTransmitPdcpPdu (Ptr<Packet> 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<Packet> 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<Packet> 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
}

View File

@@ -97,7 +97,28 @@ private:
private:
uint32_t m_maxTxBufferSize; ///< maximum transmit buffer status
uint32_t m_txBufferSize; ///< transmit buffer size
std::vector < Ptr<Packet> > 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<Packet> &pdu, const Time &time) :
m_pdu (pdu),
m_waitingSince (time)
{ }
TxPdu () = delete;
Ptr<Packet> m_pdu; ///< PDU
Time m_waitingSince; ///< Layer arrival time
};
std::vector < TxPdu > m_txBuffer; ///< Transmission buffer
std::map <uint16_t, Ptr<Packet> > m_rxBuffer; ///< Reception buffer
std::vector < Ptr<Packet> > m_reasBuffer; ///< Reassembling buffer