22 #include "ns3/simulator.h"
25 #include "ns3/lte-rlc-tm.h"
26 #include "ns3/lte-rlc-tag.h"
32 NS_OBJECT_ENSURE_REGISTERED (LteRlcTm);
35 : m_maxTxBufferSize (0),
41 LteRlcTm::~LteRlcTm ()
47 LteRlcTm::GetTypeId (
void)
49 static TypeId tid = TypeId (
"ns3::LteRlcTm")
51 .AddConstructor<LteRlcTm> ()
52 .AddAttribute (
"MaxTxBufferSize",
53 "Maximum Size of the Transmission Buffer (in Bytes)",
54 UintegerValue (2 * 1024 * 1024),
55 MakeUintegerAccessor (&LteRlcTm::m_maxTxBufferSize),
56 MakeUintegerChecker<uint32_t> ())
81 if (m_txBufferSize + p->
GetSize () <= m_maxTxBufferSize)
88 m_txBuffer.push_back (p);
89 m_txBufferSize += p->
GetSize ();
97 NS_LOG_LOGIC (
"MaxTxBufferSize = " << m_maxTxBufferSize);
103 DoReportBufferStatus ();
115 NS_LOG_FUNCTION (
this << m_rnti << (uint32_t) m_lcid << bytes << (uint32_t) layer << (uint32_t) harqId);
123 if ( m_txBuffer.size () == 0 )
131 if (bytes < packet->GetSize ())
134 NS_LOG_WARN (
"TX opportunity too small = " << bytes <<
" (PDU size: " << packet->
GetSize () <<
")");
138 m_txBufferSize -= (*(m_txBuffer.begin()))->GetSize ();
139 m_txBuffer.erase (m_txBuffer.begin ());
149 params.rnti = m_rnti;
150 params.lcid = m_lcid;
151 params.layer = layer;
152 params.harqProcessId = harqId;
156 if (! m_txBuffer.empty ())
164 LteRlcTm::DoNotifyHarqDeliveryFailure ()
170 LteRlcTm::DoReceivePdu (Ptr<Packet> p)
172 NS_LOG_FUNCTION (
this << m_rnti << (uint32_t) m_lcid << p->GetSize ());
177 if (p->FindFirstMatchingByteTag (rlcTag))
181 m_rxPdu (m_rnti, m_lcid, p->GetSize (), delay.GetNanoSeconds ());
193 LteRlcTm::DoReportBufferStatus (
void)
196 uint32_t queueSize = 0;
198 if (! m_txBuffer.empty ())
201 m_txBuffer.front ()->PeekPacketTag (holTimeTag);
204 queueSize = m_txBufferSize;
207 LteMacSapProvider::ReportBufferStatusParameters r;
210 r.txQueueSize = queueSize;
211 r.txQueueHolDelay = holDelay.GetMilliSeconds () ;
213 r.retxQueueHolDelay = 0;
216 NS_LOG_LOGIC (
"Send ReportBufferStatus = " << r.txQueueSize <<
", " << r.txQueueHolDelay );
221 LteRlcTm::ExpireRbsTimer (
void)
225 if (! m_txBuffer.empty ())
227 DoReportBufferStatus ();
TracedCallback< uint16_t, uint8_t, uint32_t > m_txPdu
#define NS_LOG_FUNCTION(parameters)
void AddPacketTag(const Tag &tag) const
#define NS_LOG_COMPONENT_DEFINE(name)
uint32_t GetSize(void) const
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
virtual void DoTransmitPdcpPdu(Ptr< Packet > p)
virtual void ReceivePdcpPdu(Ptr< Packet > p)=0
#define NS_LOG_LOGIC(msg)
Ptr< Packet > Copy(void) const
virtual void ReportBufferStatus(ReportBufferStatusParameters params)=0
Time MilliSeconds(uint64_t ms)
create ns3::Time instances in units of milliseconds.
TracedCallback< uint16_t, uint8_t, uint32_t, uint64_t > m_rxPdu
virtual void TransmitPdu(TransmitPduParameters params)=0
void AddByteTag(const Tag &tag) const
virtual void DoNotifyTxOpportunity(uint32_t bytes, uint8_t layer, uint8_t harqId)