24 #include <ns3/pointer.h>
25 #include <ns3/packet.h>
26 #include <ns3/simulator.h>
29 #include "lte-control-messages.h"
30 #include "lte-enb-net-device.h"
31 #include "lte-ue-net-device.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>
46 NS_OBJECT_ENSURE_REGISTERED (LteEnbMac);
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);
77 EnbMacMemberLteEnbCmacSapProvider::EnbMacMemberLteEnbCmacSapProvider (
LteEnbMac* mac)
85 m_mac->DoConfigureMac (ulBandwidth, dlBandwidth);
89 EnbMacMemberLteEnbCmacSapProvider::AddUe (uint16_t rnti)
91 m_mac->DoAddUe (rnti);
97 m_mac->DoRemoveUe (rnti);
103 m_mac->DoAddLc (lcinfo, msu);
109 m_mac->DoReconfigureLc (lcinfo);
115 m_mac->DoReleaseLc (rnti, lcid);
121 m_mac->DoUeUpdateConfigurationReq (params);
127 return m_mac->DoGetRachConfig ();
133 return m_mac->DoAllocateNcRaPreamble (rnti);
150 EnbMacMemberFfMacSchedSapUser::EnbMacMemberFfMacSchedSapUser (
LteEnbMac* mac)
157 EnbMacMemberFfMacSchedSapUser::SchedDlConfigInd (
const struct SchedDlConfigIndParameters& params)
159 m_mac->DoSchedDlConfigInd (params);
165 EnbMacMemberFfMacSchedSapUser::SchedUlConfigInd (
const struct SchedUlConfigIndParameters& params)
167 m_mac->DoSchedUlConfigInd (params);
190 EnbMacMemberFfMacCschedSapUser::EnbMacMemberFfMacCschedSapUser (
LteEnbMac* mac)
196 EnbMacMemberFfMacCschedSapUser::CschedCellConfigCnf (
const struct CschedCellConfigCnfParameters& params)
198 m_mac->DoCschedCellConfigCnf (params);
202 EnbMacMemberFfMacCschedSapUser::CschedUeConfigCnf (
const struct CschedUeConfigCnfParameters& params)
204 m_mac->DoCschedUeConfigCnf (params);
208 EnbMacMemberFfMacCschedSapUser::CschedLcConfigCnf (
const struct CschedLcConfigCnfParameters& params)
210 m_mac->DoCschedLcConfigCnf (params);
214 EnbMacMemberFfMacCschedSapUser::CschedLcReleaseCnf (
const struct CschedLcReleaseCnfParameters& params)
216 m_mac->DoCschedLcReleaseCnf (params);
220 EnbMacMemberFfMacCschedSapUser::CschedUeReleaseCnf (
const struct CschedUeReleaseCnfParameters& params)
222 m_mac->DoCschedUeReleaseCnf (params);
226 EnbMacMemberFfMacCschedSapUser::CschedUeConfigUpdateInd (
const struct CschedUeConfigUpdateIndParameters& params)
228 m_mac->DoCschedUeConfigUpdateInd (params);
232 EnbMacMemberFfMacCschedSapUser::CschedCellConfigUpdateInd (
const struct CschedCellConfigUpdateIndParameters& params)
234 m_mac->DoCschedCellConfigUpdateInd (params);
260 EnbMacMemberLteEnbPhySapUser::EnbMacMemberLteEnbPhySapUser (
LteEnbMac* mac) : m_mac (mac)
268 m_mac->DoReceivePhyPdu (p);
274 m_mac->DoSubframeIndication (frameNo, subframeNo);
280 m_mac->DoReceiveLteControlMessage (msg);
286 m_mac->DoReceiveRachPreamble (prachId);
292 m_mac->DoUlCqiReport (ulcqi);
298 m_mac->DoUlInfoListElementHarqFeeback (params);
304 m_mac->DoDlInfoListElementHarqFeeback (params);
314 LteEnbMac::GetTypeId (
void)
318 .AddConstructor<LteEnbMac> ()
319 .AddAttribute (
"NumberOfRaPreambles",
320 "how many random access preambles are available for the contention based RACH process",
322 MakeUintegerAccessor (&LteEnbMac::m_numberOfRaPreambles),
323 MakeUintegerChecker<uint8_t> (4, 64))
324 .AddAttribute (
"PreambleTransMax",
325 "Maximum number of random access preamble transmissions",
327 MakeUintegerAccessor (&LteEnbMac::m_preambleTransMax),
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",
332 MakeUintegerAccessor (&LteEnbMac::m_raResponseWindowSize),
333 MakeUintegerChecker<uint8_t> (2, 10))
334 .AddTraceSource (
"DlScheduling",
335 "Information regarding DL scheduling.",
337 .AddTraceSource (
"UlScheduling",
338 "Information regarding UL scheduling.",
346 LteEnbMac::LteEnbMac ()
349 m_macSapProvider =
new EnbMacMemberLteMacSapProvider<LteEnbMac> (
this);
350 m_cmacSapProvider =
new EnbMacMemberLteEnbCmacSapProvider (
this);
351 m_schedSapUser =
new EnbMacMemberFfMacSchedSapUser (
this);
352 m_cschedSapUser =
new EnbMacMemberFfMacCschedSapUser (
this);
353 m_enbPhySapUser =
new EnbMacMemberLteEnbPhySapUser (
this);
357 LteEnbMac::~LteEnbMac ()
366 m_dlCqiReceived.clear ();
367 m_ulCqiReceived.clear ();
368 m_ulCeReceived.clear ();
369 m_dlInfoListReceived.clear ();
370 m_ulInfoListReceived.clear ();
371 m_miDlHarqProcessesPackets.clear ();
372 delete m_macSapProvider;
373 delete m_cmacSapProvider;
374 delete m_schedSapUser;
375 delete m_cschedSapUser;
376 delete m_enbPhySapUser;
383 m_schedSapProvider = s;
389 return m_schedSapUser;
395 m_cschedSapProvider = s;
401 return m_cschedSapUser;
415 return m_macSapProvider;
427 return m_cmacSapProvider;
433 m_enbPhySapProvider = s;
440 return m_enbPhySapUser;
446 LteEnbMac::DoSubframeIndication (uint32_t frameNo, uint32_t subframeNo)
448 NS_LOG_FUNCTION (
this <<
" EnbMac - frame " << frameNo <<
" subframe " << subframeNo);
452 m_subframeNo = subframeNo;
457 if (m_dlCqiReceived.size () > 0)
460 dlcqiInfoReq.m_sfnSf = ((0x3FF & frameNo) << 4) | (0xF & subframeNo);
462 int cqiNum = m_dlCqiReceived.size ();
463 if (cqiNum > MAX_CQI_LIST)
465 cqiNum = MAX_CQI_LIST;
467 dlcqiInfoReq.m_cqiList.insert (dlcqiInfoReq.m_cqiList.begin (), m_dlCqiReceived.begin (), m_dlCqiReceived.end ());
468 m_dlCqiReceived.erase (m_dlCqiReceived.begin (), m_dlCqiReceived.end ());
469 m_schedSapProvider->SchedDlCqiInfoReq (dlcqiInfoReq);
472 if (!m_receivedRachPreambleCount.empty ())
475 FfMacSchedSapProvider::SchedDlRachInfoReqParameters rachInfoReqParams;
476 NS_ASSERT (subframeNo > 0 && subframeNo <= 10);
477 for (std::map<uint8_t, uint32_t>::const_iterator it = m_receivedRachPreambleCount.begin ();
478 it != m_receivedRachPreambleCount.end ();
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");
505 RachListElement_s rachLe;
506 rachLe.m_rnti = rnti;
507 rachLe.m_estimatedSize = 144;
508 rachInfoReqParams.m_rachList.push_back (rachLe);
509 m_rapIdRntiMap.insert (std::pair <uint16_t, uint32_t> (rnti, it->first));
512 m_schedSapProvider->SchedDlRachInfoReq (rachInfoReqParams);
513 m_receivedRachPreambleCount.clear ();
516 uint32_t dlSchedFrameNo = m_frameNo;
517 uint32_t dlSchedSubframeNo = m_subframeNo;
519 if (dlSchedSubframeNo + m_macChTtiDelay > 10)
522 dlSchedSubframeNo = (dlSchedSubframeNo + m_macChTtiDelay) % 10;
526 dlSchedSubframeNo = dlSchedSubframeNo + m_macChTtiDelay;
528 FfMacSchedSapProvider::SchedDlTriggerReqParameters dlparams;
529 dlparams.m_sfnSf = ((0x3FF & dlSchedFrameNo) << 4) | (0xF & dlSchedSubframeNo);
532 if (m_dlInfoListReceived.size () > 0)
534 dlparams.m_dlInfoList = m_dlInfoListReceived;
536 m_dlInfoListReceived.clear ();
539 m_schedSapProvider->SchedDlTriggerReq (dlparams);
544 std::vector <FfMacSchedSapProvider::SchedUlCqiInfoReqParameters>::iterator itCqi;
545 for (uint16_t i = 0; i < m_ulCqiReceived.size (); i++)
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);
555 m_schedSapProvider->SchedUlCqiInfoReq (m_ulCqiReceived.at (i));
557 m_ulCqiReceived.clear ();
560 if (m_ulCeReceived.size () > 0)
562 FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters ulMacReq;
563 ulMacReq.m_sfnSf = ((0x3FF & frameNo) << 4) | (0xF & subframeNo);
564 ulMacReq.m_macCeList.insert (ulMacReq.m_macCeList.begin (), m_ulCeReceived.begin (), m_ulCeReceived.end ());
565 m_ulCeReceived.erase (m_ulCeReceived.begin (), m_ulCeReceived.end ());
566 m_schedSapProvider->SchedUlMacCtrlInfoReq (ulMacReq);
571 uint32_t ulSchedFrameNo = m_frameNo;
572 uint32_t ulSchedSubframeNo = m_subframeNo;
574 if (ulSchedSubframeNo + (m_macChTtiDelay+UL_PUSCH_TTIS_DELAY) > 10)
577 ulSchedSubframeNo = (ulSchedSubframeNo + (m_macChTtiDelay+UL_PUSCH_TTIS_DELAY)) % 10;
581 ulSchedSubframeNo = ulSchedSubframeNo + (m_macChTtiDelay+UL_PUSCH_TTIS_DELAY);
583 FfMacSchedSapProvider::SchedUlTriggerReqParameters ulparams;
584 ulparams.m_sfnSf = ((0x3FF & ulSchedFrameNo) << 4) | (0xF & ulSchedSubframeNo);
587 if (m_ulInfoListReceived.size () > 0)
589 ulparams.m_ulInfoList = m_ulInfoListReceived;
591 m_ulInfoListReceived.clear ();
594 m_schedSapProvider->SchedUlTriggerReq (ulparams);
600 LteEnbMac::DoReceiveLteControlMessage (Ptr<LteControlMessage> msg)
603 if (msg->GetMessageType () == LteControlMessage::DL_CQI)
605 Ptr<DlCqiLteControlMessage> dlcqi = DynamicCast<DlCqiLteControlMessage> (msg);
608 else if (msg->GetMessageType () == LteControlMessage::BSR)
610 Ptr<BsrLteControlMessage> bsr = DynamicCast<BsrLteControlMessage> (msg);
613 else if (msg->GetMessageType () == LteControlMessage::DL_HARQ)
615 Ptr<DlHarqFeedbackLteControlMessage> dlharq = DynamicCast<DlHarqFeedbackLteControlMessage> (msg);
616 DoDlInfoListElementHarqFeeback (dlharq->GetDlHarqFeedback ());
620 NS_LOG_LOGIC (
this <<
" LteControlMessage type " << msg->GetMessageType () <<
" not recognized");
625 LteEnbMac::DoReceiveRachPreamble (uint8_t rapId)
629 ++m_receivedRachPreambleCount[rapId];
633 LteEnbMac::DoUlCqiReport (FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi)
635 if (ulcqi.m_ulCqi.m_type == UlCqi_s::PUSCH)
639 m_ulCqiReceived.push_back (ulcqi);
649 NS_LOG_LOGIC (
this <<
"Enb Received DL-CQI rnti" << dlcqi.m_rnti);
651 m_dlCqiReceived.push_back (dlcqi);
661 m_ulCeReceived.push_back (bsr);
705 uint16_t rnti = tag.GetRnti ();
706 uint8_t lcid = tag.GetLcid ();
707 std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt = m_rlcAttached.find (rnti);
708 NS_ASSERT_MSG (rntiIt != m_rlcAttached.end (),
"could not find RNTI" << rnti);
709 std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcid);
710 NS_ASSERT_MSG (lcidIt != rntiIt->second.end (),
"could not find LCID" << lcid);
711 (*lcidIt).second->ReceivePdu (p);
722 LteEnbMac::DoConfigureMac (uint8_t ulBandwidth, uint8_t dlBandwidth)
724 NS_LOG_FUNCTION (
this <<
" ulBandwidth=" << (uint16_t) ulBandwidth <<
" dlBandwidth=" << (uint16_t) dlBandwidth);
725 FfMacCschedSapProvider::CschedCellConfigReqParameters params;
727 params.m_ulBandwidth = ulBandwidth;
728 params.m_dlBandwidth = dlBandwidth;
736 LteEnbMac::DoAddUe (uint16_t rnti)
739 std::map<uint8_t, LteMacSapUser*> empty;
740 std::pair <std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator,
bool>
741 ret = m_rlcAttached.insert (std::pair <uint16_t, std::map<uint8_t, LteMacSapUser*> >
743 NS_ASSERT_MSG (ret.second,
"element already present, RNTI already existed");
745 FfMacCschedSapProvider::CschedUeConfigReqParameters params;
746 params.m_rnti = rnti;
747 params.m_transmissionMode = 0;
749 m_cschedSapProvider->CschedUeConfigReq (params);
752 std::vector < Ptr<PacketBurst> > dlHarqLayer0pkt;
753 dlHarqLayer0pkt.resize (8);
754 for (uint8_t i = 0; i < 8; i++)
756 Ptr<PacketBurst> pb = CreateObject <PacketBurst> ();
757 dlHarqLayer0pkt.at (i) = pb;
759 std::vector < Ptr<PacketBurst> > dlHarqLayer1pkt;
760 dlHarqLayer1pkt.resize (8);
761 for (uint8_t i = 0; i < 8; i++)
763 Ptr<PacketBurst> pb = CreateObject <PacketBurst> ();
764 dlHarqLayer1pkt.at (i) = pb;
766 DlHarqProcessesBuffer_t buf;
767 buf.push_back (dlHarqLayer0pkt);
768 buf.push_back (dlHarqLayer1pkt);
769 m_miDlHarqProcessesPackets.insert (std::pair <uint16_t, DlHarqProcessesBuffer_t> (rnti, buf));
773 LteEnbMac::DoRemoveUe (uint16_t rnti)
776 FfMacCschedSapProvider::CschedUeReleaseReqParameters params;
777 params.m_rnti = rnti;
778 m_cschedSapProvider->CschedUeReleaseReq (params);
779 m_rlcAttached.erase (rnti);
780 m_miDlHarqProcessesPackets.erase (rnti);
784 LteEnbMac::DoAddLc (LteEnbCmacSapProvider::LcInfo lcinfo, LteMacSapUser* msu)
788 std::map <LteFlowId_t, LteMacSapUser* >::iterator it;
790 LteFlowId_t flow (lcinfo.rnti, lcinfo.lcId);
792 std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt = m_rlcAttached.find (lcinfo.rnti);
793 NS_ASSERT_MSG (rntiIt != m_rlcAttached.end (),
"RNTI not found");
794 std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcinfo.lcId);
795 if (lcidIt == rntiIt->second.end ())
797 rntiIt->second.insert (std::pair<uint8_t, LteMacSapUser*> (lcinfo.lcId, msu));
808 if (lcinfo.lcId != 0)
810 struct FfMacCschedSapProvider::CschedLcConfigReqParameters params;
811 params.m_rnti = lcinfo.rnti;
812 params.m_reconfigureFlag =
false;
814 struct LogicalChannelConfigListElement_s lccle;
815 lccle.m_logicalChannelIdentity = lcinfo.lcId;
816 lccle.m_logicalChannelGroup = lcinfo.lcGroup;
817 lccle.m_direction = LogicalChannelConfigListElement_s::DIR_BOTH;
818 lccle.m_qosBearerType = lcinfo.isGbr ? LogicalChannelConfigListElement_s::QBT_GBR : LogicalChannelConfigListElement_s::QBT_NON_GBR;
819 lccle.m_qci = lcinfo.qci;
820 lccle.m_eRabMaximulBitrateUl = lcinfo.mbrUl;
821 lccle.m_eRabMaximulBitrateDl = lcinfo.mbrDl;
822 lccle.m_eRabGuaranteedBitrateUl = lcinfo.gbrUl;
823 lccle.m_eRabGuaranteedBitrateDl = lcinfo.gbrDl;
824 params.m_logicalChannelConfigList.push_back (lccle);
826 m_cschedSapProvider->CschedLcConfigReq (params);
831 LteEnbMac::DoReconfigureLc (LteEnbCmacSapProvider::LcInfo lcinfo)
837 LteEnbMac::DoReleaseLc (uint16_t rnti, uint8_t lcid)
843 LteEnbMac::DoUeUpdateConfigurationReq (LteEnbCmacSapProvider::UeConfig params)
848 FfMacCschedSapProvider::CschedUeConfigReqParameters req;
849 req.m_rnti = params.m_rnti;
850 req.m_transmissionMode = params.m_transmissionMode;
851 req.m_reconfigureFlag =
true;
852 m_cschedSapProvider->CschedUeConfigReq (req);
855 LteEnbCmacSapProvider::RachConfig
856 LteEnbMac::DoGetRachConfig ()
858 struct LteEnbCmacSapProvider::RachConfig rc;
859 rc.numberOfRaPreambles = m_numberOfRaPreambles;
860 rc.preambleTransMax = m_preambleTransMax;
861 rc.raResponseWindowSize = m_raResponseWindowSize;
865 LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue
866 LteEnbMac::DoAllocateNcRaPreamble (uint16_t rnti)
870 for (preambleId = m_numberOfRaPreambles; preambleId < 64; ++preambleId)
877 NcRaPreambleInfo preambleInfo;
878 uint32_t expiryIntervalMs = (uint32_t) m_preambleTransMax * ((uint32_t) m_raResponseWindowSize + 5);
881 preambleInfo.rnti = rnti;
882 NS_LOG_INFO (
"allocated preamble for NC based RA: preamble " << preambleId <<
", RNTI " << preambleInfo.rnti <<
", exiryTime " << preambleInfo.expiryTime);
887 LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue ret;
891 ret.raPreambleId = preambleId;
892 ret.raPrachMaskIndex = 0;
897 ret.raPreambleId = 0;
898 ret.raPrachMaskIndex = 0;
911 LteEnbMac::DoTransmitPdu (LteMacSapProvider::TransmitPduParameters params)
914 LteRadioBearerTag tag (params.rnti, params.lcid, params.layer);
915 params.pdu->AddPacketTag (tag);
917 std::map <uint16_t, DlHarqProcessesBuffer_t>::iterator it = m_miDlHarqProcessesPackets.find (params.rnti);
918 NS_ASSERT (it!=m_miDlHarqProcessesPackets.end ());
919 NS_LOG_DEBUG (
this <<
" LAYER " <<(uint16_t)tag.GetLayer () <<
" HARQ ID " << (uint16_t)params.harqProcessId);
922 (*it).second.at (params.layer).at (params.harqProcessId)->AddPacket (params.pdu);
927 LteEnbMac::DoReportBufferStatus (LteMacSapProvider::ReportBufferStatusParameters params)
930 FfMacSchedSapProvider::SchedDlRlcBufferReqParameters req;
931 req.m_rnti = params.rnti;
932 req.m_logicalChannelIdentity = params.lcid;
933 req.m_rlcTransmissionQueueSize = params.txQueueSize;
934 req.m_rlcTransmissionQueueHolDelay = params.txQueueHolDelay;
935 req.m_rlcRetransmissionQueueSize = params.retxQueueSize;
936 req.m_rlcRetransmissionHolDelay = params.retxQueueHolDelay;
937 req.m_rlcStatusPduSize = params.statusPduSize;
938 m_schedSapProvider->SchedDlRlcBufferReq (req);
950 LteEnbMac::DoSchedDlConfigInd (FfMacSchedSapUser::SchedDlConfigIndParameters ind)
954 Ptr<PacketBurst> pb = CreateObject<PacketBurst> ();
955 std::map <LteFlowId_t, LteMacSapUser* >::iterator it;
957 for (
unsigned int i = 0; i < ind.m_buildDataList.size (); i++)
959 for (uint16_t layer = 0; layer < ind.m_buildDataList.at (i).m_dci.m_ndi.size (); layer++)
961 if (ind.m_buildDataList.at (i).m_dci.m_ndi.at (layer) == 1)
964 std::map <uint16_t, DlHarqProcessesBuffer_t>::iterator it = m_miDlHarqProcessesPackets.find (ind.m_buildDataList.at (i).m_rnti);
965 NS_ASSERT(it!=m_miDlHarqProcessesPackets.end());
966 for (uint16_t lcId = 0; lcId < (*it).second.size (); lcId ++)
968 Ptr<PacketBurst> pb = CreateObject <PacketBurst> ();
969 (*it).second.at (lcId).at (ind.m_buildDataList.at (i).m_dci.m_harqProcess) = pb;
973 for (
unsigned int j = 0; j < ind.m_buildDataList.at (i).m_rlcPduList.size (); j++)
975 for (uint16_t k = 0; k < ind.m_buildDataList.at (i).m_rlcPduList.at (j).size (); k++)
977 if (ind.m_buildDataList.at (i).m_dci.m_ndi.at (k) == 1)
980 uint16_t rnti = ind.m_buildDataList.at (i).m_rnti;
981 uint8_t lcid = ind.m_buildDataList.at (i).m_rlcPduList.at (j).at (k).m_logicalChannelIdentity;
982 std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt = m_rlcAttached.find (rnti);
983 NS_ASSERT_MSG (rntiIt != m_rlcAttached.end (),
"could not find RNTI" << rnti);
984 std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcid);
985 NS_ASSERT_MSG (lcidIt != rntiIt->second.end (),
"could not find LCID" << lcid);
986 NS_LOG_DEBUG (
this <<
" rnti= " << rnti <<
" lcid= " << (uint32_t) lcid <<
" layer= " << k);
987 (*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);
991 if (ind.m_buildDataList.at (i).m_dci.m_tbsSize.at (k)>0)
994 std::map <uint16_t, DlHarqProcessesBuffer_t>::iterator it = m_miDlHarqProcessesPackets.find (ind.m_buildDataList.at (i).m_rnti);
995 NS_ASSERT(it!=m_miDlHarqProcessesPackets.end());
996 Ptr<PacketBurst> pb = (*it).second.at (k).at ( ind.m_buildDataList.at (i).m_dci.m_harqProcess);
997 for (std::list<Ptr<Packet> >::const_iterator j = pb->Begin (); j != pb->End (); ++j)
999 Ptr<Packet> pkt = (*j)->Copy ();
1007 Ptr<DlDciLteControlMessage> msg = Create<DlDciLteControlMessage> ();
1008 msg->SetDci (ind.m_buildDataList.at (i).m_dci);
1013 for ( uint32_t i = 0; i < ind.m_buildDataList.size (); i++ )
1016 if (ind.m_buildDataList.at (i).m_dci.m_tbsSize.size () == 1)
1018 m_dlScheduling (m_frameNo, m_subframeNo, ind.m_buildDataList.at (i).m_dci.m_rnti,
1019 ind.m_buildDataList.at (i).m_dci.m_mcs.at (0),
1020 ind.m_buildDataList.at (i).m_dci.m_tbsSize.at (0),
1026 else if (ind.m_buildDataList.at (i).m_dci.m_tbsSize.size () == 2)
1028 m_dlScheduling (m_frameNo, m_subframeNo, ind.m_buildDataList.at (i).m_dci.m_rnti,
1029 ind.m_buildDataList.at (i).m_dci.m_mcs.at (0),
1030 ind.m_buildDataList.at (i).m_dci.m_tbsSize.at (0),
1031 ind.m_buildDataList.at (i).m_dci.m_mcs.at (1),
1032 ind.m_buildDataList.at (i).m_dci.m_tbsSize.at (1)
1037 NS_FATAL_ERROR (
"Found element with more than two transport blocks");
1042 Ptr<RarLteControlMessage> rarMsg = Create<RarLteControlMessage> ();
1046 if (m_subframeNo < 3)
1048 raRnti = m_subframeNo + 7;
1052 raRnti = m_subframeNo - 3;
1054 rarMsg->SetRaRnti (raRnti);
1055 for (
unsigned int i = 0; i < ind.m_buildRarList.size (); i++)
1057 std::map <uint8_t, uint32_t>::iterator itRapId = m_rapIdRntiMap.find (ind.m_buildRarList.at (i).m_rnti);
1058 if (itRapId == m_rapIdRntiMap.end ())
1060 NS_FATAL_ERROR (
"Unable to find rapId of RNTI " << ind.m_buildRarList.at (i).m_rnti);
1062 RarLteControlMessage::Rar rar;
1063 rar.rapId = itRapId->second;
1064 rar.rarPayload = ind.m_buildRarList.at (i);
1065 rarMsg->AddRar (rar);
1066 NS_LOG_INFO (
this <<
" Send RAR message to RNTI " << ind.m_buildRarList.at (i).m_rnti <<
" rapId " << itRapId->second);
1068 if (ind.m_buildRarList.size () > 0)
1072 m_rapIdRntiMap.clear ();
1077 LteEnbMac::DoSchedUlConfigInd (FfMacSchedSapUser::SchedUlConfigIndParameters ind)
1081 for (
unsigned int i = 0; i < ind.m_dciList.size (); i++)
1084 Ptr<UlDciLteControlMessage> msg = Create<UlDciLteControlMessage> ();
1085 msg->SetDci (ind.m_dciList.at (i));
1090 for ( uint32_t i = 0; i < ind.m_dciList.size (); i++ )
1092 m_ulScheduling (m_frameNo, m_subframeNo, ind.m_dciList.at (i).m_rnti,
1093 ind.m_dciList.at (i).m_mcs, ind.m_dciList.at (i).m_tbSize);
1109 LteEnbMac::DoCschedCellConfigCnf (FfMacCschedSapUser::CschedCellConfigCnfParameters params)
1115 LteEnbMac::DoCschedUeConfigCnf (FfMacCschedSapUser::CschedUeConfigCnfParameters params)
1121 LteEnbMac::DoCschedLcConfigCnf (FfMacCschedSapUser::CschedLcConfigCnfParameters params)
1129 LteEnbMac::DoCschedLcReleaseCnf (FfMacCschedSapUser::CschedLcReleaseCnfParameters params)
1135 LteEnbMac::DoCschedUeReleaseCnf (FfMacCschedSapUser::CschedUeReleaseCnfParameters params)
1141 LteEnbMac::DoCschedUeConfigUpdateInd (FfMacCschedSapUser::CschedUeConfigUpdateIndParameters params)
1145 LteEnbCmacSapUser::UeConfig ueConfigUpdate;
1146 ueConfigUpdate.m_rnti = params.m_rnti;
1147 ueConfigUpdate.m_transmissionMode = params.m_transmissionMode;
1152 LteEnbMac::DoCschedCellConfigUpdateInd (FfMacCschedSapUser::CschedCellConfigUpdateIndParameters params)
1158 LteEnbMac::DoUlInfoListElementHarqFeeback (UlInfoListElement_s params)
1161 m_ulInfoListReceived.push_back (params);
1165 LteEnbMac::DoDlInfoListElementHarqFeeback (DlInfoListElement_s params)
1169 std::map <uint16_t, DlHarqProcessesBuffer_t>::iterator it = m_miDlHarqProcessesPackets.find (params.m_rnti);
1170 NS_ASSERT (it!=m_miDlHarqProcessesPackets.end ());
1171 for (uint8_t layer = 0; layer < params.m_harqStatus.size (); layer++)
1173 if (params.m_harqStatus.at (layer)==DlInfoListElement_s::ACK)
1176 Ptr<PacketBurst> emptyBuf = CreateObject <PacketBurst> ();
1177 (*it).second.at (layer).at (params.m_harqProcessId) = emptyBuf;
1178 NS_LOG_DEBUG (
this <<
" HARQ-ACK UE " << params.m_rnti <<
" harqId " << (uint16_t)params.m_harqProcessId <<
" layer " << (uint16_t)layer);
1180 else if (params.m_harqStatus.at (layer)==DlInfoListElement_s::NACK)
1182 NS_LOG_DEBUG (
this <<
" HARQ-NACK UE " << params.m_rnti <<
" harqId " << (uint16_t)params.m_harqProcessId <<
" layer " << (uint16_t)layer);
1189 m_dlInfoListReceived.push_back (params);
virtual void UlCqiReport(FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi)
Returns to MAC level the UL-CQI evaluated.
#define NS_LOG_FUNCTION(parameters)
virtual void ReconfigureLc(LcInfo lcinfo)
void SetLteEnbCmacSapUser(LteEnbCmacSapUser *s)
Set the control MAC SAP user.
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
virtual void ReceiveRachPreamble(uint32_t prachId)
virtual uint8_t GetMacChTtiDelay()=0
Get the delay from MAC to Channel expressed in TTIs.
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)
See section 4.3.12 ulInfoListElement.
virtual void ConfigureMac(uint8_t ulBandwidth, uint8_t dlBandwidth)
FfMacCschedSapUser * GetFfMacCschedSapUser(void)
Get the control scheduler SAP user.
#define NS_FATAL_ERROR(msg)
fatal error handling
virtual AllocateNcRaPreambleReturnValue AllocateNcRaPreamble(uint16_t rnti)
LteMacSapProvider * GetLteMacSapProvider(void)
Get the MAC SAP provider.
void SetFfMacCschedSapProvider(FfMacCschedSapProvider *s)
Set the control scheduler SAP provider.
FfMacSchedSapUser * GetFfMacSchedSapUser(void)
Get the scheduler SAP user.
virtual void RrcConfigurationUpdateInd(UeConfig params)=0
virtual void SendMacPdu(Ptr< Packet > p)=0
Send the MAC PDU to the channel.
Hold an unsigned integer type.
virtual void UlInfoListElementHarqFeeback(UlInfoListElement_s params)
virtual void DoDispose(void)
void ReceiveBsrMessage(MacCeListElement_s bsr)
Receive a CE element containing the buffer status report.
virtual RachConfig GetRachConfig()
#define NS_LOG_LOGIC(msg)
See section 4.3.23 dlInfoListElement.
virtual void CschedCellConfigReq(const struct CschedCellConfigReqParameters ¶ms)=0
CSCHED_CELL_CONFIG_REQ.
See section 4.3.14 macCEListElement.
Parameters for [re]configuring the UE.
virtual void ReleaseLc(uint16_t rnti, uint8_t lcid)
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
LteEnbCmacSapProvider * GetLteEnbCmacSapProvider(void)
Get the control MAC SAP provider.
virtual void UeUpdateConfigurationReq(UeConfig params)
#define NS_ASSERT_MSG(condition, message)
void SetLteEnbPhySapProvider(LteEnbPhySapProvider *s)
Set the PHY SAP Provider.
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.
bool RemovePacketTag(Tag &tag)
#define NS_LOG_DEBUG(msg)
virtual void ReceivePhyPdu(Ptr< Packet > p)
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.
Time MilliSeconds(uint64_t ms)
create ns3::Time instances in units of milliseconds.
virtual void ReceiveLteControlMessage(Ptr< LteControlMessage > msg)
Receive SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel.
#define NS_LOG_ERROR(msg)
a base class which provides memory management and object aggregation
std::map< uint8_t, NcRaPreambleInfo > m_allocatedNcRaPreambleMap
TracedCallback< uint32_t, uint32_t, uint16_t, uint8_t, uint16_t, uint8_t, uint16_t > m_dlScheduling
virtual void DlInfoListElementHarqFeeback(DlInfoListElement_s params)
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
virtual uint16_t AllocateTemporaryCellRnti()=0
void SetFfMacSchedSapProvider(FfMacSchedSapProvider *s)
Set the scheduler SAP provider.
virtual void RemoveUe(uint16_t rnti)
void ReceiveDlCqiLteControlMessage(Ptr< DlCqiLteControlMessage > msg)
Receive a DL CQI ideal control message.