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> 
   62   virtual void RemoveLc (uint8_t lcId);
 
   63   virtual void Reset ();
 
  207      m_freshUlBsr (false),
 
  210      m_rachConfigured (false),
 
  211      m_waitingForRaResponse (false)
 
  297   std::map <uint8_t, LteMacSapProvider::ReportBufferStatusParameters>::iterator it;
 
  304       (*it).second = params;
 
  308       m_ulBsrReceived.insert (std::pair<uint8_t, LteMacSapProvider::ReportBufferStatusParameters> (params.
lcid, params));
 
  335   std::map <uint8_t, LteMacSapProvider::ReportBufferStatusParameters>::iterator it;  
 
  336   std::vector<uint32_t> queue (4, 0); 
 
  339       uint8_t lcid = it->first;
 
  340       std::map <uint8_t, LcInfo>::iterator lcInfoMapIt;
 
  343       NS_ASSERT_MSG ((lcid != 0) || (((*it).second.txQueueSize == 0)
 
  344                                      && ((*it).second.retxQueueSize == 0)
 
  345                                      && ((*it).second.statusPduSize == 0)),
 
  346                      "BSR should not be used for LCID 0");
 
  347       uint8_t lcg = lcInfoMapIt->second.lcConfig.logicalChannelGroup;
 
  348       queue.at (lcg) += ((*it).second.txQueueSize + (*it).second.retxQueueSize + (*it).second.statusPduSize);
 
  372   bool contention = 
true;
 
  421   const uint8_t lc0Lcid = 0;
 
  422   std::map <uint8_t, LcInfo>::iterator lc0InfoIt = 
m_lcInfoMap.find (lc0Lcid);
 
  424   std::map <uint8_t, LteMacSapProvider::ReportBufferStatusParameters>::iterator lc0BsrIt
 
  427       && (lc0BsrIt->second.txQueueSize > 0))
 
  430                      "segmentation of Message 3 is not allowed");
 
  431       lc0InfoIt->second.macSapUser->NotifyTxOpportunity (raResponse.
m_grant.
m_tbSize, 0, 0); 
 
  432       lc0BsrIt->second.txQueueSize = 0;
 
  445       NS_LOG_INFO (
"RAR timeout, preambleTransMax reached => giving up");
 
  486   NS_ASSERT_MSG (prachMask == 0, 
"requested PRACH MASK = " << (uint32_t) prachMask << 
", but only PRACH MASK = 0 is supported");
 
  489   bool contention = 
false;
 
  501   lcInfo.macSapUser = msu;
 
  517   std::map <uint8_t, LcInfo>::iterator it = 
m_lcInfoMap.begin ();
 
  549           it->second.macSapUser->ReceivePdu (p);
 
  573           std::map <uint8_t, LteMacSapProvider::ReportBufferStatusParameters>::iterator itBsr;
 
  574           uint16_t activeLcs = 0;
 
  575           uint32_t statusPduMinSize = 0;
 
  578               if (((*itBsr).second.statusPduSize > 0) || ((*itBsr).second.retxQueueSize > 0) || ((*itBsr).second.txQueueSize > 0))
 
  581                   if (((*itBsr).second.statusPduSize != 0)&&((*itBsr).second.statusPduSize < statusPduMinSize))
 
  583                       statusPduMinSize = (*itBsr).second.statusPduSize;
 
  585                   if (((*itBsr).second.statusPduSize != 0)&&(statusPduMinSize == 0))
 
  587                       statusPduMinSize = (*itBsr).second.statusPduSize;
 
  593               NS_LOG_ERROR (
this << 
" No active flows for this UL-DCI");
 
  596           std::map <uint8_t, LcInfo>::iterator it;
 
  597           uint32_t bytesPerActiveLc = dci.m_tbSize / activeLcs;
 
  598           bool statusPduPriority = 
false;
 
  599           if ((statusPduMinSize != 0)&&(bytesPerActiveLc < statusPduMinSize))
 
  602               statusPduPriority = 
true;
 
  603               NS_LOG_DEBUG (
this << 
" Reduced resource -> send only Status, b ytes " << statusPduMinSize);
 
  604               if (dci.m_tbSize < statusPduMinSize)
 
  606                   NS_FATAL_ERROR (
"Insufficient Tx Opportunity for sending a status message");
 
  609           NS_LOG_LOGIC (
this << 
" UE " << 
m_rnti << 
": UL-CQI notified TxOpportunity of " << dci.m_tbSize << 
" => " << bytesPerActiveLc << 
" bytes per active LC" << 
" statusPduMinSize " << statusPduMinSize);
 
  613               NS_LOG_DEBUG (
this << 
" Processing LC " << (uint32_t)(*it).first << 
" bytesPerActiveLc " << bytesPerActiveLc);
 
  615                    && ( ((*itBsr).second.statusPduSize > 0)
 
  616                         || ((*itBsr).second.retxQueueSize > 0)
 
  617                         || ((*itBsr).second.txQueueSize > 0)) )
 
  619                   if ((statusPduPriority) && ((*itBsr).second.statusPduSize == statusPduMinSize))
 
  621                       (*it).second.macSapUser->NotifyTxOpportunity ((*itBsr).second.statusPduSize, 0, 0);
 
  622                       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);
 
  623                       (*itBsr).second.statusPduSize = 0;
 
  628                       uint32_t bytesForThisLc = bytesPerActiveLc;
 
  629                       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);
 
  630                       if (((*itBsr).second.statusPduSize > 0) && (bytesForThisLc > (*itBsr).second.statusPduSize))
 
  632                           (*it).second.macSapUser->NotifyTxOpportunity ((*itBsr).second.statusPduSize, 0, 0);
 
  633                           bytesForThisLc -= (*itBsr).second.statusPduSize;
 
  634                           NS_LOG_DEBUG (
this << 
" serve STATUS " << (*itBsr).second.statusPduSize);
 
  635                           (*itBsr).second.statusPduSize = 0;
 
  639                           if ((*itBsr).second.statusPduSize > bytesForThisLc)
 
  641                               NS_FATAL_ERROR (
"Insufficient Tx Opportunity for sending a status message");
 
  645                       if ((bytesForThisLc > 7)    
 
  646                           && (((*itBsr).second.retxQueueSize > 0)
 
  647                               || ((*itBsr).second.txQueueSize > 0)))
 
  649                           if ((*itBsr).second.retxQueueSize > 0)
 
  651                               NS_LOG_DEBUG (
this << 
" serve retx DATA, bytes " << bytesForThisLc);
 
  652                               (*it).second.macSapUser->NotifyTxOpportunity (bytesForThisLc, 0, 0);
 
  653                               if ((*itBsr).second.retxQueueSize >= bytesForThisLc)
 
  655                                   (*itBsr).second.retxQueueSize -= bytesForThisLc;
 
  659                                   (*itBsr).second.retxQueueSize = 0;
 
  662                           else if ((*itBsr).second.txQueueSize > 0)
 
  664                               uint16_t lcid = (*it).first;
 
  665                               uint32_t rlcOverhead;
 
  679                               NS_LOG_DEBUG (
this << 
" serve tx DATA, bytes " << bytesForThisLc << 
", RLC overhead " << rlcOverhead);
 
  680                               (*it).second.macSapUser->NotifyTxOpportunity (bytesForThisLc, 0, 0);
 
  681                               if ((*itBsr).second.txQueueSize >= bytesForThisLc - rlcOverhead)
 
  683                                   (*itBsr).second.txQueueSize -= bytesForThisLc - rlcOverhead;
 
  687                                   (*itBsr).second.txQueueSize = 0;
 
  693                           if ( ((*itBsr).second.retxQueueSize > 0) || ((*itBsr).second.txQueueSize > 0)) 
 
  699                       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);
 
  724           uint16_t raRnti = rarMsg->GetRaRnti ();
 
  725           NS_LOG_LOGIC (
this << 
"got RAR with RA-RNTI " << (uint32_t) raRnti << 
", expecting " << (uint32_t) 
m_raRnti);
 
  726           if (raRnti == m_raRnti) 
 
  728               for (std::list<RarLteControlMessage::Rar>::const_iterator it = rarMsg->RarListBegin ();
 
  729                    it != rarMsg->RarListEnd ();
 
  745       NS_LOG_WARN (
this << 
" LteControlMessage not recognized");
 
  761               NS_LOG_INFO (
this << 
" HARQ Proc Id " << i << 
" packets buffer expired");
 
uint8_t numberOfRaPreambles
 
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)
 
LteUeCmacSapProvider::LogicalChannelConfig lcConfig
 
uint8_t GetLcid(void) const 
 
Simulation virtual time values and global simulation resolution. 
 
uint8_t raResponseWindowSize
 
#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 this RNG stream. 
 
virtual void TransmitPdu(TransmitPduParameters params)
send an RLC PDU to the MAC for transmission. 
 
void SendRaPreamble(bool contention)
 
void StartWaitingForRaResponse()
 
void DoReceivePhyPdu(Ptr< Packet > p)
 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
 
Ptr< UniformRandomVariable > m_raPreambleUniformVariable
 
uint16_t GetRnti(void) const 
 
LteUePhySapUser * m_uePhySapUser
 
void AddPacketTag(const Tag &tag) const 
Add a packet tag. 
 
#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)
 
See section 4.3.2 ulDciListElement. 
 
virtual void ReportBufferStatus(ReportBufferStatusParameters params)
Report the RLC buffer status to the MAC. 
 
struct MacCeValue_u m_macCeValue
 
#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)
 
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 
 
Service Access Point (SAP) offered by the PHY to the MAC. 
 
uint8_t lcid
the logical channel id corresponding to the sending RLC instance 
 
void DoStartContentionBasedRandomAccessProcedure()
 
void SendReportBufferStatus(void)
 
virtual void SubframeIndication(uint32_t frameNo, uint32_t subframeNo)
Trigger the start from a new frame (input from Phy layer) 
 
virtual void StartContentionBasedRandomAccessProcedure()
tell the MAC to start a contention-based random access procedure, e.g., to perform RRC connection est...
 
void DoRemoveLc(uint8_t lcId)
 
Parameters for LteMacSapProvider::ReportBufferStatus. 
 
std::vector< uint8_t > m_miUlHarqProcessesPacketTimer
 
friend class UeMemberLteUePhySapUser
 
void SetLteUeCmacSapUser(LteUeCmacSapUser *s)
 
void DoTransmitPdu(LteMacSapProvider::TransmitPduParameters params)
 
virtual void ConfigureRach(RachConfig rc)
 
virtual void SetTemporaryCellRnti(uint16_t rnti)=0
 
friend class UeMemberLteMacSapProvider
 
virtual uint32_t GetInteger(void)=0
Get the next random value as an integer drawn from the distribution. 
 
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay. 
 
static uint8_t BufferSize2BsrId(uint32_t val)
 
virtual void Reset()
reset the MAC 
 
bool m_waitingForRaResponse
 
void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters params)
 
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
 
uint16_t rnti
the C-RNTI identifying the UE 
 
std::vector< Ptr< PacketBurst > > m_miUlHarqProcessesPacket
 
LteUeCmacSapProvider * GetLteUeCmacSapProvider(void)
 
Service Access Point (SAP) offered by the UE MAC to the UE RRC. 
 
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC. 
 
void DoConfigureRach(LteUeCmacSapProvider::RachConfig rc)
 
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)
 
void DoReceiveLteControlMessage(Ptr< LteControlMessage > msg)
 
Ptr< Packet > Copy(void) const 
performs a COW copy of the packet. 
 
std::map< uint8_t, LcInfo > m_lcInfoMap
 
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)
 
uint16_t m_backoffParameter
 
static TypeId GetTypeId(void)
 
UeMemberLteUePhySapUser(LteUeMac *mac)
 
LteMacSapProvider * m_macSapProvider
 
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)
Called by the Phy to notify the MAC of the reception of a new PHY-PDU. 
 
LteUePhySapProvider * m_uePhySapProvider
 
static Time Now(void)
Return the current simulation virtual time. 
 
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...
 
std::vector< uint8_t > m_bufferStatus
 
virtual void NotifyRandomAccessFailed()=0
Notify the RRC that the MAC Random Access procedure failed. 
 
void RandomlySelectAndSendRaPreamble()
 
void RecvRaResponse(BuildRarListElement_s raResponse)
 
uint8_t m_preambleTransmissionCounter
 
Service Access Point (SAP) offered by the MAC to the RLC See Femto Forum MAC Scheduler Interface Spec...
 
EventId m_noRaResponseReceivedEvent
 
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN. 
 
virtual void DoDispose(void)
Destructor implementation. 
 
LteUeCmacSapProvider::RachConfig m_rachConfig
 
Service Access Point (SAP) offered by the UE-PHY to the UE-MAC. 
 
bool RemovePacketTag(Tag &tag)
Remove a packet tag. 
 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG. 
 
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
 
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. 
 
std::map< uint8_t, LteMacSapProvider::ReportBufferStatusParameters > m_ulBsrReceived
 
A base class which provides memory management and object aggregation. 
 
friend class UeMemberLteUeCmacSapProvider
 
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)
 
UeMemberLteMacSapProvider(LteUeMac *mac)
 
LteUeCmacSapUser * m_cmacSapUser
 
Parameters for LteMacSapProvider::TransmitPdu.