15#include "ns3/boolean.h"
18#include "ns3/pointer.h"
19#include "ns3/simulator.h"
75 TypeId(
"ns3::RrFfMacScheduler")
79 .AddAttribute(
"CqiTimerThreshold",
80 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
84 .AddAttribute(
"HarqEnabled",
85 "Activate/Deactivate the HARQ [by default is active].",
89 .AddAttribute(
"UlGrantMcs",
90 "The MCS of the UL grant, must be [0..15] (default 0)",
151 << (uint16_t)params.m_transmissionMode);
155 m_uesTxMode[params.m_rnti] = params.m_transmissionMode;
159 dlHarqPrcStatus.resize(8, 0);
162 dlHarqProcessesTimer.resize(8, 0);
168 dlHarqRlcPdu.resize(2);
169 dlHarqRlcPdu.at(0).resize(8);
170 dlHarqRlcPdu.at(1).resize(8);
174 ulHarqPrcStatus.resize(8, 0);
182 (*it).second = params.m_transmissionMode;
199 for (std::size_t i = 0; i < params.m_logicalChannelIdentity.size(); i++)
204 if (((*it).m_rnti == params.m_rnti) &&
205 ((*it).m_logicalChannelIdentity == params.m_logicalChannelIdentity.at(i)))
236 if ((*it).m_rnti == params.m_rnti)
238 NS_LOG_INFO(
this <<
" Erase RNTI " << (*it).m_rnti <<
" LC "
239 << (uint16_t)(*it).m_logicalChannelIdentity);
269 if (((*it).m_rnti == params.m_rnti) &&
270 ((*it).m_logicalChannelIdentity == params.m_logicalChannelIdentity))
282 NS_LOG_INFO(
this <<
" RNTI " << params.m_rnti <<
" LC "
283 << (uint16_t)params.m_logicalChannelIdentity <<
" RLC tx size "
284 << params.m_rlcTransmissionQueueSize <<
" RLC retx size "
285 << params.m_rlcRetransmissionQueueSize <<
" RLC stat size "
286 << params.m_rlcStatusPduSize);
315 for (
int i = 0; i < 4; i++)
346 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
348 uint8_t i = (*it).second;
352 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
354 return (*itStat).second.at(i) == 0;
375 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
377 uint8_t i = (*it).second;
381 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
382 if ((*itStat).second.at(i) == 0)
385 (*itStat).second.at(i) = 1;
409 NS_LOG_INFO(
this <<
" Reset HARQ proc " << i <<
" for RNTI " << (*itTimers).first);
414 << (*itTimers).first);
416 (*itStat).second.at(i) = 0;
417 (*itTimers).second.at(i) = 0;
421 (*itTimers).second.at(i)++;
431 NS_LOG_FUNCTION(
this <<
" DL Frame no. " << (params.m_sfnSf >> 4) <<
" subframe no. "
432 << (0xF & params.m_sfnSf));
441 std::vector<bool> rbgMap;
442 uint16_t rbgAllocatedNum = 0;
443 std::set<uint16_t> rntiAllocated;
451 (*itProcId).second = ((*itProcId).second + 1) %
HARQ_PROC_NUM;
456 uint16_t rbStart = 0;
460 (*itRach).m_estimatedSize,
461 " Default UL Grant MCS does not allow to send RACH messages");
463 newRar.
m_rnti = (*itRach).m_rnti;
470 uint16_t tbSizeBits = 0;
472 while ((tbSizeBits < (*itRach).m_estimatedSize) &&
478 if (tbSizeBits < (*itRach).m_estimatedSize)
490 NS_LOG_INFO(
this <<
" UL grant allocated to RNTI " << (*itRach).m_rnti <<
" rbStart "
491 << rbStart <<
" rbLen " << rbLen <<
" MCS " << (uint16_t)
m_ulGrantMcs
493 for (uint16_t i = rbStart; i < rbStart + rbLen; i++)
526 harqId = (*itProcId).second;
530 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
533 (*itDci).second.at(harqId) = uldci;
536 rbStart = rbStart + rbLen;
546 if (!params.m_dlInfoList.empty())
550 params.m_dlInfoList.begin(),
551 params.m_dlInfoList.end());
556 if (!params.m_dlInfoList.empty())
566 std::vector<DlInfoListElement_s> dlInfoListUntxed;
570 if (itRnti != rntiAllocated.end())
576 std::vector<bool> retx;
578 NS_LOG_INFO(
this <<
" Processing DLHARQ feedback");
583 retx.push_back(
false);
592 if (retx.at(0) || retx.at(1))
597 NS_LOG_INFO(
this <<
" HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId);
606 if (dci.
m_rv.size() == 1)
618 NS_LOG_INFO(
"Max number of retransmissions reached -> drop process");
622 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
625 (*it).second.at(harqId) = 0;
629 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
632 for (std::size_t k = 0; k < (*itRlcPdu).second.size(); k++)
634 (*itRlcPdu).second.at(k).at(harqId).clear();
640 std::vector<int> dciRbg;
643 for (
int j = 0; j < 32; j++)
653 for (std::size_t j = 0; j < dciRbg.size(); j++)
655 if (rbgMap.at(dciRbg.at(j)))
665 for (std::size_t j = 0; j < dciRbg.size(); j++)
667 rbgMap.at(dciRbg.at(j)) =
true;
668 NS_LOG_INFO(
"RBG " << dciRbg.at(j) <<
" assigned");
672 NS_LOG_INFO(
this <<
" Send retx in the same RBGs");
678 uint8_t rbgId = (dciRbg.at(dciRbg.size() - 1) + 1) % rbgNum;
679 uint8_t startRbg = dciRbg.at(dciRbg.size() - 1);
680 std::vector<bool> rbgMapCopy = rbgMap;
681 while ((j < dciRbg.size()) && (startRbg != rbgId))
683 if (!rbgMapCopy.at(rbgId))
685 rbgMapCopy.at(rbgId) =
true;
686 dciRbg.at(j) = rbgId;
689 rbgId = (rbgId + 1) % rbgNum;
691 if (j == dciRbg.size())
695 for (std::size_t k = 0; k < dciRbg.size(); k++)
697 rbgMask = rbgMask + (0x1 << dciRbg.at(k));
698 NS_LOG_INFO(
this <<
" New allocated RBG " << dciRbg.at(k));
708 NS_LOG_INFO(
this <<
" No resource for this retx -> buffer it");
716 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI " << rnti);
718 for (std::size_t j = 0; j < nLayers; j++)
722 if (j >= dci.
m_ndi.size())
725 dci.
m_ndi.push_back(0);
726 dci.
m_rv.push_back(0);
727 dci.
m_mcs.push_back(0);
730 <<
" no txed (MIMO transition)");
736 (*itHarq).second.at(harqId).m_rv.at(j)++;
737 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" RV "
738 << (uint16_t)dci.
m_rv.at(j));
748 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" no retx");
752 for (std::size_t k = 0; k < (*itRlcPdu).second.at(0).at(dci.
m_harqProcess).size(); k++)
754 std::vector<RlcPduListElement_s> rlcPduListPerLc;
755 for (std::size_t j = 0; j < nLayers; j++)
759 if (j < dci.
m_ndi.size())
761 NS_LOG_INFO(
" layer " << (uint16_t)j <<
" tb size "
763 rlcPduListPerLc.push_back(
776 .m_logicalChannelIdentity;
778 rlcPduListPerLc.push_back(emptyElement);
782 if (!rlcPduListPerLc.empty())
789 (*itHarq).second.at(harqId).
m_rv = dci.
m_rv;
794 NS_FATAL_ERROR(
"Unable to find HARQ timer for RNTI " << (uint16_t)rnti);
796 (*itHarqTimer).second.at(harqId) = 0;
798 rntiAllocated.insert(rnti);
815 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
818 for (std::size_t k = 0; k < (*itRlcPdu).second.size(); k++)
827 if (rbgAllocatedNum == rbgNum)
838 std::list<FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
842 std::map<uint16_t, uint8_t> lcActivesPerRnti;
846 auto itRnti = rntiAllocated.find((*it).m_rnti);
847 if ((((*it).m_rlcTransmissionQueueSize > 0) || ((*it).m_rlcRetransmissionQueueSize > 0) ||
848 ((*it).m_rlcStatusPduSize > 0)) &&
849 (itRnti == rntiAllocated.end())
854 << (uint16_t)(*it).m_logicalChannelIdentity <<
" is active, status "
855 << (*it).m_rlcStatusPduSize <<
" retx "
856 << (*it).m_rlcRetransmissionQueueSize <<
" tx "
857 << (*it).m_rlcTransmissionQueueSize);
862 cqi = (*itCqi).second;
872 auto itLcRnti = lcActivesPerRnti.find((*it).m_rnti);
873 if (itLcRnti != lcActivesPerRnti.end())
875 (*itLcRnti).second++;
879 lcActivesPerRnti[(*it).m_rnti] = 1;
897 int rbgPerTb = (nTbs > 0) ? ((rbgNum - rbgAllocatedNum) / nTbs) : INT_MAX;
898 NS_LOG_INFO(
this <<
" Flows to be transmitted " << nflows <<
" rbgPerTb " << rbgPerTb);
903 int rbgAllocated = 0;
937 auto itLcRnti = lcActivesPerRnti.find((*it).m_rnti);
938 auto itRnti = rntiAllocated.find((*it).m_rnti);
939 if ((itLcRnti == lcActivesPerRnti.end()) || (itRnti != rntiAllocated.end()))
942 uint16_t rntiDiscarded = (*it).m_rnti;
945 if ((*it).m_rnti != rntiDiscarded)
961 NS_FATAL_ERROR(
"No Transmission Mode info on user " << (*it).m_rnti);
964 int lcNum = (*itLcRnti).second;
967 newEl.
m_rnti = (*it).m_rnti;
970 newDci.
m_rnti = (*it).m_rnti;
975 for (uint8_t i = 0; i < nLayer; i++)
979 newDci.
m_mcs.push_back(0);
983 newDci.
m_mcs.push_back(
m_amc->GetMcsFromCqi((*itCqi).second));
986 int tbSize = (
m_amc->GetDlTbSizeFromMcs(newDci.
m_mcs.at(0), rbgPerTb * rbgSize) / 8);
987 uint16_t rlcPduSize = tbSize / lcNum;
988 while ((*it).m_rnti == newEl.
m_rnti)
990 if (((*it).m_rlcTransmissionQueueSize > 0) ||
991 ((*it).m_rlcRetransmissionQueueSize > 0) || ((*it).m_rlcStatusPduSize > 0))
993 std::vector<RlcPduListElement_s> newRlcPduLe;
994 for (uint8_t j = 0; j < nLayer; j++)
999 <<
" size " << rlcPduSize <<
" ID " << (*it).m_rnti
1000 <<
" layer " << (uint16_t)j);
1001 newRlcEl.
m_size = rlcPduSize;
1005 newRlcPduLe.push_back(newRlcEl);
1013 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
1016 (*itRlcPdu).second.at(j).at(newDci.
m_harqProcess).push_back(newRlcEl);
1033 << (uint16_t)(*itLcRnti).second <<
" bytes " << tbSize <<
" mcs "
1034 << (uint16_t)newDci.
m_mcs.at(0) <<
" harqId "
1037 while (i < rbgPerTb)
1039 if (!rbgMap.at(rbgAllocated))
1041 rbgMask = rbgMask + (0x1 << rbgAllocated);
1044 rbgMap.at(rbgAllocated) =
true;
1051 for (std::size_t i = 0; i < nLayer; i++)
1054 newDci.
m_ndi.push_back(1);
1055 newDci.
m_rv.push_back(0);
1060 newEl.
m_dci = newDci;
1067 NS_FATAL_ERROR(
"Unable to find RNTI entry in DCI HARQ buffer for RNTI "
1082 if (rbgAllocatedNum == rbgNum)
1109 for (
unsigned int i = 0; i < params.m_cqiList.size(); i++)
1115 uint16_t rnti = params.m_cqiList.at(i).m_rnti;
1121 params.m_cqiList.at(i).m_wbCqi.at(0);
1128 (*it).second = params.m_cqiList.at(i).m_wbCqi.at(0);
1150 NS_LOG_FUNCTION(
this <<
" UL - Frame no. " << (params.m_sfnSf >> 4) <<
" subframe no. "
1151 << (0xF & params.m_sfnSf) <<
" size " << params.m_ulInfoList.size());
1157 std::vector<bool> rbMap;
1158 std::set<uint16_t> rntiAllocated;
1159 std::vector<uint16_t> rbgAllocationMap;
1170 if (rbgAllocationMap.at(i) != 0)
1180 for (std::size_t i = 0; i < params.m_ulInfoList.size(); i++)
1185 uint16_t rnti = params.m_ulInfoList.at(i).m_rnti;
1189 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1192 NS_LOG_INFO(
this <<
" UL-HARQ retx RNTI " << rnti <<
" harqId "
1193 << (uint16_t)harqId);
1197 NS_LOG_ERROR(
"No info find in UL-HARQ buffer for UE (might change eNB) "
1204 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1206 if ((*itStat).second.at(harqId) >= 3)
1208 NS_LOG_INFO(
"Max number of retransmissions reached (UL)-> drop process");
1226 rbgAllocationMap.at(j) = dci.
m_rnti;
1231 << (*itStat).second.at(harqId) + 1);
1235 NS_LOG_INFO(
"Cannot allocate retx due to RACH allocations for UE " << rnti);
1240 (*itStat).second.at((*itProcId).second) = (*itStat).second.at(harqId) + 1;
1241 (*itStat).second.at(harqId) = 0;
1242 (*itHarq).second.at((*itProcId).second) = dci;
1244 rntiAllocated.insert(dci.
m_rnti);
1249 std::map<uint16_t, uint32_t>::iterator it;
1254 auto itRnti = rntiAllocated.find((*it).first);
1256 NS_LOG_INFO(
this <<
" UE " << (*it).first <<
" queue " << (*it).second);
1257 if (((*it).second > 0) && (itRnti == rntiAllocated.end()))
1275 uint16_t rbPerFlow = (
m_cschedCellConfig.m_ulBandwidth) / (nflows + rntiAllocated.size());
1281 uint16_t rbAllocated = 0;
1302 NS_LOG_INFO(
this <<
" NFlows " << nflows <<
" RB per Flow " << rbPerFlow);
1305 auto itRnti = rntiAllocated.find((*it).first);
1306 if ((itRnti != rntiAllocated.end()) || ((*it).second == 0))
1328 NS_LOG_INFO(
this <<
" try to allocate " << (*it).first);
1330 uldci.
m_rnti = (*it).first;
1332 bool allocated =
false;
1333 NS_LOG_INFO(
this <<
" RB Allocated " << rbAllocated <<
" rbPerFlow " << rbPerFlow
1334 <<
" flows " << nflows);
1335 while ((!allocated) && ((rbAllocated + rbPerFlow -
m_cschedCellConfig.m_ulBandwidth) < 1) &&
1340 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1352 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1356 rbgAllocationMap.at(j) = (*it).first;
1359 rbAllocated += rbPerFlow;
1387 auto itCqi =
m_ueCqi.find((*it).first);
1393 NS_LOG_INFO(
this <<
" UE does not have ULCQI " << (*it).first);
1399 "CQI of RNTI = " << (*it).first <<
" has expired");
1400 double minSinr = (*itCqi).second.at(uldci.
m_rbStart);
1403 if ((*itCqi).second.at(i) < minSinr)
1405 minSinr = (*itCqi).second.at(i);
1409 double s = log2(1 + (std::pow(10, minSinr / 10) / ((-std::log(5.0 * 0.00005)) / 1.5)));
1411 cqi =
m_amc->GetCqiFromSpectralEfficiency(s);
1424 rbgAllocationMap.at(i) = 0;
1431 (
m_amc->GetUlTbSizeFromMcs(uldci.
m_mcs, rbPerFlow) / 8);
1456 harqId = (*itProcId).second;
1460 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
1463 (*itDci).second.at(harqId) = uldci;
1468 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
1471 (*itStat).second.at(harqId) = 0;
1474 NS_LOG_INFO(
this <<
" UL Allocation - UE " << (*it).first <<
" startPRB "
1476 <<
" CQI " << cqi <<
" MCS " << (
uint32_t)uldci.
m_mcs <<
" TBsize "
1477 << uldci.
m_tbSize <<
" harqId " << (uint16_t)harqId);
1491 }
while (((*it).first !=
m_nextRntiUl) && (rbPerFlow != 0));
1518 for (
unsigned int i = 0; i < params.m_macCeList.size(); i++)
1530 for (uint8_t lcg = 0; lcg < 4; ++lcg)
1532 uint8_t bsrId = params.m_macCeList.at(i).m_macCeValue.m_bufferStatus.at(lcg);
1536 uint16_t rnti = params.m_macCeList.at(i).m_rnti;
1542 NS_LOG_INFO(
this <<
" Insert RNTI " << rnti <<
" queue " << buffer);
1547 (*it).second = buffer;
1548 NS_LOG_INFO(
this <<
" Update RNTI " << rnti <<
" queue " << buffer);
1581 switch (params.m_ulCqi.m_type)
1587 NS_LOG_INFO(
this <<
" Does not find info on allocation, size : "
1591 for (
uint32_t i = 0; i < (*itMap).second.size(); i++)
1595 auto itCqi =
m_ueCqi.find((*itMap).second.at(i));
1599 std::vector<double> newCqi;
1604 newCqi.push_back(sinr);
1609 newCqi.push_back(30.0);
1612 m_ueCqi[(*itMap).second.at(i)] = newCqi;
1619 (*itCqi).second.at(i) = sinr;
1632 NS_ASSERT(!params.m_vendorSpecificList.empty());
1633 for (std::size_t i = 0; i < params.m_vendorSpecificList.size(); i++)
1639 rnti = vsp->GetRnti();
1642 auto itCqi =
m_ueCqi.find(rnti);
1646 std::vector<double> newCqi;
1650 newCqi.push_back(sinr);
1651 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value "
1664 (*itCqi).second.at(j) = sinr;
1665 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value "
1677 NS_FATAL_ERROR(
"PfFfMacScheduler supports only PUSCH and SRS UL-CQIs");
1693 NS_LOG_INFO(
this <<
" P10-CQI for user " << (*itP10).first <<
" is "
1695 if ((*itP10).second == 0)
1700 " Does not find CQI report for user " << (*itP10).first);
1701 NS_LOG_INFO(
this <<
" P10-CQI exired for user " << (*itP10).first);
1722 NS_LOG_INFO(
this <<
" UL-CQI for user " << (*itUl).first <<
" is "
1724 if ((*itUl).second == 0)
1727 auto itMap =
m_ueCqi.find((*itUl).first);
1729 " Does not find CQI report for user " << (*itUl).first);
1730 NS_LOG_INFO(
this <<
" UL-CQI exired for user " << (*itUl).first);
1731 (*itMap).second.clear();
1751 if (((*it).m_rnti == rnti) && ((*it).m_logicalChannelIdentity == lcid))
1753 NS_LOG_INFO(
this <<
" UE " << rnti <<
" LC " << (uint16_t)lcid <<
" txqueue "
1754 << (*it).m_rlcTransmissionQueueSize <<
" retxqueue "
1755 << (*it).m_rlcRetransmissionQueueSize <<
" status "
1756 << (*it).m_rlcStatusPduSize <<
" decrease " << size);
1759 if (((*it).m_rlcStatusPduSize > 0) && (size >= (*it).m_rlcStatusPduSize))
1761 (*it).m_rlcStatusPduSize = 0;
1763 else if (((*it).m_rlcRetransmissionQueueSize > 0) &&
1764 (size >= (*it).m_rlcRetransmissionQueueSize))
1766 (*it).m_rlcRetransmissionQueueSize = 0;
1768 else if ((*it).m_rlcTransmissionQueueSize > 0)
1785 if ((*it).m_rlcTransmissionQueueSize <= size - rlcOverhead)
1787 (*it).m_rlcTransmissionQueueSize = 0;
1791 (*it).m_rlcTransmissionQueueSize -= size - rlcOverhead;
1806 NS_LOG_INFO(
this <<
" Update RLC BSR UE " << rnti <<
" size " << size <<
" BSR "
1808 if ((*it).second >= size)
1810 (*it).second -= size;
1819 NS_LOG_ERROR(
this <<
" Does not find BSR report info of UE " << rnti);
1826 NS_LOG_FUNCTION(
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);
1828 params.m_rnti = rnti;
1829 params.m_transmissionMode = txMode;
static uint32_t BsrId2BufferSize(uint8_t val)
Convert BSR ID to buffer size.
FfMacCschedSapUser class.
FfMacScheduler()
constructor
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.
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.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
#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< uint8_t > DlHarqProcessesTimer_t
DL HARQ process timer vector.
Ptr< const AttributeChecker > MakeUintegerChecker()
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
std::vector< uint8_t > UlHarqProcessesStatus_t
UL HARQ process status vector.
std::vector< uint8_t > DlHarqProcessesStatus_t
DL HARQ process status vector.
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
std::vector< DlDciListElement_s > DlHarqProcessesDciBuffer_t
DL HARQ process DCI buffer vector.
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)
std::vector< RlcPduList_t > DlHarqRlcPduListBuffer_t
Vector of the 8 HARQ processes per UE.
std::vector< UlDciListElement_s > UlHarqProcessesDciBuffer_t
UL HARQ process DCI buffer vector.
static const int Type0AllocationRbg[4]
Type 0 RBG allocation (see table 7.1.6.1-1 of 3GPP TS 36.213).
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.
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?