26 #include <ns3/boolean.h>
29 #include <ns3/pointer.h>
30 #include <ns3/simulator.h>
52 : m_cschedSapUser(nullptr),
53 m_schedSapUser(nullptr),
57 m_amc = CreateObject<LteAmc>();
86 TypeId(
"ns3::RrFfMacScheduler")
90 .AddAttribute(
"CqiTimerThreshold",
91 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
94 MakeUintegerChecker<uint32_t>())
95 .AddAttribute(
"HarqEnabled",
96 "Activate/Deactivate the HARQ [by default is active].",
100 .AddAttribute(
"UlGrantMcs",
101 "The MCS of the UL grant, must be [0..15] (default 0)",
104 MakeUintegerChecker<uint8_t>());
162 << (uint16_t)
params.m_transmissionMode);
170 dlHarqPrcStatus.resize(8, 0);
173 dlHarqProcessesTimer.resize(8, 0);
179 dlHarqRlcPdu.resize(2);
180 dlHarqRlcPdu.at(0).resize(8);
181 dlHarqRlcPdu.at(1).resize(8);
185 ulHarqPrcStatus.resize(8, 0);
193 (*it).second =
params.m_transmissionMode;
210 for (std::size_t i = 0; i <
params.m_logicalChannelIdentity.size(); i++)
215 if (((*it).m_rnti ==
params.m_rnti) &&
216 ((*it).m_logicalChannelIdentity ==
params.m_logicalChannelIdentity.at(i)))
247 if ((*it).m_rnti ==
params.m_rnti)
249 NS_LOG_INFO(
this <<
" Erase RNTI " << (*it).m_rnti <<
" LC "
250 << (uint16_t)(*it).m_logicalChannelIdentity);
280 if (((*it).m_rnti ==
params.m_rnti) &&
281 ((*it).m_logicalChannelIdentity ==
params.m_logicalChannelIdentity))
294 << (uint16_t)
params.m_logicalChannelIdentity <<
" RLC tx size "
295 <<
params.m_rlcTransmissionQueueSize <<
" RLC retx size "
296 <<
params.m_rlcRetransmissionQueueSize <<
" RLC stat size "
297 <<
params.m_rlcStatusPduSize);
326 for (
int i = 0; i < 4; i++)
357 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
359 uint8_t i = (*it).second;
363 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
365 return (*itStat).second.at(i) == 0;
386 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
388 uint8_t i = (*it).second;
392 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
393 if ((*itStat).second.at(i) == 0)
396 (*itStat).second.at(i) = 1;
420 NS_LOG_INFO(
this <<
" Reset HARQ proc " << i <<
" for RNTI " << (*itTimers).first);
425 << (*itTimers).first);
427 (*itStat).second.at(i) = 0;
428 (*itTimers).second.at(i) = 0;
432 (*itTimers).second.at(i)++;
443 << (0xF &
params.m_sfnSf));
452 std::vector<bool> rbgMap;
453 uint16_t rbgAllocatedNum = 0;
454 std::set<uint16_t> rntiAllocated;
462 (*itProcId).second = ((*itProcId).second + 1) %
HARQ_PROC_NUM;
467 uint16_t rbStart = 0;
471 (*itRach).m_estimatedSize,
472 " Default UL Grant MCS does not allow to send RACH messages");
474 newRar.
m_rnti = (*itRach).m_rnti;
481 uint16_t tbSizeBits = 0;
483 while ((tbSizeBits < (*itRach).m_estimatedSize) &&
489 if (tbSizeBits < (*itRach).m_estimatedSize)
501 NS_LOG_INFO(
this <<
" UL grant allocated to RNTI " << (*itRach).m_rnti <<
" rbStart "
502 << rbStart <<
" rbLen " << rbLen <<
" MCS " << (uint16_t)
m_ulGrantMcs
504 for (uint16_t i = rbStart; i < rbStart + rbLen; i++)
537 harqId = (*itProcId).second;
541 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
544 (*itDci).second.at(harqId) = uldci;
547 rbStart = rbStart + rbLen;
557 if (!
params.m_dlInfoList.empty())
561 params.m_dlInfoList.begin(),
562 params.m_dlInfoList.end());
567 if (!
params.m_dlInfoList.empty())
577 std::vector<DlInfoListElement_s> dlInfoListUntxed;
581 if (itRnti != rntiAllocated.end())
587 std::vector<bool> retx;
588 NS_LOG_INFO(
this <<
" Processing DLHARQ feedback");
593 retx.push_back(
false);
602 if (retx.at(0) || retx.at(1))
607 NS_LOG_INFO(
this <<
" HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId);
616 if (dci.
m_rv.size() == 1)
628 NS_LOG_INFO(
"Max number of retransmissions reached -> drop process");
632 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
635 (*it).second.at(harqId) = 0;
639 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
642 for (std::size_t
k = 0;
k < (*itRlcPdu).second.size();
k++)
644 (*itRlcPdu).second.at(
k).at(harqId).clear();
650 std::vector<int> dciRbg;
653 for (
int j = 0; j < 32; j++)
663 for (std::size_t j = 0; j < dciRbg.size(); j++)
665 if (rbgMap.at(dciRbg.at(j)))
675 for (std::size_t j = 0; j < dciRbg.size(); j++)
677 rbgMap.at(dciRbg.at(j)) =
true;
678 NS_LOG_INFO(
"RBG " << dciRbg.at(j) <<
" assigned");
682 NS_LOG_INFO(
this <<
" Send retx in the same RBGs");
688 uint8_t rbgId = (dciRbg.at(dciRbg.size() - 1) + 1) % rbgNum;
689 uint8_t startRbg = dciRbg.at(dciRbg.size() - 1);
690 std::vector<bool> rbgMapCopy = rbgMap;
691 while ((j < dciRbg.size()) && (startRbg != rbgId))
693 if (!rbgMapCopy.at(rbgId))
695 rbgMapCopy.at(rbgId) =
true;
696 dciRbg.at(j) = rbgId;
699 rbgId = (rbgId + 1) % rbgNum;
701 if (j == dciRbg.size())
704 uint32_t rbgMask = 0;
705 for (std::size_t
k = 0;
k < dciRbg.size();
k++)
707 rbgMask = rbgMask + (0x1 << dciRbg.at(
k));
708 NS_LOG_INFO(
this <<
" New allocated RBG " << dciRbg.at(
k));
718 NS_LOG_INFO(
this <<
" No resource for this retx -> buffer it");
726 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI " << rnti);
728 for (std::size_t j = 0; j < nLayers; j++)
732 if (j >= dci.
m_ndi.size())
735 dci.
m_ndi.push_back(0);
736 dci.
m_rv.push_back(0);
737 dci.
m_mcs.push_back(0);
740 <<
" no txed (MIMO transition)");
746 (*itHarq).second.at(harqId).m_rv.at(j)++;
747 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" RV "
748 << (uint16_t)dci.
m_rv.at(j));
758 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" no retx");
762 for (std::size_t
k = 0;
k < (*itRlcPdu).second.at(0).at(dci.
m_harqProcess).size();
k++)
764 std::vector<RlcPduListElement_s> rlcPduListPerLc;
765 for (std::size_t j = 0; j < nLayers; j++)
769 if (j < dci.
m_ndi.size())
771 NS_LOG_INFO(
" layer " << (uint16_t)j <<
" tb size "
773 rlcPduListPerLc.push_back(
786 .m_logicalChannelIdentity;
788 rlcPduListPerLc.push_back(emptyElement);
792 if (!rlcPduListPerLc.empty())
799 (*itHarq).second.at(harqId).
m_rv = dci.
m_rv;
804 NS_FATAL_ERROR(
"Unable to find HARQ timer for RNTI " << (uint16_t)rnti);
806 (*itHarqTimer).second.at(harqId) = 0;
808 rntiAllocated.insert(rnti);
825 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
828 for (std::size_t
k = 0;
k < (*itRlcPdu).second.size();
k++)
837 if (rbgAllocatedNum == rbgNum)
848 std::list<FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
852 std::map<uint16_t, uint8_t> lcActivesPerRnti;
856 auto itRnti = rntiAllocated.find((*it).m_rnti);
857 if ((((*it).m_rlcTransmissionQueueSize > 0) || ((*it).m_rlcRetransmissionQueueSize > 0) ||
858 ((*it).m_rlcStatusPduSize > 0)) &&
859 (itRnti == rntiAllocated.end())
864 << (uint16_t)(*it).m_logicalChannelIdentity <<
" is active, status "
865 << (*it).m_rlcStatusPduSize <<
" retx "
866 << (*it).m_rlcRetransmissionQueueSize <<
" tx "
867 << (*it).m_rlcTransmissionQueueSize);
872 cqi = (*itCqi).second;
882 auto itLcRnti = lcActivesPerRnti.find((*it).m_rnti);
883 if (itLcRnti != lcActivesPerRnti.end())
885 (*itLcRnti).second++;
889 lcActivesPerRnti[(*it).m_rnti] = 1;
907 int rbgPerTb = (nTbs > 0) ? ((rbgNum - rbgAllocatedNum) / nTbs) : INT_MAX;
908 NS_LOG_INFO(
this <<
" Flows to be transmitted " << nflows <<
" rbgPerTb " << rbgPerTb);
913 int rbgAllocated = 0;
947 auto itLcRnti = lcActivesPerRnti.find((*it).m_rnti);
948 auto itRnti = rntiAllocated.find((*it).m_rnti);
949 if ((itLcRnti == lcActivesPerRnti.end()) || (itRnti != rntiAllocated.end()))
952 uint16_t rntiDiscarded = (*it).m_rnti;
955 if ((*it).m_rnti != rntiDiscarded)
971 NS_FATAL_ERROR(
"No Transmission Mode info on user " << (*it).m_rnti);
974 int lcNum = (*itLcRnti).second;
977 newEl.
m_rnti = (*it).m_rnti;
980 newDci.
m_rnti = (*it).m_rnti;
985 for (uint8_t i = 0; i < nLayer; i++)
989 newDci.
m_mcs.push_back(0);
993 newDci.
m_mcs.push_back(
m_amc->GetMcsFromCqi((*itCqi).second));
996 int tbSize = (
m_amc->GetDlTbSizeFromMcs(newDci.
m_mcs.at(0), rbgPerTb * rbgSize) / 8);
997 uint16_t rlcPduSize = tbSize / lcNum;
998 while ((*it).m_rnti == newEl.
m_rnti)
1000 if (((*it).m_rlcTransmissionQueueSize > 0) ||
1001 ((*it).m_rlcRetransmissionQueueSize > 0) || ((*it).m_rlcStatusPduSize > 0))
1003 std::vector<RlcPduListElement_s> newRlcPduLe;
1004 for (uint8_t j = 0; j < nLayer; j++)
1009 <<
" size " << rlcPduSize <<
" ID " << (*it).m_rnti
1010 <<
" layer " << (uint16_t)j);
1011 newRlcEl.
m_size = rlcPduSize;
1015 newRlcPduLe.push_back(newRlcEl);
1023 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
1026 (*itRlcPdu).second.at(j).at(newDci.
m_harqProcess).push_back(newRlcEl);
1040 uint32_t rbgMask = 0;
1043 << (uint16_t)(*itLcRnti).second <<
" bytes " << tbSize <<
" mcs "
1044 << (uint16_t)newDci.
m_mcs.at(0) <<
" harqId "
1047 while (i < rbgPerTb)
1049 if (!rbgMap.at(rbgAllocated))
1051 rbgMask = rbgMask + (0x1 << rbgAllocated);
1054 rbgMap.at(rbgAllocated) =
true;
1061 for (std::size_t i = 0; i < nLayer; i++)
1064 newDci.
m_ndi.push_back(1);
1065 newDci.
m_rv.push_back(0);
1070 newEl.
m_dci = newDci;
1077 NS_FATAL_ERROR(
"Unable to find RNTI entry in DCI HARQ buffer for RNTI "
1092 if (rbgAllocatedNum == rbgNum)
1119 for (
unsigned int i = 0; i <
params.m_cqiList.size(); i++)
1125 uint16_t rnti =
params.m_cqiList.at(i).m_rnti;
1131 params.m_cqiList.at(i).m_wbCqi.at(0);
1138 (*it).second =
params.m_cqiList.at(i).m_wbCqi.at(0);
1161 << (0xF &
params.m_sfnSf) <<
" size " <<
params.m_ulInfoList.size());
1167 std::vector<bool> rbMap;
1168 std::set<uint16_t> rntiAllocated;
1169 std::vector<uint16_t> rbgAllocationMap;
1180 if (rbgAllocationMap.at(i) != 0)
1190 for (std::size_t i = 0; i <
params.m_ulInfoList.size(); i++)
1195 uint16_t rnti =
params.m_ulInfoList.at(i).m_rnti;
1199 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1202 NS_LOG_INFO(
this <<
" UL-HARQ retx RNTI " << rnti <<
" harqId "
1203 << (uint16_t)harqId);
1207 NS_LOG_ERROR(
"No info find in UL-HARQ buffer for UE (might change eNB) "
1214 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1216 if ((*itStat).second.at(harqId) >= 3)
1218 NS_LOG_INFO(
"Max number of retransmissions reached (UL)-> drop process");
1236 rbgAllocationMap.at(j) = dci.
m_rnti;
1241 << (*itStat).second.at(harqId) + 1);
1245 NS_LOG_INFO(
"Cannot allocate retx due to RACH allocations for UE " << rnti);
1250 (*itStat).second.at((*itProcId).second) = (*itStat).second.at(harqId) + 1;
1251 (*itStat).second.at(harqId) = 0;
1252 (*itHarq).second.at((*itProcId).second) = dci;
1254 rntiAllocated.insert(dci.
m_rnti);
1259 std::map<uint16_t, uint32_t>::iterator it;
1264 auto itRnti = rntiAllocated.find((*it).first);
1266 NS_LOG_INFO(
this <<
" UE " << (*it).first <<
" queue " << (*it).second);
1267 if (((*it).second > 0) && (itRnti == rntiAllocated.end()))
1291 uint16_t rbAllocated = 0;
1312 NS_LOG_INFO(
this <<
" NFlows " << nflows <<
" RB per Flow " << rbPerFlow);
1315 auto itRnti = rntiAllocated.find((*it).first);
1316 if ((itRnti != rntiAllocated.end()) || ((*it).second == 0))
1338 NS_LOG_INFO(
this <<
" try to allocate " << (*it).first);
1340 uldci.
m_rnti = (*it).first;
1342 bool allocated =
false;
1343 NS_LOG_INFO(
this <<
" RB Allocated " << rbAllocated <<
" rbPerFlow " << rbPerFlow
1344 <<
" flows " << nflows);
1350 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1362 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1366 rbgAllocationMap.at(j) = (*it).first;
1369 rbAllocated += rbPerFlow;
1397 auto itCqi =
m_ueCqi.find((*it).first);
1403 NS_LOG_INFO(
this <<
" UE does not have ULCQI " << (*it).first);
1409 "CQI of RNTI = " << (*it).first <<
" has expired");
1410 double minSinr = (*itCqi).second.at(uldci.
m_rbStart);
1413 if ((*itCqi).second.at(i) < minSinr)
1415 minSinr = (*itCqi).second.at(i);
1419 double s = log2(1 + (std::pow(10, minSinr / 10) / ((-std::log(5.0 * 0.00005)) / 1.5)));
1421 cqi =
m_amc->GetCqiFromSpectralEfficiency(s);
1434 rbgAllocationMap.at(i) = 0;
1441 (
m_amc->GetUlTbSizeFromMcs(uldci.
m_mcs, rbPerFlow) / 8);
1466 harqId = (*itProcId).second;
1470 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
1473 (*itDci).second.at(harqId) = uldci;
1478 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
1481 (*itStat).second.at(harqId) = 0;
1484 NS_LOG_INFO(
this <<
" UL Allocation - UE " << (*it).first <<
" startPRB "
1486 <<
" CQI " << cqi <<
" MCS " << (uint32_t)uldci.
m_mcs <<
" TBsize "
1487 << uldci.
m_tbSize <<
" harqId " << (uint16_t)harqId);
1501 }
while (((*it).first !=
m_nextRntiUl) && (rbPerFlow != 0));
1528 for (
unsigned int i = 0; i <
params.m_macCeList.size(); i++)
1539 uint32_t buffer = 0;
1540 for (uint8_t lcg = 0; lcg < 4; ++lcg)
1542 uint8_t bsrId =
params.m_macCeList.at(i).m_macCeValue.m_bufferStatus.at(lcg);
1546 uint16_t rnti =
params.m_macCeList.at(i).m_rnti;
1552 NS_LOG_INFO(
this <<
" Insert RNTI " << rnti <<
" queue " << buffer);
1557 (*it).second = buffer;
1558 NS_LOG_INFO(
this <<
" Update RNTI " << rnti <<
" queue " << buffer);
1591 switch (
params.m_ulCqi.m_type)
1597 NS_LOG_INFO(
this <<
" Does not find info on allocation, size : "
1601 for (uint32_t i = 0; i < (*itMap).second.size(); i++)
1605 auto itCqi =
m_ueCqi.find((*itMap).second.at(i));
1609 std::vector<double> newCqi;
1614 newCqi.push_back(sinr);
1619 newCqi.push_back(30.0);
1622 m_ueCqi[(*itMap).second.at(i)] = newCqi;
1629 (*itCqi).second.at(i) = sinr;
1643 for (std::size_t i = 0; i <
params.m_vendorSpecificList.size(); i++)
1648 DynamicCast<SrsCqiRntiVsp>(
params.m_vendorSpecificList.at(i).m_value);
1649 rnti = vsp->GetRnti();
1652 auto itCqi =
m_ueCqi.find(rnti);
1656 std::vector<double> newCqi;
1660 newCqi.push_back(sinr);
1661 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value "
1674 (*itCqi).second.at(j) = sinr;
1675 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value "
1687 NS_FATAL_ERROR(
"PfFfMacScheduler supports only PUSCH and SRS UL-CQIs");
1703 NS_LOG_INFO(
this <<
" P10-CQI for user " << (*itP10).first <<
" is "
1705 if ((*itP10).second == 0)
1710 " Does not find CQI report for user " << (*itP10).first);
1711 NS_LOG_INFO(
this <<
" P10-CQI exired for user " << (*itP10).first);
1732 NS_LOG_INFO(
this <<
" UL-CQI for user " << (*itUl).first <<
" is "
1734 if ((*itUl).second == 0)
1737 auto itMap =
m_ueCqi.find((*itUl).first);
1739 " Does not find CQI report for user " << (*itUl).first);
1740 NS_LOG_INFO(
this <<
" UL-CQI exired for user " << (*itUl).first);
1741 (*itMap).second.clear();
1761 if (((*it).m_rnti == rnti) && ((*it).m_logicalChannelIdentity == lcid))
1763 NS_LOG_INFO(
this <<
" UE " << rnti <<
" LC " << (uint16_t)lcid <<
" txqueue "
1764 << (*it).m_rlcTransmissionQueueSize <<
" retxqueue "
1765 << (*it).m_rlcRetransmissionQueueSize <<
" status "
1766 << (*it).m_rlcStatusPduSize <<
" decrease " << size);
1769 if (((*it).m_rlcStatusPduSize > 0) && (size >= (*it).m_rlcStatusPduSize))
1771 (*it).m_rlcStatusPduSize = 0;
1773 else if (((*it).m_rlcRetransmissionQueueSize > 0) &&
1774 (size >= (*it).m_rlcRetransmissionQueueSize))
1776 (*it).m_rlcRetransmissionQueueSize = 0;
1778 else if ((*it).m_rlcTransmissionQueueSize > 0)
1780 uint32_t rlcOverhead;
1795 if ((*it).m_rlcTransmissionQueueSize <= size - rlcOverhead)
1797 (*it).m_rlcTransmissionQueueSize = 0;
1801 (*it).m_rlcTransmissionQueueSize -= size - rlcOverhead;
1816 NS_LOG_INFO(
this <<
" Update RLC BSR UE " << rnti <<
" size " << size <<
" BSR "
1818 if ((*it).second >= size)
1820 (*it).second -= size;
1829 NS_LOG_ERROR(
this <<
" Does not find BSR report info of UE " << rnti);
1836 NS_LOG_FUNCTION(
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);
1839 params.m_transmissionMode = txMode;
static uint32_t BsrId2BufferSize(uint8_t val)
Convert BSR ID to buffer size.
FfMacCschedSapUser class.
virtual void CschedUeConfigCnf(const CschedUeConfigCnfParameters ¶ms)=0
CSCHED_UE_CONFIG_CNF.
virtual void CschedUeConfigUpdateInd(const CschedUeConfigUpdateIndParameters ¶ms)=0
CSCHED_UE_UPDATE_IND.
virtual void SchedUlConfigInd(const SchedUlConfigIndParameters ¶ms)=0
SCHED_UL_CONFIG_IND.
virtual void SchedDlConfigInd(const SchedDlConfigIndParameters ¶ms)=0
SCHED_DL_CONFIG_IND.
This abstract base class identifies the interface by means of which the helper object can plug on the...
UlCqiFilter_t m_ulCqiFilter
UL CQI filter.
static double fpS11dot3toDouble(uint16_t val)
Convert from fixed point S11.3 notation to double.
Service Access Point (SAP) offered by the Frequency Reuse algorithm instance to the MAC Scheduler ins...
Service Access Point (SAP) offered by the eNodeB RRC instance to the Frequency Reuse algorithm instan...
Smart pointer class similar to boost::intrusive_ptr.
Implements the SCHED SAP and CSCHED SAP for a Round Robin scheduler.
friend class MemberCschedSapProvider< RrFfMacScheduler >
allow MemberCschedSapProvider<RrFfMacScheduler> class friend access
std::map< uint16_t, std::vector< uint16_t > > m_allocationMaps
Map of previous allocated UE per RBG (used to retrieve info from UL-CQI)
void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters ¶ms)
Sched DL RLC buffer request.
void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ¶ms)
Sched UL CQI info request.
std::map< uint16_t, uint8_t > m_uesTxMode
txMode of the UEs
bool HarqProcessAvailability(uint16_t rnti)
Return the availability of free process for the RNTI specified.
RrFfMacScheduler()
Constructor.
void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters ¶ms)
Sched DL trigger request.
friend class MemberSchedSapProvider< RrFfMacScheduler >
allow MemberSchedSapProvider<RrFfMacScheduler> class friend access
void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters ¶ms)
CSched LC release request.
std::map< uint16_t, DlHarqProcessesStatus_t > m_dlHarqProcessesStatus
DL HARQ process status.
void DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters ¶ms)
CSched LC config request.
void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters ¶ms)
Sched UL SRS info request.
~RrFfMacScheduler() override
Destructor.
std::map< uint16_t, uint8_t > m_p10CqiRxed
Map of UE's DL CQI P01 received.
FfMacSchedSapUser * m_schedSapUser
Sched SAP user.
FfMacSchedSapProvider * m_schedSapProvider
Sched SAP provider.
void SetFfMacCschedSapUser(FfMacCschedSapUser *s) override
set the user part of the FfMacCschedSap that this Scheduler will interact with.
void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters ¶ms)
CSched UE config request.
std::map< uint16_t, uint32_t > m_ceBsrRxed
Map of UE's buffer status reports received.
uint8_t UpdateHarqProcessId(uint16_t rnti)
Update and return a new process Id for the RNTI specified.
LteFfrSapUser * m_ffrSapUser
FFR SAP user.
uint32_t m_cqiTimersThreshold
LteFfrSapUser * GetLteFfrSapUser() override
std::map< uint16_t, DlHarqProcessesTimer_t > m_dlHarqProcessesTimer
DL HARQ process timer.
void DoSchedUlMacCtrlInfoReq(const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters ¶ms)
Sched UL MAC control info request.
void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size)
Update DL RLC buffer info function.
void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters ¶ms)
Sched UL trigger request.
void DoSchedUlNoiseInterferenceReq(const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters ¶ms)
Sched UL noise interference request.
std::vector< uint16_t > m_rachAllocationMap
RACH allocation map.
std::map< uint16_t, uint32_t > m_p10CqiTimers
Map of UE's timers on DL CQI P01 received.
LteFfrSapProvider * m_ffrSapProvider
FFR SAP provider.
FfMacCschedSapProvider * m_cschedSapProvider
CSched SAP provider.
int GetRbgSize(int dlbandwidth)
Get RBG size function.
void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters ¶ms)
Sched DL MAC buffer request.
std::map< uint16_t, DlHarqProcessesDciBuffer_t > m_dlHarqProcessesDciBuffer
DL HARQ process DCI buffer.
FfMacCschedSapUser * m_cschedSapUser
CSched SAP user.
std::map< uint16_t, uint8_t > m_dlHarqCurrentProcessId
DL HARQ current process ID.
std::map< uint16_t, std::vector< double > > m_ueCqi
Map of UEs' UL-CQI per RBG.
void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters ¶ms)
CSched UE release request.
std::list< FfMacSchedSapProvider::SchedDlRlcBufferReqParameters > m_rlcBufferReq
Vectors of UE's RLC info.
std::map< uint16_t, UlHarqProcessesStatus_t > m_ulHarqProcessesStatus
UL HARQ process status.
uint16_t m_nextRntiDl
RNTI of the next user to be served next scheduling in DL.
FfMacCschedSapProvider::CschedCellConfigReqParameters m_cschedCellConfig
CSched cell config.
std::vector< RachListElement_s > m_rachList
RACH list.
static bool SortRlcBufferReq(FfMacSchedSapProvider::SchedDlRlcBufferReqParameters i, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters j)
Sort RLC buffer request function.
void RefreshHarqProcesses()
Refresh HARQ processes according to the timers.
void RefreshDlCqiMaps()
Refresh DL CQI maps function.
std::map< uint16_t, DlHarqRlcPduListBuffer_t > m_dlHarqProcessesRlcPduListBuffer
DL HARQ process RLC PDU list buffer.
FfMacCschedSapProvider * GetFfMacCschedSapProvider() override
void SetLteFfrSapProvider(LteFfrSapProvider *s) override
Set the Provider part of the LteFfrSap that this Scheduler will interact with.
bool m_harqOn
m_harqOn when false inhibit the HARQ mechanisms (by default active)
void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)
Sched DL CQI info request.
void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters ¶ms)
CSched cell config request.
void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode)
Transmission mode configuration update function.
uint8_t m_ulGrantMcs
MCS for UL grant (default 0)
static TypeId GetTypeId()
Get the type ID.
std::map< uint16_t, uint32_t > m_ueCqiTimers
Map of UEs' timers on UL-CQI per RBG.
std::map< uint16_t, uint8_t > m_ulHarqCurrentProcessId
UL HARQ current process ID.
void DoSchedDlPagingBufferReq(const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters ¶ms)
Sched DL paging buffer request.
std::vector< DlInfoListElement_s > m_dlInfoListBuffered
HARQ retx buffered.
std::map< uint16_t, UlHarqProcessesDciBuffer_t > m_ulHarqProcessesDciBuffer
UL HARQ process DCI buffer.
void SetFfMacSchedSapUser(FfMacSchedSapUser *s) override
set the user part of the FfMacSchedSap that this Scheduler will interact with.
FfMacSchedSapProvider * GetFfMacSchedSapProvider() override
void RefreshUlCqiMaps()
Refresh UL CQI maps function.
void DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters ¶ms)
Sched DL RACH info request.
void DoDispose() override
Destructor implementation.
void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size)
Update UL RLC buffer info function.
uint16_t m_nextRntiUl
RNTI of the next user to be served next scheduling in UL.
static uint8_t TxMode2LayerNum(uint8_t txMode)
Transmit mode 2 layer number.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Hold an unsigned integer type.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeBooleanChecker()
std::vector< UlDciListElement_s > UlHarqProcessesDciBuffer_t
UL HARQ process DCI buffer vector.
std::vector< RlcPduList_t > DlHarqRlcPduListBuffer_t
Vector of the 8 HARQ processes per UE.
constexpr uint32_t HARQ_DL_TIMEOUT
HARQ DL timeout.
constexpr uint32_t HARQ_PROC_NUM
Number of HARQ processes.
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
std::vector< DlDciListElement_s > DlHarqProcessesDciBuffer_t
DL HARQ process DCI buffer vector.
std::vector< uint8_t > UlHarqProcessesStatus_t
UL HARQ process status vector.
std::vector< uint8_t > DlHarqProcessesTimer_t
DL HARQ process timer vector.
static const int Type0AllocationRbg[4]
Type 0 RGB allocation.
std::vector< uint8_t > DlHarqProcessesStatus_t
DL HARQ process status vector.
params
Fit Fluctuating Two Ray model to the 3GPP TR 38.901 using the Anderson-Darling goodness-of-fit ##.
See section 4.3.8 buildDataListElement.
std::vector< std::vector< struct RlcPduListElement_s > > m_rlcPduList
RLC PDU list.
struct DlDciListElement_s m_dci
DCI.
See section 4.3.10 buildRARListElement.
See section 4.3.1 dlDciListElement.
std::vector< uint8_t > m_ndi
New data indicator.
uint8_t m_harqProcess
HARQ process.
uint32_t m_rbBitmap
RB bitmap.
std::vector< uint8_t > m_mcs
MCS.
uint8_t m_resAlloc
The type of resource allocation.
std::vector< uint16_t > m_tbsSize
The TBs size.
std::vector< uint8_t > m_rv
Redundancy version.
uint8_t m_tpc
Tx power control command.
Parameters of the API primitives.
uint16_t m_dlBandwidth
DL bandwidth.
uint16_t m_ulBandwidth
UL bandwidth.
Parameters of the CSCHED_LC_CONFIG_REQ primitive.
Parameters of the CSCHED_LC_RELEASE_REQ primitive.
Parameters of the CSCHED_UE_CONFIG_REQ primitive.
Parameters of the CSCHED_UE_RELEASE_REQ primitive.
Parameters of the CSCHED_UE_CONFIG_CNF primitive.
Parameters of the CSCHED_UE_CONFIG_UPDATE_IND primitive.
Parameters of the SCHED_DL_CQI_INFO_REQ primitive.
Parameters of the SCHED_DL_MAC_BUFFER_REQ primitive.
Parameters of the SCHED_DL_PAGING_BUFFER_REQ primitive.
Parameters of the SCHED_DL_RACH_INFO_REQ primitive.
Parameters of the API primitives.
Parameters of the SCHED_DL_TRIGGER_REQ primitive.
Parameters of the SCHED_UL_CQI_INFO_REQ primitive.
Parameters of the SCHED_UL_MAC_CTRL_INFO_REQ primitive.
Parameters of the SCHED_UL_NOISE_INTERFERENCE_REQ primitive.
Parameters of the SCHED_UL_SR_INFO_REQ primitive.
Parameters of the SCHED_UL_TRIGGER_REQ primitive.
Parameters of the API primitives.
std::vector< BuildDataListElement_s > m_buildDataList
build data list
std::vector< BuildRarListElement_s > m_buildRarList
build rar list
uint8_t m_nrOfPdcchOfdmSymbols
number of PDCCH OFDM symbols
Parameters of the SCHED_UL_CONFIG_IND primitive.
std::vector< UlDciListElement_s > m_dciList
DCI list.
See section 4.3.9 rlcPDU_ListElement.
uint8_t m_logicalChannelIdentity
logical channel identity
See section 4.3.2 ulDciListElement.
int8_t m_pdcchPowerOffset
CCH power offset.
int8_t m_tpc
Tx power control command.
uint8_t m_dai
DL assignment index.
uint8_t m_cceIndex
Control Channel Element index.
uint8_t m_ulIndex
UL index.
uint8_t m_ueTxAntennaSelection
UE antenna selection.
bool m_cqiRequest
CQI request.
uint8_t m_freqHopping
freq hopping
uint8_t m_aggrLevel
The aggregation level.
int8_t m_tpc
Tx power control command.
bool m_cqiRequest
CQI request?