Add maximum size to the RLC Transmission Buffer
authorManuel Requena <manuel.requena@cttc.es>
Wed, 09 May 2012 19:08:03 +0200
changeset 8745 b94de33b24d3
parent 8744 5ee0d10aa9bd
child 8746 e1cbf693c71d
Add maximum size to the RLC Transmission Buffer
src/lte/model/lte-rlc-um.cc
src/lte/model/lte-rlc-um.h
src/lte/test/test-lte-epc-e2e-data.cc
--- a/src/lte/model/lte-rlc-um.cc	Mon May 07 13:52:32 2012 +0200
+++ b/src/lte/model/lte-rlc-um.cc	Wed May 09 19:08:03 2012 +0200
@@ -33,7 +33,8 @@
 NS_OBJECT_ENSURE_REGISTERED (LteRlcUm);
 
 LteRlcUm::LteRlcUm ()
-  : m_txBufferSize (0),
+  : m_maxTxBufferSize (2 * 1024 * 1024),
+    m_txBufferSize (0),
     m_sequenceNumber (0),
     m_vrUr (0),
     m_vrUx (0),
@@ -57,6 +58,11 @@
   static TypeId tid = TypeId ("ns3::LteRlcUm")
     .SetParent<LteRlc> ()
     .AddConstructor<LteRlcUm> ()
+    .AddAttribute ("MaxTxBufferSize",
+                   "Maximum Size of the Transmission Buffer (in Bytes)",
+                   UintegerValue (2 * 1024 * 1024),
+                   MakeUintegerAccessor (&LteRlcUm::m_maxTxBufferSize),
+                   MakeUintegerChecker<uint32_t> ())
     ;
   return tid;
 }
@@ -71,21 +77,32 @@
 {
   NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize ());
 
-  /** Store arrival time */
-  RlcTag timeTag (Simulator::Now ());
-  p->AddPacketTag (timeTag);
+  if (m_txBufferSize + p->GetSize () <= m_maxTxBufferSize)
+    {
+      /** Store arrival time */
+      RlcTag timeTag (Simulator::Now ());
+      p->AddPacketTag (timeTag);
 
-  /** Store PDCP PDU */
+      /** Store PDCP PDU */
+
+      LteRlcSduStatusTag tag;
+      tag.SetStatus (LteRlcSduStatusTag::FULL_SDU);
+      p->AddPacketTag (tag);
 
-  LteRlcSduStatusTag tag;
-  tag.SetStatus (LteRlcSduStatusTag::FULL_SDU);
-  p->AddPacketTag (tag);
-
-  NS_LOG_LOGIC ("Tx Buffer: New packet added");
-  m_txBuffer.push_back (p);
-  m_txBufferSize += p->GetSize ();
-  NS_LOG_LOGIC ("NumOfBuffers = " << m_txBuffer.size() );
-  NS_LOG_LOGIC ("txBufferSize = " << m_txBufferSize);
+      NS_LOG_LOGIC ("Tx Buffer: New packet added");
+      m_txBuffer.push_back (p);
+      m_txBufferSize += p->GetSize ();
+      NS_LOG_LOGIC ("NumOfBuffers = " << m_txBuffer.size() );
+      NS_LOG_LOGIC ("txBufferSize = " << m_txBufferSize);
+    }
+  else
+    {
+      // Discard full RLC SDU
+      NS_LOG_LOGIC ("TxBuffer is full. RLC SDU discarded");
+      NS_LOG_LOGIC ("MaxTxBufferSize = " << m_maxTxBufferSize);
+      NS_LOG_LOGIC ("txBufferSize    = " << m_txBufferSize);
+      NS_LOG_LOGIC ("packet size     = " << p->GetSize ());
+    }
 
   /** Report Buffer Status */
   DoReportBufferStatus ();
--- a/src/lte/model/lte-rlc-um.h	Mon May 07 13:52:32 2012 +0200
+++ b/src/lte/model/lte-rlc-um.h	Wed May 09 19:08:03 2012 +0200
@@ -67,6 +67,7 @@
   void DoReportBufferStatus ();
 
 private:
+  uint32_t m_maxTxBufferSize;
   uint32_t m_txBufferSize;
   std::vector < Ptr<Packet> > m_txBuffer;       // Transmission buffer
   std::map <uint16_t, Ptr<Packet> > m_rxBuffer; // Reception buffer
--- a/src/lte/test/test-lte-epc-e2e-data.cc	Mon May 07 13:52:32 2012 +0200
+++ b/src/lte/test/test-lte-epc-e2e-data.cc	Wed May 09 19:08:03 2012 +0200
@@ -257,6 +257,11 @@
             
     } 
 
+  Config::Set ("/NodeList/*/DeviceList/*/LteEnbRrc/UeMap/*/RadioBearerMap/*/LteRlc/MaxTxBufferSize",
+               UintegerValue (2 * 1024 * 1024));
+  Config::Set ("/NodeList/*/DeviceList/*/LteUeRrc/RadioBearerMap/*/LteRlc/MaxTxBufferSize",
+               UintegerValue (2 * 1024 * 1024));
+
   lteHelper->EnableRlcTraces ();
   lteHelper->EnablePdcpTraces ();
   Time simulationTime = Seconds (2.0);