25 #include <ns3/pointer.h>    26 #include <ns3/packet.h>    27 #include <ns3/packet-burst.h>    28 #include <ns3/random-variable-stream.h>    33 #include <ns3/ff-mac-common.h>    34 #include <ns3/lte-control-messages.h>    35 #include <ns3/simulator.h>    36 #include <ns3/lte-common.h>    66   virtual void SetRnti (uint16_t rnti);
    68   virtual void RemoveLc (uint8_t lcId);
    69   virtual void Reset ();
    71   virtual void SetImsi (uint64_t imsi);
   239     .AddTraceSource (
"RaResponseTimeout",
   240                      "trace fired upon RA response timeout",
   242                      "ns3::LteUeMac::RaResponseTimeoutTracedCallback")
   252      m_freshUlBsr (false),
   256      m_rachConfigured (false),
   257      m_waitingForRaResponse (false)
   349   std::map <uint8_t, LteMacSapProvider::ReportBufferStatusParameters>::iterator it;
   356       (*it).second = params;
   360       m_ulBsrReceived.insert (std::pair<uint8_t, LteMacSapProvider::ReportBufferStatusParameters> (params.
lcid, params));
   387   std::map <uint8_t, LteMacSapProvider::ReportBufferStatusParameters>::iterator it;  
   388   std::vector<uint32_t> queue (4, 0); 
   391       uint8_t lcid = it->first;
   392       std::map <uint8_t, LcInfo>::iterator lcInfoMapIt;
   395       NS_ASSERT_MSG ((lcid != 0) || (((*it).second.txQueueSize == 0)
   396                                      && ((*it).second.retxQueueSize == 0)
   397                                      && ((*it).second.statusPduSize == 0)),
   398                      "BSR should not be used for LCID 0");
   399       uint8_t lcg = lcInfoMapIt->second.lcConfig.logicalChannelGroup;
   400       queue.at (lcg) += ((*it).second.txQueueSize + (*it).second.retxQueueSize + (*it).second.statusPduSize);
   424   bool contention = 
true;
   473   const uint8_t lc0Lcid = 0;
   474   std::map <uint8_t, LcInfo>::iterator lc0InfoIt = 
m_lcInfoMap.find (lc0Lcid);
   476   std::map <uint8_t, LteMacSapProvider::ReportBufferStatusParameters>::iterator lc0BsrIt
   479       && (lc0BsrIt->second.txQueueSize > 0))
   482                      "segmentation of Message 3 is not allowed");
   490       txOpParams.
layer = 0;
   494       txOpParams.
lcid = lc0Lcid;
   495       lc0InfoIt->second.macSapUser->NotifyTxOpportunity (txOpParams);
   496       lc0BsrIt->second.txQueueSize = 0;
   512       NS_LOG_INFO (
"RAR timeout, preambleTransMax reached => giving up");
   567   NS_LOG_FUNCTION (
this << rnti << (uint16_t) preambleId << (uint16_t) prachMask);
   568   NS_ASSERT_MSG (prachMask == 0, 
"requested PRACH MASK = " << (uint32_t) prachMask << 
", but only PRACH MASK = 0 is supported");
   572   bool contention = 
false;
   600   std::map <uint8_t, LcInfo>::iterator it = 
m_lcInfoMap.begin ();
   644           it->second.macSapUser->ReceivePdu (rxPduParams);
   668           std::map <uint8_t, LteMacSapProvider::ReportBufferStatusParameters>::iterator itBsr;
   669           uint16_t activeLcs = 0;
   670           uint32_t statusPduMinSize = 0;
   673               if (((*itBsr).second.statusPduSize > 0) || ((*itBsr).second.retxQueueSize > 0) || ((*itBsr).second.txQueueSize > 0))
   676                   if (((*itBsr).second.statusPduSize != 0)&&((*itBsr).second.statusPduSize < statusPduMinSize))
   678                       statusPduMinSize = (*itBsr).second.statusPduSize;
   680                   if (((*itBsr).second.statusPduSize != 0)&&(statusPduMinSize == 0))
   682                       statusPduMinSize = (*itBsr).second.statusPduSize;
   688               NS_LOG_ERROR (
this << 
" No active flows for this UL-DCI");
   691           std::map <uint8_t, LcInfo>::iterator it;
   692           uint32_t bytesPerActiveLc = dci.m_tbSize / activeLcs;
   693           bool statusPduPriority = 
false;
   694           if ((statusPduMinSize != 0)&&(bytesPerActiveLc < statusPduMinSize))
   697               statusPduPriority = 
true;
   698               NS_LOG_DEBUG (
this << 
" Reduced resource -> send only Status, b ytes " << statusPduMinSize);
   699               if (dci.m_tbSize < statusPduMinSize)
   701                   NS_FATAL_ERROR (
"Insufficient Tx Opportunity for sending a status message");
   704           NS_LOG_LOGIC (
this << 
" UE " << 
m_rnti << 
": UL-CQI notified TxOpportunity of " << dci.m_tbSize << 
" => " << bytesPerActiveLc << 
" bytes per active LC" << 
" statusPduMinSize " << statusPduMinSize);
   711               NS_LOG_DEBUG (
this << 
" Processing LC " << (uint32_t)(*it).first << 
" bytesPerActiveLc " << bytesPerActiveLc);
   713                    && ( ((*itBsr).second.statusPduSize > 0)
   714                         || ((*itBsr).second.retxQueueSize > 0)
   715                         || ((*itBsr).second.txQueueSize > 0)) )
   717                   if ((statusPduPriority) && ((*itBsr).second.statusPduSize == statusPduMinSize))
   719                       txOpParams.
bytes = (*itBsr).second.statusPduSize;
   720                       txOpParams.
layer = 0;
   724                       txOpParams.
lcid = (*it).first;
   725                       (*it).second.macSapUser->NotifyTxOpportunity (txOpParams);
   726                       NS_LOG_LOGIC (
this << 
"\t" << bytesPerActiveLc << 
" send  " << (*itBsr).second.statusPduSize << 
" status bytes to LC " << (uint32_t)(*it).first << 
" statusQueue " << (*itBsr).second.statusPduSize << 
" retxQueue" << (*itBsr).second.retxQueueSize << 
" txQueue" <<  (*itBsr).second.txQueueSize);
   727                       (*itBsr).second.statusPduSize = 0;
   732                       uint32_t bytesForThisLc = bytesPerActiveLc;
   733                       NS_LOG_LOGIC (
this << 
"\t" << bytesPerActiveLc << 
" bytes to LC " << (uint32_t)(*it).first << 
" statusQueue " << (*itBsr).second.statusPduSize << 
" retxQueue" << (*itBsr).second.retxQueueSize << 
" txQueue" <<  (*itBsr).second.txQueueSize);
   734                       if (((*itBsr).second.statusPduSize > 0) && (bytesForThisLc > (*itBsr).second.statusPduSize))
   736                           txOpParams.
bytes = (*itBsr).second.statusPduSize;
   737                           txOpParams.
layer = 0;
   741                           txOpParams.
lcid = (*it).first;
   742                           (*it).second.macSapUser->NotifyTxOpportunity (txOpParams);
   743                           bytesForThisLc -= (*itBsr).second.statusPduSize;
   744                           NS_LOG_DEBUG (
this << 
" serve STATUS " << (*itBsr).second.statusPduSize);
   745                           (*itBsr).second.statusPduSize = 0;
   749                           if ((*itBsr).second.statusPduSize > bytesForThisLc)
   751                               NS_FATAL_ERROR (
"Insufficient Tx Opportunity for sending a status message");
   755                       if ((bytesForThisLc > 7)    
   756                           && (((*itBsr).second.retxQueueSize > 0)
   757                               || ((*itBsr).second.txQueueSize > 0)))
   759                           if ((*itBsr).second.retxQueueSize > 0)
   761                               NS_LOG_DEBUG (
this << 
" serve retx DATA, bytes " << bytesForThisLc);
   762                               txOpParams.
bytes = bytesForThisLc;
   763                               txOpParams.
layer = 0;
   767                               txOpParams.
lcid = (*it).first;
   768                               (*it).second.macSapUser->NotifyTxOpportunity (txOpParams);
   769                               if ((*itBsr).second.retxQueueSize >= bytesForThisLc)
   771                                   (*itBsr).second.retxQueueSize -= bytesForThisLc;
   775                                   (*itBsr).second.retxQueueSize = 0;
   778                           else if ((*itBsr).second.txQueueSize > 0)
   780                               uint16_t lcid = (*it).first;
   781                               uint32_t rlcOverhead;
   795                               NS_LOG_DEBUG (
this << 
" serve tx DATA, bytes " << bytesForThisLc << 
", RLC overhead " << rlcOverhead);
   796                               txOpParams.
bytes = bytesForThisLc;
   797                               txOpParams.
layer = 0;
   801                               txOpParams.
lcid = (*it).first;
   802                               (*it).second.macSapUser->NotifyTxOpportunity (txOpParams);
   803                               if ((*itBsr).second.txQueueSize >= bytesForThisLc - rlcOverhead)
   805                                   (*itBsr).second.txQueueSize -= bytesForThisLc - rlcOverhead;
   809                                   (*itBsr).second.txQueueSize = 0;
   815                           if ( ((*itBsr).second.retxQueueSize > 0) || ((*itBsr).second.txQueueSize > 0)) 
   821                       NS_LOG_LOGIC (
this << 
"\t" << bytesPerActiveLc << 
"\t new queues " << (uint32_t)(*it).first << 
" statusQueue " << (*itBsr).second.statusPduSize << 
" retxQueue" << (*itBsr).second.retxQueueSize << 
" txQueue" <<  (*itBsr).second.txQueueSize);
   846           uint16_t raRnti = rarMsg->GetRaRnti ();
   847           NS_LOG_LOGIC (
this << 
"got RAR with RA-RNTI " << (uint32_t) raRnti << 
", expecting " << (uint32_t) 
m_raRnti);
   850               for (std::list<RarLteControlMessage::Rar>::const_iterator it = rarMsg->RarListBegin ();
   851                    it != rarMsg->RarListEnd ();
   867       NS_LOG_WARN (
this << 
" LteControlMessage not recognized");
   883               NS_LOG_INFO (
this << 
" HARQ Proc Id " << i << 
" packets buffer expired");
 static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay. 
uint8_t numberOfRaPreambles
number of RA preambles 
virtual void AddLc(uint8_t lcId, LteUeCmacSapProvider::LogicalChannelConfig lcConfig, LteMacSapUser *msu)
add a new Logical Channel (LC) 
void DoStartNonContentionBasedRandomAccessProcedure(uint16_t rnti, uint8_t rapId, uint8_t prachMask)
Start non contention based random access procedure function. 
LteUeCmacSapProvider::LogicalChannelConfig lcConfig
logical channel config 
Simulation virtual time values and global simulation resolution. 
void DoReset()
Reset function. 
uint8_t m_raPreambleId
RA preamble ID. 
uint8_t raResponseWindowSize
RA response window size. 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void SetStream(int64_t stream)
Specifies the stream number for the RngStream. 
virtual void TransmitPdu(TransmitPduParameters params)
send an RLC PDU to the MAC for transmission. 
Parameters for LteMacSapUser::NotifyTxOpportunity. 
void SendRaPreamble(bool contention)
Send RA preamble function. 
void StartWaitingForRaResponse()
Start waiting for RA response function. 
void DoReceivePhyPdu(Ptr< Packet > p)
Receive Phy PDU function. 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
Ptr< UniformRandomVariable > m_raPreambleUniformVariable
RA preamble random variable. 
LteUePhySapUser * m_uePhySapUser
UE Phy SAP user. 
void DoSetRnti(uint16_t rnti)
Set RNTI. 
UeMemberLteMacSapProvider class. 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit. 
void RaResponseTimeout(bool contention)
RA response timeout function. 
See section 4.3.2 ulDciListElement. 
virtual void ReportBufferStatus(ReportBufferStatusParameters params)
Report the RLC buffer status to the MAC. 
struct MacCeValue_u m_macCeValue
MAC CE value. 
uint16_t rnti
the C-RNTI identifying the UE 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate. 
See section 4.3.10 buildRARListElement. 
void DoAddLc(uint8_t lcId, LteUeCmacSapProvider::LogicalChannelConfig lcConfig, LteMacSapUser *msu)
Add LC function. 
virtual void DoDispose(void)
Destructor implementation. 
void SetLteUePhySapProvider(LteUePhySapProvider *s)
Set the PHY SAP Provider. 
virtual void SendRachPreamble(uint32_t prachId, uint32_t raRnti)=0
Send a preamble on the PRACH. 
LteMacSapUser * macSapUser
MAC SAP user. 
Service Access Point (SAP) offered by the PHY to the MAC. 
UeMemberLteUeCmacSapProvider class. 
uint8_t lcid
the logical channel id corresponding to the sending RLC instance 
void DoStartContentionBasedRandomAccessProcedure()
Start contention based random access procedure function. 
void SendReportBufferStatus(void)
Send report buffer status. 
virtual void NotifyConnectionSuccessful()=0
Notify PHY about the successful RRC connection establishment. 
virtual void SubframeIndication(uint32_t frameNo, uint32_t subframeNo)
Trigger the start from a new frame (input from Phy layer) 
uint8_t harqId
the HARQ ID 
virtual void StartContentionBasedRandomAccessProcedure()
tell the MAC to start a contention-based random access procedure, e.g., to perform RRC connection est...
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source. 
void DoRemoveLc(uint8_t lcId)
Remove LC function. 
Parameters for LteMacSapProvider::ReportBufferStatus. 
uint8_t lcid
the logical channel id 
std::vector< uint8_t > m_miUlHarqProcessesPacketTimer
timer for packet life in the buffer 
friend class UeMemberLteUePhySapUser
allow UeMemberLteUePhySapUser class friend access 
uint8_t lcid
the logical channel id 
void SetLteUeCmacSapUser(LteUeCmacSapUser *s)
Set the LTE UE CMAC SAP user. 
void DoTransmitPdu(LteMacSapProvider::TransmitPduParameters params)
Transmit PDU function. 
virtual void ConfigureRach(RachConfig rc)
Configure RACH function. 
virtual void SetTemporaryCellRnti(uint16_t rnti)=0
friend class UeMemberLteMacSapProvider
allow UeMemberLteMacSapProvider class friend access 
uint8_t preambleTransMax
preamble transmit maximum 
uint16_t GetRnti(void) const
Get RNTI function. 
uint8_t m_harqProcessId
HARQ process ID. 
static uint8_t BufferSize2BsrId(uint32_t val)
Convert Buffer size to BSR ID. 
virtual void Reset()
reset the MAC 
LteUeMac * m_mac
the UE MAC 
uint32_t m_frameNo
frame number 
bool m_waitingForRaResponse
waiting for RA response 
void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters params)
Report buffers status function. 
virtual void StartNonContentionBasedRandomAccessProcedure(uint16_t rnti, uint8_t preambleId, uint8_t prachMask)
tell the MAC to start a non-contention-based random access procedure, e.g., as a consequence of hando...
virtual void SendMacPdu(Ptr< Packet > p)=0
Send the MAC PDU to the channel. 
LteUeCmacSapProvider * m_cmacSapProvider
CMAC SAP provider. 
uint16_t rnti
the C-RNTI identifying the UE 
virtual void NotifyConnectionSuccessful()
Notify MAC about the successful RRC connection establishment. 
uint8_t componentCarrierId
the component carrier id 
std::vector< Ptr< PacketBurst > > m_miUlHarqProcessesPacket
Packets under transmission of the UL HARQ processes. 
LteUeCmacSapProvider * GetLteUeCmacSapProvider(void)
Get the LTE CMAC SAP provider. 
void DoSetImsi(uint64_t imsi)
Set IMSI. 
Service Access Point (SAP) offered by the UE MAC to the UE RRC. 
void SetComponentCarrierId(uint8_t index)
Set the component carried ID. 
LogicalChannelConfig structure. 
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC. 
void DoConfigureRach(LteUeCmacSapProvider::RachConfig rc)
Configure RACH function. 
virtual void NotifyRandomAccessSuccessful()=0
Notify the RRC that the MAC Random Access procedure completed successfully. 
See section 4.3.14 macCEListElement. 
void DoSubframeIndication(uint32_t frameNo, uint32_t subframeNo)
Forwarded from LteUePhySapUser: trigger the start from a new frame. 
UeMemberLteUeCmacSapProvider(LteUeMac *mac)
Constructor. 
void DoReceiveLteControlMessage(Ptr< LteControlMessage > msg)
Receive LTE control message function. 
std::map< uint8_t, LcInfo > m_lcInfoMap
logical channel info map 
virtual void SendLteControlMessage(Ptr< LteControlMessage > msg)=0
Send SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel. 
LteUePhySapUser * GetLteUePhySapUser()
Get the PHY SAP user. 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
LteMacSapProvider * GetLteMacSapProvider(void)
Get the LTE MAC SAP provider. 
uint16_t m_backoffParameter
backoff parameter 
static TypeId GetTypeId(void)
Get the type ID. 
Ptr< Packet > Copy(void) const
performs a COW copy of the packet. 
UeMemberLteUePhySapUser(LteUeMac *mac)
Constructor. 
LteMacSapProvider * m_macSapProvider
MAC SAP provider. 
Service Access Point (SAP) offered by the UE MAC to the UE RRC. 
uint8_t lcid
the logical channel id corresponding to the sending RLC instance 
virtual void ReceivePhyPdu(Ptr< Packet > p)
Receive Phy Pdu funtion. 
LteUePhySapProvider * m_uePhySapProvider
UE Phy SAP provider. 
uint8_t m_componentCarrierId
component carrier Id –> used to address sap 
static Time Now(void)
Return the current simulation virtual time. 
bool m_freshUlBsr
true when a BSR has been received in the last TTI 
virtual void RemoveLc(uint8_t lcId)
remove an existing LC 
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
virtual void SetRnti(uint16_t rnti)
std::vector< uint8_t > m_bufferStatus
buffer status 
virtual void NotifyRandomAccessFailed()=0
Notify the RRC that the MAC Random Access procedure failed. 
void RandomlySelectAndSendRaPreamble()
Randomly select and send RA preamble function. 
void RecvRaResponse(BuildRarListElement_s raResponse)
Receive the RA response function. 
uint32_t bytes
the number of bytes to transmit 
uint8_t m_preambleTransmissionCounter
preamble tranamission counter 
uint8_t GetLcid(void) const
Get LCID function. 
uint8_t layer
the layer of transmission (MIMO) 
void AddPacketTag(const Tag &tag) const
Add a packet tag. 
Service Access Point (SAP) offered by the MAC to the RLC See Femto Forum MAC Scheduler Interface Spec...
EventId m_noRaResponseReceivedEvent
no RA response received event ID 
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN. 
bool m_rachConfigured
is RACH configured? 
virtual void DoDispose(void)
Destructor implementation. 
LteUeCmacSapProvider::RachConfig m_rachConfig
RACH configuration. 
Service Access Point (SAP) offered by the UE-PHY to the UE-MAC. 
bool RemovePacketTag(Tag &tag)
Remove a packet tag. 
void DoNotifyConnectionSuccessful()
Notify MAC about the successful RRC connection establishment. 
LteUeMac * m_mac
the UE MAC 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG. 
LteUeMac * m_mac
the UE MAC 
Ptr< Packet > pdu
the RLC PDU 
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method. 
Service Access Point (SAP) offered by the MAC to the RLC See Femto Forum MAC Scheduler Interface Spec...
Tag used to define the RNTI and LC id for each MAC packet trasmitted. 
enum ns3::MacCeListElement_s::MacCeType_e m_macCeType
MAC CE type. 
Parameters for LteMacSapUser::ReceivePdu. 
uint16_t rnti
the C-RNTI identifying the UE 
Time m_bsrPeriodicity
BSR periodicity. 
virtual void ReceiveLteControlMessage(Ptr< LteControlMessage > msg)
Receive SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel. 
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR. 
uint32_t m_subframeNo
subframe number 
std::map< uint8_t, LteMacSapProvider::ReportBufferStatusParameters > m_ulBsrReceived
BSR received from RLC (the last one) 
A base class which provides memory management and object aggregation. 
friend class UeMemberLteUeCmacSapProvider
allow UeMemberLteUeCmacSapProvider class friend access 
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
a unique identifier for an interface. 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
void RefreshHarqProcessesPacketBuffer(void)
Refresh HARQ processes packet buffer function. 
TracedCallback< uint64_t, bool, uint8_t, uint8_t > m_raResponseTimeoutTrace
The RaResponseTimeout trace source. 
virtual void SetImsi(uint64_t imsi)
A method call by UE RRC to communicate the IMSI to the UE MAC. 
UeMemberLteMacSapProvider(LteUeMac *mac)
Constructor. 
LteUeCmacSapUser * m_cmacSapUser
CMAC SAP user. 
Ptr< Packet > p
the RLC PDU to be received 
Parameters for LteMacSapProvider::TransmitPdu.