--- a/src/lte/model/lte-rlc-um.cc Thu Dec 22 17:59:54 2011 +0100
+++ b/src/lte/model/lte-rlc-um.cc Fri Dec 23 13:48:37 2011 +0100
@@ -72,8 +72,7 @@
NS_LOG_FUNCTION (this);
/** Store arrival time */
- Time now = Simulator::Now ();
- RlcTag timeTag (now);
+ RlcTag timeTag (Simulator::Now ());
p->AddPacketTag (timeTag);
/** Store PDCP PDU */
@@ -89,24 +88,8 @@
NS_LOG_LOGIC ("txBufferSize = " << m_txBufferSize);
/** Report Buffer Status */
-
- RlcTag holTimeTag;
- m_txBuffer.front ()->PeekPacketTag (holTimeTag);
- Time holDelay = now - holTimeTag.GetSenderTimestamp ();
-
- LteMacSapProvider::ReportBufferStatusParameters r;
- r.rnti = m_rnti;
- r.lcid = m_lcid;
- r.txQueueSize = m_txBufferSize + 2 * m_txBuffer.size (); // Data in tx queue + estimated headers size
- r.txQueueHolDelay = holDelay.GetMilliSeconds () ;
- r.retxQueueSize = 0;
- r.retxQueueHolDelay = 0;
- r.statusPduSize = 0;
-
- NS_LOG_LOGIC ("Send ReportBufferStatus");
- NS_LOG_LOGIC ("Queue size = " << r.txQueueSize);
- NS_LOG_LOGIC ("HOL delay = " << r.txQueueHolDelay);
- m_macSapProvider->ReportBufferStatus (r);
+ DoReportBufferStatus ();
+ m_rbsTimer.Cancel ();
}
@@ -373,6 +356,12 @@
params.lcid = m_lcid;
m_macSapProvider->TransmitPdu (params);
+
+ if (! m_txBuffer.empty ())
+ {
+ m_rbsTimer.Cancel ();
+ m_rbsTimer = Simulator::Schedule (MilliSeconds (10), &LteRlcUm::ExpireRbsTimer, this);
+ }
}
void
@@ -538,16 +527,7 @@
{
NS_LOG_FUNCTION (this);
- LteMacSapProvider::ReportBufferStatusParameters p;
- p.rnti = m_rnti;
- p.lcid = m_lcid;
- p.txQueueSize = 0;
- p.txQueueHolDelay = 0;
- p.retxQueueSize = 0;
- p.retxQueueHolDelay = 0;
- p.statusPduSize = 0;
-
- m_macSapProvider->ReportBufferStatus (p);
+ DoReportBufferStatus ();
}
@@ -1034,6 +1014,35 @@
void
+LteRlcUm::DoReportBufferStatus (void)
+{
+ Time holDelay (0);
+ uint32_t queueSize = 0;
+
+ if (! m_txBuffer.empty ())
+ {
+ RlcTag holTimeTag;
+ m_txBuffer.front ()->PeekPacketTag (holTimeTag);
+ holDelay = Simulator::Now () - holTimeTag.GetSenderTimestamp ();
+
+ queueSize = m_txBufferSize + 2 * m_txBuffer.size (); // Data in tx queue + estimated headers size
+ }
+
+ LteMacSapProvider::ReportBufferStatusParameters r;
+ r.rnti = m_rnti;
+ r.lcid = m_lcid;
+ r.txQueueSize = queueSize;
+ r.txQueueHolDelay = holDelay.GetMilliSeconds () ;
+ r.retxQueueSize = 0;
+ r.retxQueueHolDelay = 0;
+ r.statusPduSize = 0;
+
+ NS_LOG_LOGIC ("Send ReportBufferStatus = " << r.txQueueSize << ", " << r.txQueueHolDelay );
+ m_macSapProvider->ReportBufferStatus (r);
+}
+
+
+void
LteRlcUm::ExpireReorderingTimer (void)
{
NS_LOG_LOGIC ("TODO: Reordering Timer has expired...");
@@ -1068,4 +1077,16 @@
}
+void
+LteRlcUm::ExpireRbsTimer (void)
+{
+ NS_LOG_LOGIC ("RBS Timer expires");
+
+ if (! m_txBuffer.empty ())
+ {
+ DoReportBufferStatus ();
+ m_rbsTimer = Simulator::Schedule (MilliSeconds (10), &LteRlcUm::ExpireRbsTimer, this);
+ }
+}
+
} // namespace ns3
--- a/src/lte/model/lte-rlc-um.h Thu Dec 22 17:59:54 2011 +0100
+++ b/src/lte/model/lte-rlc-um.h Fri Dec 23 13:48:37 2011 +0100
@@ -52,13 +52,8 @@
void Start ();
private:
- /**
- * This method will schedule a timeout at WaitReplyTimeout interval
- * in the future, unless a timer is already running for the cache,
- * in which case this method does nothing.
- */
- void StartReorderingTimer (void);
void ExpireReorderingTimer (void);
+ void ExpireRbsTimer (void);
bool IsInsideReorderingWindow (uint16_t seqNumber);
@@ -67,6 +62,8 @@
void ReassembleAndDeliver (Ptr<Packet> packet);
+ void DoReportBufferStatus ();
+
private:
uint32_t m_txBufferSize;
std::vector < Ptr<Packet> > m_txBuffer; // Transmission buffer
@@ -93,6 +90,7 @@
* Timers. See section 7.3 in TS 36.322
*/
EventId m_reorderingTimer;
+ EventId m_rbsTimer;
/**
* Reassembling state