24 #include <ns3/pointer.h>
25 #include <ns3/packet.h>
26 #include <ns3/simulator.h>
33 #include <ns3/lte-enb-mac.h>
34 #include <ns3/lte-radio-bearer-tag.h>
35 #include <ns3/lte-ue-phy.h>
37 #include "ns3/lte-mac-sap.h"
38 #include <ns3/lte-common.h>
61 virtual void ConfigureMac (uint8_t ulBandwidth, uint8_t dlBandwidth);
62 virtual void AddUe (uint16_t rnti);
63 virtual void RemoveUe (uint16_t rnti);
66 virtual void ReleaseLc (uint16_t rnti, uint8_t lcid);
318 .AddConstructor<LteEnbMac> ()
319 .AddAttribute (
"NumberOfRaPreambles",
320 "how many random access preambles are available for the contention based RACH process",
323 MakeUintegerChecker<uint8_t> (4, 64))
324 .AddAttribute (
"PreambleTransMax",
325 "Maximum number of random access preamble transmissions",
328 MakeUintegerChecker<uint8_t> (3, 200))
329 .AddAttribute (
"RaResponseWindowSize",
330 "length of the window (in TTIs) for the reception of the random access response (RAR); the resulting RAR timeout is this value + 3 ms",
333 MakeUintegerChecker<uint8_t> (2, 10))
334 .AddTraceSource (
"DlScheduling",
335 "Information regarding DL scheduling.",
337 .AddTraceSource (
"UlScheduling",
338 "Information regarding UL scheduling.",
448 NS_LOG_FUNCTION (
this <<
" EnbMac - frame " << frameNo <<
" subframe " << subframeNo);
460 dlcqiInfoReq.
m_sfnSf = ((0x3FF & frameNo) << 4) | (0xF & subframeNo);
476 NS_ASSERT (subframeNo > 0 && subframeNo <= 10);
481 NS_LOG_INFO (
this <<
" preambleId " << (uint32_t) it->first <<
": " << it->second <<
" received");
485 NS_LOG_INFO (
"preambleId " << (uint32_t) it->first <<
": collision");
495 rnti = jt->second.rnti;
496 NS_LOG_INFO (
"preambleId previously allocated for NC based RA, RNTI =" << (uint32_t) rnti <<
", sending RAR");
502 NS_LOG_INFO (
"preambleId " << (uint32_t) it->first <<
": allocated T-C-RNTI " << (uint32_t) rnti <<
", sending RAR");
508 rachInfoReqParams.
m_rachList.push_back (rachLe);
509 m_rapIdRntiMap.insert (std::pair <uint16_t, uint32_t> (rnti, it->first));
529 dlparams.
m_sfnSf = ((0x3FF & dlSchedFrameNo) << 4) | (0xF & dlSchedSubframeNo);
544 std::vector <FfMacSchedSapProvider::SchedUlCqiInfoReqParameters>::iterator itCqi;
549 m_ulCqiReceived.at (i).m_sfnSf = ((0x3FF & frameNo) << 4) | (0xF & (subframeNo - 1));
553 m_ulCqiReceived.at (i).m_sfnSf = ((0x3FF & (frameNo-1)) << 4) | (0xF & 10);
563 ulMacReq.
m_sfnSf = ((0x3FF & frameNo) << 4) | (0xF & subframeNo);
584 ulparams.
m_sfnSf = ((0x3FF & ulSchedFrameNo) << 4) | (0xF & ulSchedSubframeNo);
620 NS_LOG_LOGIC (
this <<
" LteControlMessage type " << msg->GetMessageType () <<
" not recognized");
709 uint16_t rnti = tag.
GetRnti ();
711 std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt =
m_rlcAttached.find (rnti);
713 std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcid);
714 NS_ASSERT_MSG (lcidIt != rntiIt->second.end (),
"could not find LCID" << lcid);
715 (*lcidIt).second->ReceivePdu (p);
728 NS_LOG_FUNCTION (
this <<
" ulBandwidth=" << (uint16_t) ulBandwidth <<
" dlBandwidth=" << (uint16_t) dlBandwidth);
743 std::map<uint8_t, LteMacSapUser*>
empty;
744 std::pair <std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator,
bool>
745 ret =
m_rlcAttached.insert (std::pair <uint16_t, std::map<uint8_t, LteMacSapUser*> >
747 NS_ASSERT_MSG (ret.second,
"element already present, RNTI already existed");
756 std::vector < Ptr<PacketBurst> > dlHarqLayer0pkt;
757 dlHarqLayer0pkt.resize (8);
758 for (uint8_t i = 0; i < 8; i++)
761 dlHarqLayer0pkt.at (i) = pb;
763 std::vector < Ptr<PacketBurst> > dlHarqLayer1pkt;
764 dlHarqLayer1pkt.resize (8);
765 for (uint8_t i = 0; i < 8; i++)
768 dlHarqLayer1pkt.at (i) = pb;
771 buf.push_back (dlHarqLayer0pkt);
772 buf.push_back (dlHarqLayer1pkt);
792 std::map <LteFlowId_t, LteMacSapUser* >::iterator it;
796 std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt =
m_rlcAttached.find (lcinfo.
rnti);
798 std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcinfo.
lcId);
799 if (lcidIt == rntiIt->second.end ())
801 rntiIt->second.insert (std::pair<uint8_t, LteMacSapUser*> (lcinfo.
lcId, msu));
812 if (lcinfo.
lcId != 0)
885 preambleInfo.
rnti = rnti;
886 NS_LOG_INFO (
"allocated preamble for NC based RA: preamble " << preambleId <<
", RNTI " << preambleInfo.
rnti <<
", exiryTime " << preambleInfo.
expiryTime);
959 std::map <LteFlowId_t, LteMacSapUser* >::iterator it;
963 for (uint16_t layer = 0; layer < ind.
m_buildDataList.at (i).m_dci.m_ndi.size (); layer++)
970 for (uint16_t lcId = 0; lcId < (*it).second.size (); lcId ++)
973 (*it).second.at (lcId).at (ind.
m_buildDataList.at (i).m_dci.m_harqProcess) = pb;
977 for (
unsigned int j = 0; j < ind.
m_buildDataList.at (i).m_rlcPduList.size (); j++)
979 for (uint16_t k = 0; k < ind.
m_buildDataList.at (i).m_rlcPduList.at (j).size (); k++)
985 uint8_t lcid = ind.
m_buildDataList.at (i).m_rlcPduList.at (j).at (k).m_logicalChannelIdentity;
986 std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt =
m_rlcAttached.find (rnti);
988 std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcid);
989 NS_ASSERT_MSG (lcidIt != rntiIt->second.end (),
"could not find LCID" << lcid);
990 NS_LOG_DEBUG (
this <<
" rnti= " << rnti <<
" lcid= " << (uint32_t) lcid <<
" layer= " << k);
991 (*lcidIt).second->NotifyTxOpportunity (ind.
m_buildDataList.at (i).m_rlcPduList.at (j).at (k).m_size, k, ind.
m_buildDataList.at (i).m_dci.m_harqProcess);
1041 NS_FATAL_ERROR (
"Found element with more than two transport blocks");
1058 rarMsg->SetRaRnti (raRnti);
1067 rar.
rapId = itRapId->second;
1069 rarMsg->AddRar (rar);
1085 for (
unsigned int i = 0; i < ind.
m_dciList.size (); i++)
1094 for ( uint32_t i = 0; i < ind.
m_dciList.size (); i++ )
1175 for (uint8_t layer = 0; layer < params.
m_harqStatus.size (); layer++)
std::vector< struct UlInfoListElement_s > m_ulInfoList
void DoConfigureMac(uint8_t ulBandwidth, uint8_t dlBandwidth)
void DoReconfigureLc(LteEnbCmacSapProvider::LcInfo lcinfo)
FfMacSchedSapUser * m_schedSapUser
virtual void UlCqiReport(FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi)
Returns to MAC level the UL-CQI evaluated.
uint8_t GetLcid(void) const
EnbMacMemberFfMacCschedSapUser(LteEnbMac *mac)
void DoDlInfoListElementHarqFeeback(DlInfoListElement_s params)
#define NS_LOG_FUNCTION(parameters)
std::vector< FfMacSchedSapProvider::SchedUlCqiInfoReqParameters > m_ulCqiReceived
uint8_t m_logicalChannelIdentity
virtual void CschedUeConfigReq(const struct CschedUeConfigReqParameters ¶ms)=0
uint8_t m_transmissionMode
void DoReceivePhyPdu(Ptr< Packet > p)
virtual void ReconfigureLc(LcInfo lcinfo)
uint16_t GetRnti(void) const
void DoUlInfoListElementHarqFeeback(UlInfoListElement_s params)
LteEnbCmacSapProvider * m_cmacSapProvider
std::map< uint16_t, std::map< uint8_t, LteMacSapUser * > > m_rlcAttached
enum ns3::UlCqi_s::Type_e m_type
void DoAddLc(LteEnbCmacSapProvider::LcInfo lcinfo, LteMacSapUser *msu)
LteEnbCmacSapProvider::RachConfig DoGetRachConfig()
virtual void SchedDlConfigInd(const struct SchedDlConfigIndParameters ¶ms)
void DoCschedCellConfigUpdateInd(FfMacCschedSapUser::CschedCellConfigUpdateIndParameters params)
void DoReleaseLc(uint16_t rnti, uint8_t lcid)
void SetLteEnbCmacSapUser(LteEnbCmacSapUser *s)
Set the control MAC SAP user.
void AddPacketTag(const Tag &tag) const
void DoSchedUlConfigInd(FfMacSchedSapUser::SchedUlConfigIndParameters params)
uint8_t raResponseWindowSize
std::vector< struct LogicalChannelConfigListElement_s > m_logicalChannelConfigList
#define NS_ASSERT(condition)
virtual void SchedUlTriggerReq(const struct SchedUlTriggerReqParameters ¶ms)=0
virtual void ReceiveRachPreamble(uint32_t prachId)
uint8_t m_preambleTransMax
uint8_t m_transmissionMode
virtual uint8_t GetMacChTtiDelay()=0
Get the delay from MAC to Channel expressed in TTIs.
std::vector< struct UlDciListElement_s > m_dciList
See section 4.3.24 cqiListElement.
TracedCallback< uint32_t, uint32_t, uint16_t, uint8_t, uint16_t > m_ulScheduling
virtual void AddLc(LcInfo lcinfo, LteMacSapUser *msu)
void DoTransmitPdu(LteMacSapProvider::TransmitPduParameters)
friend class EnbMacMemberFfMacCschedSapUser
uint32_t m_rlcRetransmissionQueueSize
virtual void SchedDlTriggerReq(const struct SchedDlTriggerReqParameters ¶ms)=0
uint8_t m_transmissionMode
See section 4.3.12 ulInfoListElement.
void DoAddUe(uint16_t rnti)
virtual void SchedDlRlcBufferReq(const struct SchedDlRlcBufferReqParameters ¶ms)=0
uint8_t m_logicalChannelIdentity
virtual void ConfigureMac(uint8_t ulBandwidth, uint8_t dlBandwidth)
FfMacCschedSapUser * GetFfMacCschedSapUser(void)
Get the control scheduler SAP user.
uint64_t m_eRabGuaranteedBitrateDl
#define NS_FATAL_ERROR(msg)
fatal error handling
virtual AllocateNcRaPreambleReturnValue AllocateNcRaPreamble(uint16_t rnti)
LteMacSapProvider * GetLteMacSapProvider(void)
Get the MAC SAP provider.
std::map< uint8_t, uint32_t > m_receivedRachPreambleCount
FfMacCschedSapUser * m_cschedSapUser
See section 4.3.4 logicalChannelConfigListElement.
void SetFfMacCschedSapProvider(FfMacCschedSapProvider *s)
Set the control scheduler SAP provider.
LteEnbPhySapProvider * m_enbPhySapProvider
enum ns3::LogicalChannelConfigListElement_s::Direction_e m_direction
virtual void CschedLcConfigCnf(const struct CschedLcConfigCnfParameters ¶ms)
LteEnbPhySapUser * m_enbPhySapUser
FfMacSchedSapUser * GetFfMacSchedSapUser(void)
Get the scheduler SAP user.
make Callback use a separate empty type
void DoCschedUeConfigCnf(FfMacCschedSapUser::CschedUeConfigCnfParameters params)
virtual void RrcConfigurationUpdateInd(UeConfig params)=0
virtual void SendMacPdu(Ptr< Packet > p)=0
Send the MAC PDU to the channel.
virtual void CschedLcReleaseCnf(const struct CschedLcReleaseCnfParameters ¶ms)
void DoUeUpdateConfigurationReq(LteEnbCmacSapProvider::UeConfig params)
Hold an unsigned integer type.
EnbMacMemberLteEnbCmacSapProvider(LteEnbMac *mac)
std::map< uint8_t, uint32_t > m_rapIdRntiMap
NS_OBJECT_ENSURE_REGISTERED(AntennaModel)
uint16_t rnti
rnti previously allocated for this non-contention based RA procedure
void DoCschedLcReleaseCnf(FfMacCschedSapUser::CschedLcReleaseCnfParameters params)
static TypeId GetTypeId(void)
void DoUlCqiReport(FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi)
virtual void UlInfoListElementHarqFeeback(UlInfoListElement_s params)
virtual void SchedDlRachInfoReq(const struct SchedDlRachInfoReqParameters ¶ms)=0
virtual void AddUe(uint16_t rnti)
uint64_t m_eRabGuaranteedBitrateUl
friend class EnbMacMemberLteEnbCmacSapProvider
NS_LOG_COMPONENT_DEFINE("LteEnbMac")
virtual void DoDispose(void)
enum ns3::LogicalChannelConfigListElement_s::QosBearerType_e m_qosBearerType
void ReceiveBsrMessage(MacCeListElement_s bsr)
Receive a CE element containing the buffer status report.
virtual RachConfig GetRachConfig()
virtual void SchedUlConfigInd(const struct SchedUlConfigIndParameters ¶ms)
#define NS_LOG_LOGIC(msg)
uint16_t m_rlcRetransmissionHolDelay
std::vector< struct CqiListElement_s > m_cqiList
uint8_t m_raResponseWindowSize
std::vector< struct DlInfoListElement_s > m_dlInfoList
See section 4.3.23 dlInfoListElement.
virtual void CschedCellConfigReq(const struct CschedCellConfigReqParameters ¶ms)=0
CSCHED_CELL_CONFIG_REQ.
BuildRarListElement_s rarPayload
void DoReceiveRachPreamble(uint8_t prachId)
void DoRemoveUe(uint16_t rnti)
See section 4.3.14 macCEListElement.
Parameters for [re]configuring the UE.
Ptr< Packet > Copy(void) const
virtual void ReleaseLc(uint16_t rnti, uint8_t lcid)
uint64_t m_eRabMaximulBitrateUl
LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue DoAllocateNcRaPreamble(uint16_t rnti)
uint8_t m_numberOfRaPreambles
uint8_t numberOfRaPreambles
virtual void CschedUeConfigCnf(const struct CschedUeConfigCnfParameters ¶ms)
virtual void CschedUeReleaseReq(const struct CschedUeReleaseReqParameters ¶ms)=0
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
uint64_t m_eRabMaximulBitrateDl
void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters)
virtual void CschedUeReleaseCnf(const struct CschedUeReleaseCnfParameters ¶ms)
std::vector< enum HarqStatus_e > m_harqStatus
virtual void CschedCellConfigUpdateInd(const struct CschedCellConfigUpdateIndParameters ¶ms)
LteEnbCmacSapProvider * GetLteEnbCmacSapProvider(void)
Get the control MAC SAP provider.
uint32_t m_rlcTransmissionQueueSize
Parameters for [re]configuring the UE.
std::vector< UlInfoListElement_s > m_ulInfoListReceived
EnbMacMemberLteEnbPhySapUser(LteEnbMac *mac)
See section 4.3.6 rachListElement.
LteMacSapProvider * m_macSapProvider
std::vector< CqiListElement_s > m_dlCqiReceived
virtual void CschedCellConfigCnf(const struct CschedCellConfigCnfParameters ¶ms)
virtual void UeUpdateConfigurationReq(UeConfig params)
#define NS_ASSERT_MSG(condition, message)
virtual void SchedUlCqiInfoReq(const struct SchedUlCqiInfoReqParameters ¶ms)=0
std::vector< MacCeListElement_s > m_ulCeReceived
std::vector< struct MacCeListElement_s > m_macCeList
virtual void SchedUlMacCtrlInfoReq(const struct SchedUlMacCtrlInfoReqParameters ¶ms)=0
std::vector< std::vector< Ptr< PacketBurst > > > DlHarqProcessesBuffer_t
void DoCschedUeReleaseCnf(FfMacCschedSapUser::CschedUeReleaseCnfParameters params)
std::vector< struct RachListElement_s > m_rachList
std::vector< DlInfoListElement_s > m_dlInfoListReceived
void SetLteEnbPhySapProvider(LteEnbPhySapProvider *s)
Set the PHY SAP Provider.
LteEnbCmacSapUser * m_cmacSapUser
virtual void SubframeIndication(uint32_t frameNo, uint32_t subframeNo)
Trigger the start from a new frame (input from Phy layer)
LteEnbPhySapUser * GetLteEnbPhySapUser()
Get the eNB-PHY SAP User.
uint8_t m_transmissionMode
FfMacSchedSapProvider * m_schedSapProvider
bool RemovePacketTag(Tag &tag)
#define NS_LOG_DEBUG(msg)
virtual void ReceivePhyPdu(Ptr< Packet > p)
void DoCschedUeConfigUpdateInd(FfMacCschedSapUser::CschedUeConfigUpdateIndParameters params)
LteMacSapUser * m_macSapUser
void DoSchedDlConfigInd(FfMacSchedSapUser::SchedDlConfigIndParameters ind)
uint16_t retxQueueHolDelay
virtual void CschedLcConfigReq(const struct CschedLcConfigReqParameters ¶ms)=0
bool valid
true if a valid RA config was allocated, false otherwise
uint16_t m_rlcStatusPduSize
void SetLteMacSapUser(LteMacSapUser *s)
Set the MAC SAP user.
virtual void SendLteControlMessage(Ptr< LteControlMessage > msg)=0
Send SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel.
virtual void ReceiveLteControlMessage(Ptr< LteControlMessage > msg)
Receive SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel.
#define NS_LOG_ERROR(msg)
void DoCschedLcConfigCnf(FfMacCschedSapUser::CschedLcConfigCnfParameters params)
virtual void SchedDlCqiInfoReq(const struct SchedDlCqiInfoReqParameters ¶ms)=0
void DoReceiveLteControlMessage(Ptr< LteControlMessage > msg)
a base class which provides memory management and object aggregation
uint16_t m_rlcTransmissionQueueHolDelay
virtual void CschedUeConfigUpdateInd(const struct CschedUeConfigUpdateIndParameters ¶ms)
friend class EnbMacMemberLteEnbPhySapUser
std::map< uint8_t, NcRaPreambleInfo > m_allocatedNcRaPreambleMap
friend class EnbMacMemberFfMacSchedSapUser
uint8_t raPreambleId
random access preamble id
TracedCallback< uint32_t, uint32_t, uint16_t, uint8_t, uint16_t, uint8_t, uint16_t > m_dlScheduling
virtual void DlInfoListElementHarqFeeback(DlInfoListElement_s params)
std::vector< struct BuildRarListElement_s > m_buildRarList
std::map< uint16_t, DlHarqProcessesBuffer_t > m_miDlHarqProcessesPackets
a unique identifier for an interface.
void DoSubframeIndication(uint32_t frameNo, uint32_t subframeNo)
EnbMacMemberFfMacSchedSapUser(LteEnbMac *mac)
uint8_t GetLayer(void) const
TypeId SetParent(TypeId tid)
virtual uint16_t AllocateTemporaryCellRnti()=0
void SetFfMacSchedSapProvider(FfMacSchedSapProvider *s)
Set the scheduler SAP provider.
virtual void RemoveUe(uint16_t rnti)
FfMacCschedSapProvider * m_cschedSapProvider
std::vector< struct BuildDataListElement_s > m_buildDataList
#define UL_PUSCH_TTIS_DELAY
Time expiryTime
value the expiration time of this allocation (so that stale preambles can be reused) ...
void ReceiveDlCqiLteControlMessage(Ptr< DlCqiLteControlMessage > msg)
Receive a DL CQI ideal control message.
void DoCschedCellConfigCnf(FfMacCschedSapUser::CschedCellConfigCnfParameters params)
uint8_t m_logicalChannelGroup