5#define NS_LOG_APPEND_CONTEXT \
8 std::clog << " [ CellId " << GetCellId() << ", bwpId " << GetBwpId() << "] "; \
11#include "nr-gnb-mac.h"
15#include "nr-control-messages.h"
16#include "nr-mac-header-fs-ul.h"
17#include "nr-mac-header-vs.h"
18#include "nr-mac-pdu-info.h"
19#include "nr-mac-sched-sap.h"
20#include "nr-mac-scheduler.h"
21#include "nr-mac-short-bsr-ce.h"
22#include "nr-phy-mac-common.h"
23#include "nr-radio-bearer-tag.h"
26#include "ns3/spectrum-model.h"
27#include "ns3/uinteger.h"
33NS_LOG_COMPONENT_DEFINE(
"NrGnbMac");
35NS_OBJECT_ENSURE_REGISTERED(NrGnbMac);
41class NrGnbMacMemberGnbCmacSapProvider :
public NrGnbCmacSapProvider
44 NrGnbMacMemberGnbCmacSapProvider(NrGnbMac* mac);
47 void ConfigureMac(uint16_t ulBandwidth, uint16_t dlBandwidth)
override;
48 void AddUe(uint16_t rnti)
override;
49 void RemoveUe(uint16_t rnti)
override;
50 void AddLc(LcInfo lcinfo, NrMacSapUser* msu)
override;
51 void ReconfigureLc(LcInfo lcinfo)
override;
52 void ReleaseLc(uint16_t rnti, uint8_t lcid)
override;
53 void UeUpdateConfigurationReq(UeConfig params)
override;
54 RachConfig GetRachConfig()
override;
55 AllocateNcRaPreambleReturnValue AllocateNcRaPreamble(uint16_t rnti)
override;
61NrGnbMacMemberGnbCmacSapProvider::NrGnbMacMemberGnbCmacSapProvider(NrGnbMac* mac)
67NrGnbMacMemberGnbCmacSapProvider::ConfigureMac(uint16_t ulBandwidth, uint16_t dlBandwidth)
69 m_mac->DoConfigureMac(ulBandwidth, dlBandwidth);
73NrGnbMacMemberGnbCmacSapProvider::AddUe(uint16_t rnti)
79NrGnbMacMemberGnbCmacSapProvider::RemoveUe(uint16_t rnti)
81 m_mac->DoRemoveUe(rnti);
85NrGnbMacMemberGnbCmacSapProvider::AddLc(LcInfo lcinfo, NrMacSapUser* msu)
87 m_mac->DoAddLc(lcinfo, msu);
91NrGnbMacMemberGnbCmacSapProvider::ReconfigureLc(LcInfo lcinfo)
93 m_mac->DoReconfigureLc(lcinfo);
97NrGnbMacMemberGnbCmacSapProvider::ReleaseLc(uint16_t rnti, uint8_t lcid)
99 m_mac->DoReleaseLc(rnti, lcid);
103NrGnbMacMemberGnbCmacSapProvider::UeUpdateConfigurationReq(UeConfig params)
105 m_mac->UeUpdateConfigurationReq(params);
108NrGnbCmacSapProvider::RachConfig
109NrGnbMacMemberGnbCmacSapProvider::GetRachConfig()
111 return m_mac->DoGetRachConfig();
114NrGnbCmacSapProvider::AllocateNcRaPreambleReturnValue
115NrGnbMacMemberGnbCmacSapProvider::AllocateNcRaPreamble(uint16_t rnti)
117 return m_mac->DoAllocateNcRaPreamble(rnti);
123class NrMacGnbMemberPhySapUser :
public NrGnbPhySapUser
126 NrMacGnbMemberPhySapUser(NrGnbMac* mac);
128 void ReceivePhyPdu(Ptr<Packet> p)
override;
130 void ReceiveControlMessage(Ptr<NrControlMessage> msg)
override;
132 void SlotDlIndication(
const SfnSf&, LteNrTddSlotType)
override;
134 void SlotUlIndication(
const SfnSf&, LteNrTddSlotType)
override;
136 void SetCurrentSfn(
const SfnSf&)
override;
138 void UlCqiReport(NrMacSchedSapProvider::SchedUlCqiInfoReqParameters cqi)
override;
140 void ReceiveRachPreamble(uint32_t raId)
override;
142 void UlHarqFeedback(UlHarqInfo params)
override;
144 void BeamChangeReport(BeamId beamId, uint8_t rnti)
override;
146 uint32_t GetNumRbPerRbg()
const override;
148 std::shared_ptr<DciInfoElementTdma> GetDlCtrlDci()
const override;
149 std::shared_ptr<DciInfoElementTdma> GetUlCtrlDci()
const override;
151 uint8_t GetDlCtrlSymbols()
const override;
157NrMacGnbMemberPhySapUser::NrMacGnbMemberPhySapUser(NrGnbMac* mac)
163NrMacGnbMemberPhySapUser::ReceivePhyPdu(Ptr<Packet> p)
165 m_mac->DoReceivePhyPdu(p);
169NrMacGnbMemberPhySapUser::ReceiveControlMessage(Ptr<NrControlMessage> msg)
171 m_mac->DoReceiveControlMessage(msg);
175NrMacGnbMemberPhySapUser::SlotDlIndication(
const SfnSf& sfn, LteNrTddSlotType type)
177 m_mac->DoSlotDlIndication(sfn, type);
181NrMacGnbMemberPhySapUser::SlotUlIndication(
const SfnSf& sfn, LteNrTddSlotType type)
183 m_mac->DoSlotUlIndication(sfn, type);
187NrMacGnbMemberPhySapUser::SetCurrentSfn(
const SfnSf& sfn)
189 m_mac->SetCurrentSfn(sfn);
193NrMacGnbMemberPhySapUser::UlCqiReport(NrMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi)
195 m_mac->DoUlCqiReport(ulcqi);
199NrMacGnbMemberPhySapUser::ReceiveRachPreamble(uint32_t raId)
201 m_mac->ReceiveRachPreamble(raId);
205NrMacGnbMemberPhySapUser::UlHarqFeedback(UlHarqInfo params)
207 m_mac->DoUlHarqFeedback(params);
211NrMacGnbMemberPhySapUser::BeamChangeReport(BeamId beamId, uint8_t rnti)
213 m_mac->BeamChangeReport(beamId, rnti);
217NrMacGnbMemberPhySapUser::GetNumRbPerRbg()
const
219 return m_mac->GetNumRbPerRbg();
222std::shared_ptr<DciInfoElementTdma>
223NrMacGnbMemberPhySapUser::GetDlCtrlDci()
const
225 return m_mac->GetDlCtrlDci();
228std::shared_ptr<DciInfoElementTdma>
229NrMacGnbMemberPhySapUser::GetUlCtrlDci()
const
231 return m_mac->GetUlCtrlDci();
235NrMacGnbMemberPhySapUser::GetDlCtrlSymbols()
const
237 return m_mac->GetDlCtrlSyms();
242class NrMacMemberMacSchedSapUser :
public NrMacSchedSapUser
245 NrMacMemberMacSchedSapUser(NrGnbMac* mac);
246 void SchedConfigInd(
const struct SchedConfigIndParameters& params)
override;
247 Ptr<const SpectrumModel> GetSpectrumModel()
const override;
248 uint32_t GetNumRbPerRbg()
const override;
249 uint8_t GetNumHarqProcess()
const override;
250 uint16_t GetBwpId()
const override;
251 uint16_t GetCellId()
const override;
252 uint32_t GetSymbolsPerSlot()
const override;
253 Time GetSlotPeriod()
const override;
254 void BuildRarList(SlotAllocInfo& slotAllocInfo)
override;
260NrMacMemberMacSchedSapUser::NrMacMemberMacSchedSapUser(NrGnbMac* mac)
267NrMacMemberMacSchedSapUser::SchedConfigInd(
const struct SchedConfigIndParameters& params)
269 m_mac->DoSchedConfigIndication(params);
272Ptr<const SpectrumModel>
273NrMacMemberMacSchedSapUser::GetSpectrumModel()
const
275 return m_mac->m_phySapProvider
276 ->GetSpectrumModel();
281NrMacMemberMacSchedSapUser::GetNumRbPerRbg()
const
283 return m_mac->GetNumRbPerRbg();
287NrMacMemberMacSchedSapUser::GetNumHarqProcess()
const
289 return m_mac->GetNumHarqProcess();
293NrMacMemberMacSchedSapUser::GetBwpId()
const
295 return m_mac->GetBwpId();
299NrMacMemberMacSchedSapUser::GetCellId()
const
301 return m_mac->GetCellId();
305NrMacMemberMacSchedSapUser::GetSymbolsPerSlot()
const
307 return m_mac->m_phySapProvider->GetSymbolsPerSlot();
311NrMacMemberMacSchedSapUser::GetSlotPeriod()
const
313 return m_mac->m_phySapProvider->GetSlotPeriod();
319 m_mac->DoBuildRarList(slotAllocInfo);
322class NrMacMemberMacCschedSapUser :
public NrMacCschedSapUser
325 NrMacMemberMacCschedSapUser(NrGnbMac* mac);
327 void CschedCellConfigCnf(
328 const struct NrMacCschedSapUser::CschedCellConfigCnfParameters& params)
override;
329 void CschedUeConfigCnf(
330 const struct NrMacCschedSapUser::CschedUeConfigCnfParameters& params)
override;
331 void CschedLcConfigCnf(
332 const struct NrMacCschedSapUser::CschedLcConfigCnfParameters& params)
override;
333 void CschedLcReleaseCnf(
334 const struct NrMacCschedSapUser::CschedLcReleaseCnfParameters& params)
override;
335 void CschedUeReleaseCnf(
336 const struct NrMacCschedSapUser::CschedUeReleaseCnfParameters& params)
override;
337 void CschedUeConfigUpdateInd(
338 const struct NrMacCschedSapUser::CschedUeConfigUpdateIndParameters& params)
override;
339 void CschedCellConfigUpdateInd(
340 const struct NrMacCschedSapUser::CschedCellConfigUpdateIndParameters& params)
override;
346NrMacMemberMacCschedSapUser::NrMacMemberMacCschedSapUser(NrGnbMac* mac)
352NrMacMemberMacCschedSapUser::CschedCellConfigCnf(
const struct CschedCellConfigCnfParameters& params)
354 m_mac->DoCschedCellConfigCnf(params);
358NrMacMemberMacCschedSapUser::CschedUeConfigCnf(
const struct CschedUeConfigCnfParameters& params)
360 m_mac->DoCschedUeConfigCnf(params);
364NrMacMemberMacCschedSapUser::CschedLcConfigCnf(
const struct CschedLcConfigCnfParameters& params)
366 m_mac->DoCschedLcConfigCnf(params);
370NrMacMemberMacCschedSapUser::CschedLcReleaseCnf(
const struct CschedLcReleaseCnfParameters& params)
372 m_mac->DoCschedLcReleaseCnf(params);
376NrMacMemberMacCschedSapUser::CschedUeReleaseCnf(
const struct CschedUeReleaseCnfParameters& params)
378 m_mac->DoCschedUeReleaseCnf(params);
382NrMacMemberMacCschedSapUser::CschedUeConfigUpdateInd(
383 const struct CschedUeConfigUpdateIndParameters& params)
385 m_mac->DoCschedUeConfigUpdateInd(params);
389NrMacMemberMacCschedSapUser::CschedCellConfigUpdateInd(
390 const struct CschedCellConfigUpdateIndParameters& params)
392 m_mac->DoCschedCellConfigUpdateInd(params);
399 TypeId(
"ns3::NrGnbMac")
401 .AddConstructor<NrGnbMac>()
404 "Number of resource blocks per resource block group.",
406 MakeUintegerAccessor(&NrGnbMac::SetNumRbPerRbg, &NrGnbMac::GetNumRbPerRbg),
407 MakeUintegerChecker<uint32_t>())
410 "Number of concurrent stop-and-wait Hybrid ARQ processes per user",
412 MakeUintegerAccessor(&NrGnbMac::SetNumHarqProcess, &NrGnbMac::GetNumHarqProcess),
413 MakeUintegerChecker<uint8_t>())
414 .AddTraceSource(
"DlScheduling",
415 "Information regarding DL scheduling.",
416 MakeTraceSourceAccessor(&NrGnbMac::m_dlScheduling),
417 "ns3::NrGnbMac::DlSchedulingTracedCallback")
418 .AddTraceSource(
"UlScheduling",
419 "Information regarding UL scheduling.",
420 MakeTraceSourceAccessor(&NrGnbMac::m_ulScheduling),
421 "ns3::NrGnbMac::SchedulingTracedCallback")
422 .AddTraceSource(
"SrReq",
423 "Information regarding received scheduling request.",
424 MakeTraceSourceAccessor(&NrGnbMac::m_srCallback),
425 "ns3::NrGnbMac::SrTracedCallback")
426 .AddTraceSource(
"GnbMacRxedCtrlMsgsTrace",
427 "Gnb MAC Rxed Control Messages Traces.",
428 MakeTraceSourceAccessor(&NrGnbMac::m_macRxedCtrlMsgsTrace),
429 "ns3::NrMacRxTrace::RxedGnbMacCtrlMsgsTracedCallback")
430 .AddTraceSource(
"GnbMacTxedCtrlMsgsTrace",
431 "Gnb MAC Txed Control Messages Traces.",
432 MakeTraceSourceAccessor(&NrGnbMac::m_macTxedCtrlMsgsTrace),
433 "ns3::NrMacRxTrace::TxedGnbMacCtrlMsgsTracedCallback")
434 .AddTraceSource(
"DlHarqFeedback",
436 MakeTraceSourceAccessor(&NrGnbMac::m_dlHarqFeedback),
437 "ns3::NrGnbMac::DlHarqFeedbackTracedCallback")
438 .AddAttribute(
"NumberOfRaPreambles",
439 "How many random access preambles are available for the contention based "
442 MakeUintegerAccessor(&NrGnbMac::SetNumberOfRaPreambles),
443 MakeUintegerChecker<uint8_t>(4, 64))
444 .AddAttribute(
"PreambleTransMax",
445 "Maximum number of random access preamble transmissions",
447 MakeUintegerAccessor(&NrGnbMac::SetPreambleTransMax),
448 MakeUintegerChecker<uint8_t>(3, 200))
450 "RaResponseWindowSize",
451 "Length of the window for the reception of the random access response (RAR); "
452 "the resulting RAR timeout is this value + 5 ms",
454 MakeUintegerAccessor(&NrGnbMac::SetRaResponseWindowSize),
455 MakeUintegerChecker<uint8_t>(2, 10))
456 .AddAttribute(
"ConnEstFailCount",
457 "How many time T300 timer can expire on the same cell",
459 MakeUintegerAccessor(&NrGnbMac::SetConnEstFailCount),
460 MakeUintegerChecker<uint8_t>(1, 4));
467 NS_LOG_FUNCTION(
this);
468 m_cmacSapProvider =
new NrGnbMacMemberGnbCmacSapProvider(
this);
470 m_phySapUser =
new NrMacGnbMemberPhySapUser(
this);
471 m_macSchedSapUser =
new NrMacMemberMacSchedSapUser(
this);
472 m_macCschedSapUser =
new NrMacMemberMacCschedSapUser(
this);
483 m_dlCqiReceived.clear();
484 m_ulCqiReceived.clear();
485 m_ulCeReceived.clear();
486 m_miDlHarqProcessesPackets.clear();
487 delete m_macSapProvider;
488 delete m_cmacSapProvider;
489 delete m_macSchedSapUser;
490 delete m_macCschedSapUser;
492 delete m_ccmMacSapProvider;
496NrGnbMac::SetNumberOfRaPreambles(uint8_t numberOfRaPreambles)
498 m_numberOfRaPreambles = numberOfRaPreambles;
502NrGnbMac::SetPreambleTransMax(uint8_t preambleTransMax)
504 m_preambleTransMax = preambleTransMax;
508NrGnbMac::SetRaResponseWindowSize(uint8_t raResponseWindowSize)
510 m_raResponseWindowSize = raResponseWindowSize;
514NrGnbMac::SetConnEstFailCount(uint8_t connEstFailCount)
516 m_connEstFailCount = connEstFailCount;
522 NS_ABORT_MSG_IF(m_numRbPerRbg != -1,
"This attribute can not be reconfigured");
523 m_numRbPerRbg = rbgSize;
529 return m_numRbPerRbg;
535 m_numHarqProcess = numHarqProcess;
544 return m_numHarqProcess;
560NrGnbMac::IsHarqReTxEnable()
const
562 return m_macSchedSapProvider->IsHarqReTxEnable();
566NrGnbMac::ReceiveRachPreamble(uint32_t raId)
568 Ptr<NrRachPreambleMessage> rachMsg = Create<NrRachPreambleMessage>();
572 ++m_receivedRachPreambleCount[raId];
576NrGnbMac::GetMacSapProvider()
578 return m_macSapProvider;
582NrGnbMac::GetGnbCmacSapProvider()
584 return m_cmacSapProvider;
588NrGnbMac::SetGnbCmacSapUser(NrGnbCmacSapUser* s)
602 NS_LOG_FUNCTION(
this);
603 return m_ccmMacSapProvider;
609 NS_LOG_FUNCTION(
this);
610 m_currentSlot = sfnSf;
616 NS_LOG_FUNCTION(
this);
617 NS_LOG_LOGIC(
"Perform things on DL, slot on the air: " << sfnSf);
626 m_dlCqiReceived.begin(),
627 m_dlCqiReceived.end());
628 m_dlCqiReceived.erase(m_dlCqiReceived.begin(), m_dlCqiReceived.end());
630 m_macSchedSapProvider->SchedDlCqiInfoReq(dlCqiInfoReq);
632 for (
const auto& v : dlCqiInfoReq.
m_cqiList)
634 Ptr<NrDlCqiMessage> msg = Create<NrDlCqiMessage>();
646 if (!m_dlHarqInfoReceived.empty())
650 m_dlHarqInfoReceived.clear();
654 Ptr<NrDlHarqFeedbackMessage> msg = Create<NrDlHarqFeedbackMessage>();
655 msg->SetDlHarqFeedback(v);
661 for (
const auto& ue : m_rlcAttached)
664 params.m_rnti = ue.first;
666 params.m_transmissionMode = 0;
668 m_macCschedSapProvider->CschedUeConfigReq(params);
676NrGnbMac::ProcessRaPreambles(
const SfnSf& sfnSf)
678 NS_LOG_FUNCTION(
this);
683 for (
auto it = m_receivedRachPreambleCount.begin(); it != m_receivedRachPreambleCount.end();
686 NS_LOG_INFO(
this <<
" preambleId " <<
static_cast<uint32_t
>(it->first) <<
": " << it->second
688 NS_ASSERT(it->second != 0);
691 NS_LOG_INFO(
"preambleId " <<
static_cast<uint32_t
>(it->first) <<
": collision"
692 <<
" at: " << Simulator::Now().As(Time::MS));
699 std::map<uint8_t, NcRaPreambleInfo>::iterator jt =
700 m_allocatedNcRaPreambleMap.find(it->first);
701 if (jt != m_allocatedNcRaPreambleMap.end())
703 rnti = jt->second.rnti;
704 NS_LOG_INFO(
"preambleId previously allocated for NC based RA, RNTI ="
705 <<
static_cast<uint32_t
>(rnti) <<
", sending RAR"
706 <<
" at: " << Simulator::Now().As(Time::MS));
711 NS_LOG_INFO(
"preambleId " <<
static_cast<uint32_t
>(it->first)
712 <<
": allocated T-C-RNTI " <<
static_cast<uint32_t
>(rnti)
714 <<
" at: " << Simulator::Now().As(Time::MS));
717 NS_LOG_INFO(
"Informing MAC scheduler of the RACH preamble for "
718 <<
static_cast<uint16_t
>(it->first) <<
" in slot " << sfnSf);
719 nr::RachListElement_s rachLe;
720 rachLe.m_rnti = rnti;
721 rachLe.m_estimatedSize = 144;
722 rachInfoReqParams.
m_rachList.push_back(rachLe);
723 m_rapIdRntiMap.insert(std::pair<uint16_t, uint32_t>(rnti, it->first));
727 m_receivedRachPreambleCount.clear();
734 NS_LOG_FUNCTION(
this);
735 NS_LOG_LOGIC(
"Perform things on UL, slot on the air: " << sfnSf);
737 if (!m_receivedRachPreambleCount.empty())
739 ProcessRaPreambles(sfnSf);
744 for (
auto& i : m_ulCqiReceived)
748 m_macSchedSapProvider->SchedUlCqiInfoReq(i);
750 m_ulCqiReceived.clear();
755 params.
m_snfSf = m_currentSlot;
756 params.
m_srList.insert(params.
m_srList.begin(), m_srRntiList.begin(), m_srRntiList.end());
757 m_srRntiList.clear();
761 for (
const auto& v : params.
m_srList)
763 Ptr<NrSRMessage> msg = Create<NrSRMessage>();
770 if (!m_ulCeReceived.empty())
775 m_ulCeReceived.begin(),
776 m_ulCeReceived.end());
777 m_ulCeReceived.erase(m_ulCeReceived.begin(), m_ulCeReceived.end());
778 m_macSchedSapProvider->SchedUlMacCtrlInfoReq(ulMacReq);
782 Ptr<NrBsrMessage> msg = Create<NrBsrMessage>();
794 if (!m_ulHarqInfoReceived.empty())
798 m_ulHarqInfoReceived.clear();
805NrGnbMac::SetForwardUpCallback(Callback<
void, Ptr<Packet>> cb)
807 m_forwardUpCallback = cb;
811NrGnbMac::ReceiveBsrMessage(MacCeElement bsr)
813 NS_LOG_FUNCTION(
this);
817 nr::MacCeListElement_s mcle;
818 mcle.m_rnti = bsr.m_rnti;
819 mcle.m_macCeValue.m_bufferStatus = bsr.m_macCeValue.m_bufferStatus;
820 mcle.m_macCeValue.m_crnti = bsr.m_macCeValue.m_crnti;
821 mcle.m_macCeValue.m_phr = bsr.m_macCeValue.m_phr;
822 mcle.m_macCeValue.m_bufferStatus = bsr.m_macCeValue.m_bufferStatus;
824 if (bsr.m_macCeType == MacCeElement::BSR)
826 mcle.m_macCeType = nr::MacCeListElement_s::BSR;
828 else if (bsr.m_macCeType == MacCeElement::CRNTI)
830 mcle.m_macCeType = nr::MacCeListElement_s::CRNTI;
832 else if (bsr.m_macCeType == MacCeElement::PHR)
834 mcle.m_macCeType = nr::MacCeListElement_s::PHR;
841NrGnbMac::DoReportMacCeToScheduler(nr::MacCeListElement_s bsr)
843 NS_LOG_FUNCTION(
this);
844 NS_LOG_DEBUG(
this <<
" bsr Size " << (uint16_t)m_ulCeReceived.size());
851 mce.m_rnti = bsr.m_rnti;
852 mce.m_macCeValue.m_bufferStatus = bsr.m_macCeValue.m_bufferStatus;
853 mce.m_macCeValue.m_crnti = bsr.m_macCeValue.m_crnti;
854 mce.m_macCeValue.m_phr = bsr.m_macCeValue.m_phr;
855 mce.m_macCeValue.m_bufferStatus = bsr.m_macCeValue.m_bufferStatus;
857 if (bsr.m_macCeType == nr::MacCeListElement_s::BSR)
859 mce.m_macCeType = MacCeElement::BSR;
861 else if (bsr.m_macCeType == nr::MacCeListElement_s::CRNTI)
863 mce.m_macCeType = MacCeElement::CRNTI;
865 else if (bsr.m_macCeType == nr::MacCeListElement_s::PHR)
867 mce.m_macCeType = MacCeElement::PHR;
870 for (
const auto& v : bsr.m_macCeValue.m_bufferStatus)
875 m_ulCeReceived.push_back(
877 NS_LOG_DEBUG(
" Reported by UE " <<
static_cast<uint32_t
>(bsr.m_macCeValue.m_crnti) <<
" size "
878 << size <<
" bsr vector ize after push_back "
879 <<
static_cast<uint32_t
>(m_ulCeReceived.size()));
883NrGnbMac::DoReportSrToScheduler(uint16_t rnti)
885 NS_LOG_FUNCTION(
this);
886 m_srRntiList.push_back(rnti);
891NrGnbMac::DoReceivePhyPdu(Ptr<Packet> p)
893 NS_LOG_FUNCTION(
this);
895 NrRadioBearerTag tag;
896 p->RemovePacketTag(tag);
898 uint16_t rnti = tag.GetRnti();
899 auto rntiIt = m_rlcAttached.find(rnti);
901 NS_ASSERT_MSG(rntiIt != m_rlcAttached.end(),
"could not find RNTI" << rnti);
904 NrMacHeaderFsUl header;
905 p->PeekHeader(header);
910 NrMacShortBsrCe bsrHeader;
911 p->RemoveHeader(bsrHeader);
916 bsr.m_macCeType = MacCeElement::BSR;
918 bsr.m_macCeValue.m_bufferStatus.resize(4);
919 bsr.m_macCeValue.m_bufferStatus[0] = bsrHeader.m_bufferSizeLevel_0;
920 bsr.m_macCeValue.m_bufferStatus[1] = bsrHeader.m_bufferSizeLevel_1;
921 bsr.m_macCeValue.m_bufferStatus[2] = bsrHeader.m_bufferSizeLevel_2;
922 bsr.m_macCeValue.m_bufferStatus[3] = bsrHeader.m_bufferSizeLevel_3;
924 ReceiveBsrMessage(bsr);
930 NrMacHeaderVs macHeader;
931 p->RemoveHeader(macHeader);
933 auto lcidIt = rntiIt->second.find(macHeader.GetLcId());
934 if (lcidIt == rntiIt->second.end())
936 NS_LOG_DEBUG(
"Discarding PDU addressed to non-existent LCID " << macHeader.GetLcId());
940 NrMacSapUser::ReceivePduParameters rxParams;
942 rxParams.lcid = macHeader.GetLcId();
943 rxParams.rnti = rnti;
945 if (rxParams.p->GetSize())
947 (*lcidIt).second->ReceivePdu(rxParams);
952NrGnbMac::GetPhySapUser()
958NrGnbMac::SetPhySapProvider(NrPhySapProvider* ptr)
960 m_phySapProvider = ptr;
964NrGnbMac::GetNrMacSchedSapUser()
966 return m_macSchedSapUser;
970NrGnbMac::SetNrMacSchedSapProvider(NrMacSchedSapProvider* ptr)
972 m_macSchedSapProvider = ptr;
976NrGnbMac::GetNrMacCschedSapUser()
978 return m_macCschedSapUser;
982NrGnbMac::SetNrMacCschedSapProvider(NrMacCschedSapProvider* ptr)
984 m_macCschedSapProvider = ptr;
988NrGnbMac::DoUlCqiReport(NrMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi)
990 if (ulcqi.m_ulCqi.m_type == UlCqiInfo::PUSCH)
992 NS_LOG_DEBUG(
this <<
" gNB rxed an PUSCH UL-CQI");
994 else if (ulcqi.m_ulCqi.m_type == UlCqiInfo::SRS)
996 NS_LOG_DEBUG(
this <<
" gNB rxed an SRS UL-CQI");
998 NS_LOG_INFO(
"*** UL CQI report SINR "
1000 <<
" slot: " << m_currentSlot);
1003 m_ulCqiReceived.push_back(ulcqi);
1007NrGnbMac::DoReceiveControlMessage(Ptr<NrControlMessage> msg)
1009 NS_LOG_FUNCTION(
this << msg);
1011 switch (msg->GetMessageType())
1015 Ptr<NrSRMessage> sr = DynamicCast<NrSRMessage>(msg);
1020 Ptr<NrDlCqiMessage> cqi = DynamicCast<NrDlCqiMessage>(msg);
1021 DlCqiInfo cqiElement = cqi->GetDlCqi();
1022 NS_ASSERT(cqiElement.m_rnti != 0);
1023 m_dlCqiReceived.push_back(cqiElement);
1027 Ptr<NrDlHarqFeedbackMessage> dlharq = DynamicCast<NrDlHarqFeedbackMessage>(msg);
1028 DoDlHarqFeedback(dlharq->GetDlHarqFeedback());
1032 NS_LOG_WARN(
"Control message not supported/expected");
1037NrGnbMac::DoUlHarqFeedback(
const UlHarqInfo& params)
1039 NS_LOG_FUNCTION(
this);
1040 m_ulHarqInfoReceived.push_back(params);
1044NrGnbMac::DoDlHarqFeedback(
const DlHarqInfo& params)
1046 NS_LOG_FUNCTION(
this);
1048 std::unordered_map<uint16_t, NrDlHarqProcessesBuffer_t>::iterator it =
1049 m_miDlHarqProcessesPackets.find(params.m_rnti);
1050 NS_ASSERT(it != m_miDlHarqProcessesPackets.end());
1052 if (params.m_harqStatus == DlHarqInfo::ACK)
1055 Ptr<PacketBurst> emptyBuf = CreateObject<PacketBurst>();
1056 (*it).second.at(params.m_harqProcessId).m_pktBurst = emptyBuf;
1057 NS_LOG_DEBUG(
this <<
" HARQ-ACK UE RNTI" << params.m_rnti <<
" HARQ Process ID "
1058 << (uint16_t)params.m_harqProcessId);
1062 NS_LOG_DEBUG(
this <<
" HARQ-NACK UE RNTI" << params.m_rnti <<
" HARQ Process ID "
1063 << (uint16_t)params.m_harqProcessId);
1067 NS_FATAL_ERROR(
" HARQ functionality not implemented");
1071 m_dlHarqFeedback(params);
1073 m_dlHarqInfoReceived.push_back(params);
1077NrGnbMac::DoTransmitBufferStatusReport(NrMacSapProvider::BufferStatusReportParameters params)
1079 NS_LOG_FUNCTION(
this);
1080 NrMacSchedSapProvider::SchedDlRlcBufferReqParameters schedParams;
1081 schedParams.m_logicalChannelIdentity = params.lcid;
1082 schedParams.m_rlcRetransmissionHolDelay = params.retxQueueHolDelay;
1083 schedParams.m_rlcRetransmissionQueueSize = params.retxQueueSize;
1084 schedParams.m_rlcStatusPduSize = params.statusPduSize;
1085 schedParams.m_rlcTransmissionQueueHolDelay = params.txQueueHolDelay;
1086 schedParams.m_rlcTransmissionQueueSize = params.txQueueSize;
1087 schedParams.m_rnti = params.rnti;
1089 NS_LOG_INFO(
"Reporting RLC buffer status update to MAC Scheduler for RNTI="
1090 << params.rnti <<
", LCID=" << (uint32_t)params.lcid <<
", Transmission Queue Size="
1091 << params.txQueueSize <<
", Transmission Queue HOL Delay=" << params.txQueueHolDelay
1092 <<
", Retransmission Queue Size=" << params.retxQueueSize
1093 <<
", Retransmission Queue HOL delay=" << params.retxQueueHolDelay
1094 <<
", PDU Size=" << params.statusPduSize);
1096 m_macSchedSapProvider->SchedDlRlcBufferReq(schedParams);
1101NrGnbMac::DoTransmitPdu(NrMacSapProvider::TransmitPduParameters params)
1104 uint32_t tbMapKey = ((params.rnti & 0xFFFF) << 8) | (params.harqProcessId & 0xFF);
1105 auto harqIt = m_miDlHarqProcessesPackets.find(params.rnti);
1106 auto it = m_macPduMap.find(tbMapKey);
1108 if (it == m_macPduMap.end())
1110 NS_FATAL_ERROR(
"No MAC PDU storage element found for this TB UID/RNTI");
1113 NrMacHeaderVs header;
1114 header.SetLcId(params.lcid);
1115 header.SetSize(params.pdu->GetSize());
1117 params.pdu->AddHeader(header);
1119 NrRadioBearerTag bearerTag(params.rnti, params.lcid, 0);
1120 params.pdu->AddPacketTag(bearerTag);
1122 harqIt->second.at(params.harqProcessId).m_pktBurst->AddPacket(params.pdu);
1124 it->second.m_used += params.pdu->GetSize();
1125 NS_ASSERT_MSG(it->second.m_dci->m_tbSize >= it->second.m_used,
1126 "DCI OF " << it->second.m_dci->m_tbSize <<
" total used " << it->second.m_used);
1128 NS_LOG_INFO(
"Sending MAC PDU to PHY Layer");
1131 it->second.m_dci->m_symStart,
1136NrGnbMac::DoBuildRarList(SlotAllocInfo& slotAllocInfo)
1138 NS_LOG_FUNCTION(
this);
1140 if (!HasMsg3Allocations(slotAllocInfo))
1145 for (
const auto& varTti : slotAllocInfo.m_varTtiAllocInfo)
1149 NrBuildRarListElement_s rarElement;
1150 rarElement.ulMsg3Dci = varTti.m_dci;
1152 auto itRaPreambleId = m_rapIdRntiMap.find(rarElement.ulMsg3Dci->m_rnti);
1153 NS_ABORT_IF(itRaPreambleId == m_rapIdRntiMap.end());
1154 NS_LOG_INFO(
"In slot " << m_currentSlot
1155 <<
" gNB MAC pass to PHY the RAR message for RNTI "
1156 << rarElement.ulMsg3Dci->m_rnti <<
" RA preamble ID "
1157 << itRaPreambleId->second <<
" at:" << Simulator::Now());
1158 rarElement.raPreambleId = itRaPreambleId->second;
1160 slotAllocInfo.m_buildRarList.push_back(rarElement);
1164 if (!slotAllocInfo.m_buildRarList.empty())
1166 m_rapIdRntiMap.clear();
1167 NS_LOG_DEBUG(
"Sending RAR message to UE.");
1171 NS_LOG_DEBUG(
"No RAR messages to be sent.");
1176NrGnbMac::HasMsg3Allocations(
const SlotAllocInfo& slotInfo)
1178 for (
const auto& varTti : slotInfo.m_varTtiAllocInfo)
1189NrGnbMac::DoSchedConfigIndication(NrMacSchedSapUser::SchedConfigIndParameters ind)
1191 NS_ASSERT(ind.m_sfnSf.GetNumerology() == m_currentSlot.
GetNumerology());
1192 std::stable_sort(ind.m_slotAllocInfo.m_varTtiAllocInfo.begin(),
1193 ind.m_slotAllocInfo.m_varTtiAllocInfo.end());
1195 if (ind.m_slotAllocInfo.ContainsDataAllocation())
1197 NS_LOG_INFO(
"New scheduled allocation: " << ind.m_slotAllocInfo);
1201 for (
auto& varTtiAllocInfo : ind.m_slotAllocInfo.m_varTtiAllocInfo)
1206 uint16_t rnti = varTtiAllocInfo.m_dci->m_rnti;
1207 auto rntiIt = m_rlcAttached.find(rnti);
1208 NS_ABORT_MSG_IF(rntiIt == m_rlcAttached.end(),
1209 "Scheduled UE " << rnti <<
" not attached");
1212 auto dciElem = varTtiAllocInfo.m_dci;
1213 uint8_t harqId = dciElem->m_harqProcess;
1215 if (ind.m_slotAllocInfo.ContainsDataAllocation())
1217 NS_LOG_INFO(
"New scheduled data TX in DL for HARQ Process ID: "
1218 << (uint32_t)harqId <<
", Var. TTI from symbol "
1219 << (uint32_t)varTtiAllocInfo.m_dci->m_symStart <<
" to "
1220 << (uint32_t)varTtiAllocInfo.m_dci->m_symStart +
1221 (uint32_t)varTtiAllocInfo.m_dci->m_numSym
1223 <<
" TB of size " << varTtiAllocInfo.m_dci->m_tbSize <<
" with MCS "
1224 << varTtiAllocInfo.m_dci->m_mcs);
1228 if (dciElem->m_ndi == 1)
1231 std::vector<RlcPduInfo>& rlcPduInfo = varTtiAllocInfo.m_rlcPduInfo;
1232 NS_ASSERT(!rlcPduInfo.empty());
1233 NrMacPduInfo macPduInfo(ind.m_sfnSf, dciElem);
1235 uint32_t tbMapKey = ((rnti & 0xFFFF) << 8) | (harqId & 0xFF);
1236 std::pair<std::unordered_map<uint32_t, struct NrMacPduInfo>::iterator,
bool>
1237 mapRet = m_macPduMap.insert(
1238 std::pair<uint32_t, struct NrMacPduInfo>(tbMapKey, macPduInfo));
1241 NS_FATAL_ERROR(
"MAC PDU map element exists");
1245 std::unordered_map<uint16_t, NrDlHarqProcessesBuffer_t>::iterator harqIt =
1246 m_miDlHarqProcessesPackets.find(rnti);
1247 NS_ASSERT(harqIt != m_miDlHarqProcessesPackets.end());
1248 Ptr<PacketBurst> pb = CreateObject<PacketBurst>();
1249 harqIt->second.at(harqId).m_pktBurst = pb;
1250 harqIt->second.at(harqId).m_lcidList.clear();
1252 std::unordered_map<uint32_t, struct NrMacPduInfo>::iterator pduMapIt = mapRet.first;
1254 for (
auto& j : rlcPduInfo)
1256 NS_ASSERT_MSG(rntiIt != m_rlcAttached.end(),
"could not find RNTI" << rnti);
1257 std::unordered_map<uint8_t, NrMacSapUser*>::iterator lcidIt =
1258 rntiIt->second.find(j.m_lcid);
1259 NS_ASSERT_MSG(lcidIt != rntiIt->second.end(),
1260 "could not find LCID" << std::to_string(j.m_lcid));
1261 NS_LOG_INFO(
"Notifying RLC of TX opportunity for HARQ Process ID "
1262 << (
unsigned int)harqId <<
" LC ID " << std::to_string(+j.m_lcid)
1263 << (
unsigned int)j.m_size);
1265 (*lcidIt).second->NotifyTxOpportunity(
1266 NrMacSapUser::TxOpportunityParameters((j.m_size),
1272 harqIt->second.at(harqId).m_lcidList.push_back(j.m_lcid);
1275 m_macPduMap.erase(pduMapIt);
1278 traceInfo.
m_frameNum = ind.m_sfnSf.GetFrame();
1280 traceInfo.
m_slotNum = ind.m_sfnSf.GetSlot();
1282 traceInfo.
m_numSym = dciElem->m_numSym;
1283 traceInfo.
m_tbSize = dciElem->m_tbSize;
1284 traceInfo.
m_mcs = dciElem->m_mcs;
1285 traceInfo.
m_rnti = dciElem->m_rnti;
1287 traceInfo.
m_ndi = dciElem->m_ndi;
1288 traceInfo.
m_rv = dciElem->m_rv;
1289 traceInfo.
m_harqId = dciElem->m_harqProcess;
1290 m_dlScheduling(traceInfo);
1294 NS_LOG_INFO(
"DL retransmission");
1295 if (dciElem->m_tbSize > 0)
1297 std::unordered_map<uint16_t, NrDlHarqProcessesBuffer_t>::iterator it =
1298 m_miDlHarqProcessesPackets.find(rnti);
1299 NS_ASSERT(it != m_miDlHarqProcessesPackets.end());
1300 Ptr<PacketBurst> pb = it->second.at(harqId).m_pktBurst;
1301 for (std::list<Ptr<Packet>>::const_iterator j = pb->Begin(); j != pb->End();
1304 Ptr<Packet> pkt = (*j)->Copy();
1307 dciElem->m_symStart,
1319 auto dciElem = varTtiAllocInfo.m_dci;
1321 traceInfo.
m_frameNum = ind.m_sfnSf.GetFrame();
1323 traceInfo.
m_slotNum = ind.m_sfnSf.GetSlot();
1325 traceInfo.
m_numSym = dciElem->m_numSym;
1326 traceInfo.
m_tbSize = dciElem->m_tbSize;
1327 traceInfo.
m_mcs = dciElem->m_mcs;
1328 traceInfo.
m_rnti = dciElem->m_rnti;
1330 traceInfo.
m_ndi = dciElem->m_ndi;
1331 traceInfo.
m_rv = dciElem->m_rv;
1332 traceInfo.
m_harqId = dciElem->m_harqProcess;
1333 m_ulScheduling(traceInfo);
1343NrGnbMac::DoConfigureMac(uint16_t ulBandwidth, uint16_t dlBandwidth)
1345 NS_LOG_FUNCTION(
this);
1350 m_bandwidthInRbg = bw_in_rbg;
1352 NS_LOG_DEBUG(
"Mac configured. Attributes:"
1354 <<
"\t NumRbPerRbg: " << m_numRbPerRbg << std::endl
1355 <<
"\t HarqEnable: " << m_macSchedSapProvider->IsHarqReTxEnable() << std::endl
1356 <<
"\t NumHarqProcess: " << +m_numHarqProcess << std::endl
1357 <<
"Physical properties: " << std::endl
1358 <<
"\t Bandwidth provided: " << ulBandwidth * 1000 * 100 <<
" Hz" << std::endl
1359 <<
"\t that corresponds to " << bw_in_rbg <<
" RBG, as we have "
1363 NrMacCschedSapProvider::CschedCellConfigReqParameters params;
1365 params.m_ulBandwidth = m_bandwidthInRbg;
1366 params.m_dlBandwidth = m_bandwidthInRbg;
1375 params.m_rnti = rnti;
1377 params.m_transmissionMode =
1379 m_macCschedSapProvider->CschedUeConfigReq(params);
1385 if (m_phySapProvider)
1387 return m_phySapProvider->
GetBwpId();
1398 if (m_phySapProvider)
1408std::shared_ptr<DciInfoElementTdma>
1411 NS_LOG_FUNCTION(
this);
1414 NS_ASSERT(bwInRbg > 0);
1415 std::vector<bool> rbgBitmask(bwInRbg,
true);
1417 return std::make_shared<DciInfoElementTdma>(0,
1424std::shared_ptr<DciInfoElementTdma>
1427 NS_LOG_FUNCTION(
this);
1429 NS_ASSERT(m_bandwidthInRbg > 0);
1430 std::vector<bool> rbgBitmask(m_bandwidthInRbg,
true);
1432 return std::make_shared<DciInfoElementTdma>(0,
1440NrGnbMac::DoAddUe(uint16_t rnti)
1442 NS_LOG_FUNCTION(
this <<
" rnti=" << rnti);
1443 std::unordered_map<uint8_t, NrMacSapUser*> empty;
1444 std::pair<std::unordered_map<uint16_t, std::unordered_map<uint8_t, NrMacSapUser*>>::iterator,
1446 ret = m_rlcAttached.insert(
1447 std::pair<uint16_t, std::unordered_map<uint8_t, NrMacSapUser*>>(rnti, empty));
1448 NS_ASSERT_MSG(ret.second,
"element already present, RNTI already existed");
1451 params.m_rnti = rnti;
1453 params.m_transmissionMode =
1455 m_macCschedSapProvider->CschedUeConfigReq(params);
1458 NrDlHarqProcessesBuffer_t buf;
1460 buf.resize(harqNum);
1461 for (uint16_t i = 0; i < harqNum; i++)
1463 Ptr<PacketBurst> pb = CreateObject<PacketBurst>();
1464 buf.at(i).m_pktBurst = pb;
1466 m_miDlHarqProcessesPackets.insert(std::pair<uint16_t, NrDlHarqProcessesBuffer_t>(rnti, buf));
1470NrGnbMac::DoRemoveUe(uint16_t rnti)
1472 NS_LOG_FUNCTION(
this <<
" rnti=" << rnti);
1473 NrMacCschedSapProvider::CschedUeReleaseReqParameters params;
1474 params.m_rnti = rnti;
1475 m_macCschedSapProvider->CschedUeReleaseReq(params);
1476 m_miDlHarqProcessesPackets.erase(rnti);
1477 m_rlcAttached.erase(rnti);
1480 auto jt = m_allocatedNcRaPreambleMap.begin();
1481 while (jt != m_allocatedNcRaPreambleMap.end())
1483 if (jt->second.rnti == rnti)
1485 auto it = m_receivedRachPreambleCount.find(jt->first);
1486 if (it != m_receivedRachPreambleCount.end())
1488 m_receivedRachPreambleCount.erase(it->first);
1490 jt = m_allocatedNcRaPreambleMap.erase(jt);
1500NrGnbMac::DoAddLc(NrGnbCmacSapProvider::LcInfo lcinfo, NrMacSapUser* msu)
1502 NS_LOG_FUNCTION(
this);
1503 NS_LOG_FUNCTION(
this);
1505 std::unordered_map<uint16_t, std::unordered_map<uint8_t, NrMacSapUser*>>::iterator rntiIt =
1506 m_rlcAttached.find(lcinfo.rnti);
1507 NS_ASSERT_MSG(rntiIt != m_rlcAttached.end(),
"RNTI not found");
1508 std::unordered_map<uint8_t, NrMacSapUser*>::iterator lcidIt = rntiIt->second.find(lcinfo.lcId);
1509 if (lcidIt == rntiIt->second.end())
1511 rntiIt->second.insert(std::pair<uint8_t, NrMacSapUser*>(lcinfo.lcId, msu));
1515 NS_LOG_ERROR(
"LC already exists");
1522 if (lcinfo.lcId != 0)
1524 struct NrMacCschedSapProvider::CschedLcConfigReqParameters params;
1525 params.m_rnti = lcinfo.rnti;
1526 params.m_reconfigureFlag =
false;
1528 struct nr::LogicalChannelConfigListElement_s lccle;
1529 lccle.m_logicalChannelIdentity = lcinfo.lcId;
1530 lccle.m_logicalChannelGroup = lcinfo.lcGroup;
1531 lccle.m_direction = nr::LogicalChannelConfigListElement_s::DIR_BOTH;
1532 lccle.m_qci = lcinfo.qci;
1533 lccle.m_eRabMaximulBitrateUl = lcinfo.mbrUl;
1534 lccle.m_eRabMaximulBitrateDl = lcinfo.mbrDl;
1535 lccle.m_eRabGuaranteedBitrateUl = lcinfo.gbrUl;
1536 lccle.m_eRabGuaranteedBitrateDl = lcinfo.gbrDl;
1539 lcinfo.resourceType);
1541 params.m_logicalChannelConfigList.push_back(lccle);
1543 m_macCschedSapProvider->CschedLcConfigReq(params);
1548NrGnbMac::DoReconfigureLc(NrGnbCmacSapProvider::LcInfo lcinfo)
1550 NS_FATAL_ERROR(
"not implemented");
1554NrGnbMac::DoReleaseLc(uint16_t rnti, uint8_t lcid)
1557 std::unordered_map<uint16_t, std::unordered_map<uint8_t, NrMacSapUser*>>::iterator rntiIt =
1558 m_rlcAttached.find(rnti);
1559 rntiIt->second.erase(lcid);
1561 struct NrMacCschedSapProvider::CschedLcReleaseReqParameters params;
1562 params.m_rnti = rnti;
1563 params.m_logicalChannelIdentity.push_back(lcid);
1564 m_macCschedSapProvider->CschedLcReleaseReq(params);
1568NrGnbMac::UeUpdateConfigurationReq(NrGnbCmacSapProvider::UeConfig params)
1570 NS_LOG_FUNCTION(
this);
1572 NrMacCschedSapProvider::CschedUeConfigReqParameters req;
1573 req.m_rnti = params.m_rnti;
1574 req.m_transmissionMode = params.m_transmissionMode;
1575 req.m_beamId = m_phySapProvider->
GetBeamId(params.m_rnti);
1576 req.m_reconfigureFlag =
true;
1577 m_macCschedSapProvider->CschedUeConfigReq(req);
1580NrGnbCmacSapProvider::RachConfig
1581NrGnbMac::DoGetRachConfig()
1583 NS_LOG_FUNCTION(
this);
1584 struct NrGnbCmacSapProvider::RachConfig rc;
1585 rc.numberOfRaPreambles = m_numberOfRaPreambles;
1586 rc.preambleTransMax = m_preambleTransMax;
1587 rc.raResponseWindowSize = m_raResponseWindowSize;
1588 rc.connEstFailCount = m_connEstFailCount;
1592NrGnbCmacSapProvider::AllocateNcRaPreambleReturnValue
1593NrGnbMac::DoAllocateNcRaPreamble(uint16_t rnti)
1597 for (preambleId = m_numberOfRaPreambles; preambleId < 64; ++preambleId)
1599 std::map<uint8_t, NcRaPreambleInfo>::iterator it =
1600 m_allocatedNcRaPreambleMap.find(preambleId);
1612 if ((it != m_allocatedNcRaPreambleMap.end()) && (it->second.expiryTime < Simulator::Now()))
1621 if ((it == m_allocatedNcRaPreambleMap.end()) || (it->second.expiryTime < Simulator::Now()))
1624 NcRaPreambleInfo preambleInfo;
1625 uint32_t expiryIntervalMs =
1626 (uint32_t)m_preambleTransMax * ((uint32_t)m_raResponseWindowSize + 5);
1628 preambleInfo.expiryTime = Simulator::Now() + MilliSeconds(expiryIntervalMs);
1629 preambleInfo.rnti = rnti;
1630 NS_LOG_INFO(
"allocated preamble for NC based RA: preamble "
1631 << preambleId <<
", RNTI " << preambleInfo.rnti <<
", exiryTime "
1632 << preambleInfo.expiryTime);
1633 m_allocatedNcRaPreambleMap[preambleId] =
1638 NrGnbCmacSapProvider::AllocateNcRaPreambleReturnValue ret;
1642 ret.raPreambleId = preambleId;
1643 ret.raPrachMaskIndex = 0;
1648 ret.raPreambleId = 0;
1649 ret.raPrachMaskIndex = 0;
1659NrGnbMac::DoCschedCellConfigCnf(NrMacCschedSapUser::CschedCellConfigCnfParameters params)
1661 NS_LOG_FUNCTION(
this);
1665NrGnbMac::DoCschedUeConfigCnf(NrMacCschedSapUser::CschedUeConfigCnfParameters params)
1667 NS_LOG_FUNCTION(
this);
1671NrGnbMac::DoCschedLcConfigCnf(NrMacCschedSapUser::CschedLcConfigCnfParameters params)
1673 NS_LOG_FUNCTION(
this);
1679NrGnbMac::DoCschedLcReleaseCnf(NrMacCschedSapUser::CschedLcReleaseCnfParameters params)
1681 NS_LOG_FUNCTION(
this);
1685NrGnbMac::DoCschedUeReleaseCnf(NrMacCschedSapUser::CschedUeReleaseCnfParameters params)
1687 NS_LOG_FUNCTION(
this);
1691NrGnbMac::DoCschedUeConfigUpdateInd(NrMacCschedSapUser::CschedUeConfigUpdateIndParameters params)
1693 NS_LOG_FUNCTION(
this);
1695 NrGnbCmacSapUser::UeConfig ueConfigUpdate;
1696 ueConfigUpdate.m_rnti = params.m_rnti;
1697 ueConfigUpdate.m_transmissionMode = params.m_transmissionMode;
1702NrGnbMac::DoCschedCellConfigUpdateInd(
1703 NrMacCschedSapUser::CschedCellConfigUpdateIndParameters params)
1705 NS_LOG_FUNCTION(
this);
Representation of a beam id.
GnbMacMemberNrMacSapProvider class.
MemberNrCcmMacSapProvider class.
Service Access Point (SAP) offered by the component carrier manager (CCM) by MAC to CCM.
Service Access Point (SAP) offered by MAC to the component carrier manager (CCM).
virtual void UlReceiveSr(uint16_t rnti, uint8_t componentCarrierId)=0
The MAC received a SR.
virtual void UlReceiveMacCe(nr::MacCeListElement_s bsr, uint8_t componentCarrierId)=0
When the Primary Component carrier receive a buffer status report it is sent to the CCM.
@ DL_HARQ
DL HARQ feedback.
@ SR
Scheduling Request: asking for space.
virtual void RrcConfigurationUpdateInd(UeConfig params)=0
virtual uint16_t AllocateTemporaryCellRnti()=0
virtual bool IsRandomAccessCompleted(uint16_t rnti)=0
Is random access completed function.
virtual uint8_t GetUlCtrlSyms() const
Retrieve the number of UL ctrl symbols configured in the scheduler.
uint8_t GetNumHarqProcess() const
NrCcmMacSapProvider * GetNrCcmMacSapProvider()
Get the gNB-ComponentCarrierManager SAP User.
virtual void DoSlotDlIndication(const SfnSf &sfnSf, LteNrTddSlotType type)
Perform DL scheduling decision for the indicated slot.
std::shared_ptr< DciInfoElementTdma > GetUlCtrlDci() const
Get a DCI for the UL CTRL symbol.
uint16_t GetBwpId() const
Get the bwp id of this MAC.
void SetNumRbPerRbg(uint32_t rbgSize)
Sets the number of RBs per RBG. Currently it can be configured by the user, while in the future it wi...
void SetNumHarqProcess(uint8_t numHarqProcess)
Sets the number of HARQ processes.
void SetNrCcmMacSapUser(NrCcmMacSapUser *s)
Set the ComponentCarrierManager SAP user.
~NrGnbMac() override
~NrGnbMac
std::shared_ptr< DciInfoElementTdma > GetDlCtrlDci() const
Get a DCI for the DL CTRL symbol.
void BeamChangeReport(BeamId beamId, uint8_t rnti)
A Beam for a user has changed.
uint16_t GetCellId() const
Get the cell id of this MAC.
uint32_t GetNumRbPerRbg() const
virtual void SetCurrentSfn(const SfnSf &sfn)
Set the current sfn.
virtual void DoSlotUlIndication(const SfnSf &sfnSf, LteNrTddSlotType type)
Perform UL scheduling decision for the indicated slot.
virtual uint8_t GetDlCtrlSyms() const
Retrieve the number of DL ctrl symbols configured in the scheduler.
void DoDispose() override
DoDispose method inherited from Object.
virtual void CschedCellConfigReq(const struct CschedCellConfigReqParameters ¶ms)=0
CSCHED_CELL_CONFIG_REQ.
virtual void SchedDlRachInfoReq(const SchedDlRachInfoReqParameters ¶ms)=0
SCHED_DL_RACH_INFO_REQ.
virtual uint8_t GetDlCtrlSyms() const =0
Retrieve the number of DL ctrl symbols configured in the scheduler.
virtual void SchedUlSrInfoReq(const SchedUlSrInfoReqParameters ¶ms)=0
Provides scheduling request reception information to the scheduler.
virtual void SchedUlTriggerReq(const struct SchedUlTriggerReqParameters ¶ms)=0
Starts the UL MAC scheduler for this subframe.
virtual void SchedDlTriggerReq(const struct SchedDlTriggerReqParameters ¶ms)=0
Starts the DL MAC scheduler for this subframe.
virtual uint8_t GetUlCtrlSyms() const =0
Retrieve the number of UL ctrl symbols configured in the scheduler.
virtual BeamId GetBeamId(uint8_t rnti) const =0
Get the beam ID from the RNTI specified. Not in any standard.
virtual void SendMacPdu(const Ptr< Packet > &p, const SfnSf &sfn, uint8_t symStart, uint16_t rnti)=0
Send a Mac PDU.
virtual uint16_t GetCellId() const =0
Retrieve the cell id.
virtual uint32_t GetRbNum() const =0
Retrieve the number of resource blocks.
virtual void SetSlotAllocInfo(const SlotAllocInfo &slotAllocInfo)=0
Set a SlotAllocInfo inside the PHY allocations.
virtual uint16_t GetBwpId() const =0
Retrieve the bandwidth part id.
uint8_t GetNumerology() const
GetNumerology.
static double fpS11dot3toDouble(uint16_t val)
LteNrTddSlotType
Available TDD slot types. Ordering is important.
NrSchedulingCallbackInfo structure.
uint32_t m_tbSize
TB size.
uint8_t m_ndi
New data indicator.
uint8_t m_symStart
starting symbol index
uint8_t m_subframeNum
subframe number
uint16_t m_frameNum
frame number
uint8_t m_bwpId
Bandwidth Part ID.
uint16_t m_slotNum
slot number
uint8_t m_numSym
number of symbols
@ CTRL
Used for DL/UL CTRL.
@ SRS
Used for SRS (it would be like DCI format 2_3)
enum ns3::DlHarqInfo::HarqStatus NACK
HARQ status.
The SchedDlCqiInfoReqParameters struct.
std::vector< struct DlCqiInfo > m_cqiList
cqi list
std::vector< struct nr::RachListElement_s > m_rachList
RACH list.
DL HARQ information to be used when scheduling UL data.
std::vector< struct DlHarqInfo > m_dlHarqInfoList
DL HARQ info list.
LteNrTddSlotType m_slotType
Indicate the type of slot requested.
The SchedUlMacCtrlInfoReqParameters struct.
std::vector< struct MacCeElement > m_macCeList
MacCeElement list.
SR received from MAC, to pass to schedulers.
std::vector< uint16_t > m_srList
List of RNTI which asked for a SR.
SfnSf m_snfSf
SnfSf in which the sr where received.
UL HARQ information to be used when scheduling UL data.
std::vector< struct UlHarqInfo > m_ulHarqInfoList
UL HARQ info list.
LteNrTddSlotType m_slotType
Indicate the type of slot requested.
The SlotAllocInfo struct.
QosBearerType_e
QosBearerType enum.