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);
166 m_uesTxMode.insert(std::pair<uint16_t, double>(params.m_rnti, params.m_transmissionMode));
170 dlHarqPrcStatus.resize(8, 0);
172 std::pair<uint16_t, DlHarqProcessesStatus_t>(params.m_rnti, dlHarqPrcStatus));
174 dlHarqProcessesTimer.resize(8, 0);
176 std::pair<uint16_t, DlHarqProcessesTimer_t>(params.m_rnti, dlHarqProcessesTimer));
180 std::pair<uint16_t, DlHarqProcessesDciBuffer_t>(params.m_rnti, dlHarqdci));
182 dlHarqRlcPdu.resize(2);
183 dlHarqRlcPdu.at(0).resize(8);
184 dlHarqRlcPdu.at(1).resize(8);
186 std::pair<uint16_t, DlHarqRlcPduListBuffer_t>(params.m_rnti, dlHarqRlcPdu));
189 ulHarqPrcStatus.resize(8, 0);
191 std::pair<uint16_t, UlHarqProcessesStatus_t>(params.m_rnti, ulHarqPrcStatus));
195 std::pair<uint16_t, UlHarqProcessesDciBuffer_t>(params.m_rnti, ulHarqdci));
199 (*it).second = params.m_transmissionMode;
216 for (std::size_t i = 0; i < params.m_logicalChannelIdentity.size(); i++)
221 if (((*it).m_rnti == params.m_rnti) &&
222 ((*it).m_logicalChannelIdentity == params.m_logicalChannelIdentity.at(i)))
253 if ((*it).m_rnti == params.m_rnti)
255 NS_LOG_INFO(
this <<
" Erase RNTI " << (*it).m_rnti <<
" LC "
256 << (uint16_t)(*it).m_logicalChannelIdentity);
286 if (((*it).m_rnti == params.m_rnti) &&
287 ((*it).m_logicalChannelIdentity == params.m_logicalChannelIdentity))
299 NS_LOG_INFO(
this <<
" RNTI " << params.m_rnti <<
" LC "
300 << (uint16_t)params.m_logicalChannelIdentity <<
" RLC tx size "
301 << params.m_rlcTransmissionQueueSize <<
" RLC retx size "
302 << params.m_rlcRetransmissionQueueSize <<
" RLC stat size "
303 << params.m_rlcStatusPduSize);
308 std::pair<uint16_t, uint8_t>(params.m_rnti, 1));
333 for (
int i = 0; i < 4; i++)
364 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
366 uint8_t i = (*it).second;
370 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
372 return (*itStat).second.at(i) == 0;
393 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
395 uint8_t i = (*it).second;
399 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
400 if ((*itStat).second.at(i) == 0)
403 (*itStat).second.at(i) = 1;
410 return ((*it).second);
427 NS_LOG_INFO(
this <<
" Reset HARQ proc " << i <<
" for RNTI " << (*itTimers).first);
432 << (*itTimers).first);
434 (*itStat).second.at(i) = 0;
435 (*itTimers).second.at(i) = 0;
439 (*itTimers).second.at(i)++;
449 NS_LOG_FUNCTION(
this <<
" DL Frame no. " << (params.m_sfnSf >> 4) <<
" subframe no. "
450 << (0xF & params.m_sfnSf));
459 std::vector<bool> rbgMap;
460 uint16_t rbgAllocatedNum = 0;
461 std::set<uint16_t> rntiAllocated;
469 (*itProcId).second = ((*itProcId).second + 1) %
HARQ_PROC_NUM;
474 uint16_t rbStart = 0;
478 (*itRach).m_estimatedSize,
479 " Default UL Grant MCS does not allow to send RACH messages");
481 newRar.
m_rnti = (*itRach).m_rnti;
488 uint16_t tbSizeBits = 0;
490 while ((tbSizeBits < (*itRach).m_estimatedSize) &&
496 if (tbSizeBits < (*itRach).m_estimatedSize)
508 NS_LOG_INFO(
this <<
" UL grant allocated to RNTI " << (*itRach).m_rnti <<
" rbStart "
509 << rbStart <<
" rbLen " << rbLen <<
" MCS " << (uint16_t)
m_ulGrantMcs
511 for (uint16_t i = rbStart; i < rbStart + rbLen; i++)
544 harqId = (*itProcId).second;
548 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
551 (*itDci).second.at(harqId) = uldci;
554 rbStart = rbStart + rbLen;
564 if (!params.m_dlInfoList.empty())
568 params.m_dlInfoList.begin(),
569 params.m_dlInfoList.end());
574 if (!params.m_dlInfoList.empty())
584 std::vector<DlInfoListElement_s> dlInfoListUntxed;
588 if (itRnti != rntiAllocated.end())
594 std::vector<bool> retx;
595 NS_LOG_INFO(
this <<
" Processing DLHARQ feedback");
600 retx.push_back(
false);
609 if (retx.at(0) || retx.at(1))
614 NS_LOG_INFO(
this <<
" HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId);
623 if (dci.
m_rv.size() == 1)
635 NS_LOG_INFO(
"Max number of retransmissions reached -> drop process");
639 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
642 (*it).second.at(harqId) = 0;
646 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
649 for (std::size_t k = 0; k < (*itRlcPdu).second.size(); k++)
651 (*itRlcPdu).second.at(k).at(harqId).clear();
657 std::vector<int> dciRbg;
660 for (
int j = 0; j < 32; j++)
670 for (std::size_t j = 0; j < dciRbg.size(); j++)
672 if (rbgMap.at(dciRbg.at(j)))
682 for (std::size_t j = 0; j < dciRbg.size(); j++)
684 rbgMap.at(dciRbg.at(j)) =
true;
685 NS_LOG_INFO(
"RBG " << dciRbg.at(j) <<
" assigned");
689 NS_LOG_INFO(
this <<
" Send retx in the same RBGs");
695 uint8_t rbgId = (dciRbg.at(dciRbg.size() - 1) + 1) % rbgNum;
696 uint8_t startRbg = dciRbg.at(dciRbg.size() - 1);
697 std::vector<bool> rbgMapCopy = rbgMap;
698 while ((j < dciRbg.size()) && (startRbg != rbgId))
700 if (!rbgMapCopy.at(rbgId))
702 rbgMapCopy.at(rbgId) =
true;
703 dciRbg.at(j) = rbgId;
706 rbgId = (rbgId + 1) % rbgNum;
708 if (j == dciRbg.size())
712 for (std::size_t k = 0; k < dciRbg.size(); k++)
714 rbgMask = rbgMask + (0x1 << dciRbg.at(k));
715 NS_LOG_INFO(
this <<
" New allocated RBG " << dciRbg.at(k));
725 NS_LOG_INFO(
this <<
" No resource for this retx -> buffer it");
733 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI " << rnti);
735 for (std::size_t j = 0; j < nLayers; j++)
739 if (j >= dci.
m_ndi.size())
742 dci.
m_ndi.push_back(0);
743 dci.
m_rv.push_back(0);
744 dci.
m_mcs.push_back(0);
747 <<
" no txed (MIMO transition)");
753 (*itHarq).second.at(harqId).m_rv.at(j)++;
754 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" RV "
755 << (uint16_t)dci.
m_rv.at(j));
765 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" no retx");
769 for (std::size_t k = 0; k < (*itRlcPdu).second.at(0).at(dci.
m_harqProcess).size(); k++)
771 std::vector<RlcPduListElement_s> rlcPduListPerLc;
772 for (std::size_t j = 0; j < nLayers; j++)
776 if (j < dci.
m_ndi.size())
778 NS_LOG_INFO(
" layer " << (uint16_t)j <<
" tb size "
780 rlcPduListPerLc.push_back(
793 .m_logicalChannelIdentity;
795 rlcPduListPerLc.push_back(emptyElement);
799 if (!rlcPduListPerLc.empty())
806 (*itHarq).second.at(harqId).
m_rv = dci.
m_rv;
811 NS_FATAL_ERROR(
"Unable to find HARQ timer for RNTI " << (uint16_t)rnti);
813 (*itHarqTimer).second.at(harqId) = 0;
815 rntiAllocated.insert(rnti);
832 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
835 for (std::size_t k = 0; k < (*itRlcPdu).second.size(); k++)
844 if (rbgAllocatedNum == rbgNum)
855 std::list<FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
859 std::map<uint16_t, uint8_t> lcActivesPerRnti;
863 auto itRnti = rntiAllocated.find((*it).m_rnti);
864 if ((((*it).m_rlcTransmissionQueueSize > 0) || ((*it).m_rlcRetransmissionQueueSize > 0) ||
865 ((*it).m_rlcStatusPduSize > 0)) &&
866 (itRnti == rntiAllocated.end())
871 << (uint16_t)(*it).m_logicalChannelIdentity <<
" is active, status "
872 << (*it).m_rlcStatusPduSize <<
" retx "
873 << (*it).m_rlcRetransmissionQueueSize <<
" tx "
874 << (*it).m_rlcTransmissionQueueSize);
879 cqi = (*itCqi).second;
889 auto itLcRnti = lcActivesPerRnti.find((*it).m_rnti);
890 if (itLcRnti != lcActivesPerRnti.end())
892 (*itLcRnti).second++;
896 lcActivesPerRnti.insert(std::pair<uint16_t, uint8_t>((*it).m_rnti, 1));
914 int rbgPerTb = (nTbs > 0) ? ((rbgNum - rbgAllocatedNum) / nTbs) : INT_MAX;
915 NS_LOG_INFO(
this <<
" Flows to be transmitted " << nflows <<
" rbgPerTb " << rbgPerTb);
920 int rbgAllocated = 0;
954 auto itLcRnti = lcActivesPerRnti.find((*it).m_rnti);
955 auto itRnti = rntiAllocated.find((*it).m_rnti);
956 if ((itLcRnti == lcActivesPerRnti.end()) || (itRnti != rntiAllocated.end()))
959 uint16_t rntiDiscarded = (*it).m_rnti;
962 if ((*it).m_rnti != rntiDiscarded)
978 NS_FATAL_ERROR(
"No Transmission Mode info on user " << (*it).m_rnti);
981 int lcNum = (*itLcRnti).second;
984 newEl.
m_rnti = (*it).m_rnti;
987 newDci.
m_rnti = (*it).m_rnti;
992 for (uint8_t i = 0; i < nLayer; i++)
996 newDci.
m_mcs.push_back(0);
1000 newDci.
m_mcs.push_back(
m_amc->GetMcsFromCqi((*itCqi).second));
1003 int tbSize = (
m_amc->GetDlTbSizeFromMcs(newDci.
m_mcs.at(0), rbgPerTb * rbgSize) / 8);
1004 uint16_t rlcPduSize = tbSize / lcNum;
1005 while ((*it).m_rnti == newEl.
m_rnti)
1007 if (((*it).m_rlcTransmissionQueueSize > 0) ||
1008 ((*it).m_rlcRetransmissionQueueSize > 0) || ((*it).m_rlcStatusPduSize > 0))
1010 std::vector<RlcPduListElement_s> newRlcPduLe;
1011 for (uint8_t j = 0; j < nLayer; j++)
1016 <<
" size " << rlcPduSize <<
" ID " << (*it).m_rnti
1017 <<
" layer " << (uint16_t)j);
1018 newRlcEl.
m_size = rlcPduSize;
1022 newRlcPduLe.push_back(newRlcEl);
1030 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
1033 (*itRlcPdu).second.at(j).at(newDci.
m_harqProcess).push_back(newRlcEl);
1050 << (uint16_t)(*itLcRnti).second <<
" bytes " << tbSize <<
" mcs "
1051 << (uint16_t)newDci.
m_mcs.at(0) <<
" harqId "
1054 while (i < rbgPerTb)
1056 if (!rbgMap.at(rbgAllocated))
1058 rbgMask = rbgMask + (0x1 << rbgAllocated);
1061 rbgMap.at(rbgAllocated) =
true;
1068 for (std::size_t i = 0; i < nLayer; i++)
1071 newDci.
m_ndi.push_back(1);
1072 newDci.
m_rv.push_back(0);
1077 newEl.
m_dci = newDci;
1084 NS_FATAL_ERROR(
"Unable to find RNTI entry in DCI HARQ buffer for RNTI "
1099 if (rbgAllocatedNum == rbgNum)
1126 for (
unsigned int i = 0; i < params.m_cqiList.size(); i++)
1132 uint16_t rnti = params.m_cqiList.at(i).m_rnti;
1139 params.m_cqiList.at(i).m_wbCqi.at(0)));
1146 (*it).second = params.m_cqiList.at(i).m_wbCqi.at(0);
1168 NS_LOG_FUNCTION(
this <<
" UL - Frame no. " << (params.m_sfnSf >> 4) <<
" subframe no. "
1169 << (0xF & params.m_sfnSf) <<
" size " << params.m_ulInfoList.size());
1175 std::vector<bool> rbMap;
1176 std::set<uint16_t> rntiAllocated;
1177 std::vector<uint16_t> rbgAllocationMap;
1188 if (rbgAllocationMap.at(i) != 0)
1198 for (std::size_t i = 0; i < params.m_ulInfoList.size(); i++)
1203 uint16_t rnti = params.m_ulInfoList.at(i).m_rnti;
1207 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1210 NS_LOG_INFO(
this <<
" UL-HARQ retx RNTI " << rnti <<
" harqId "
1211 << (uint16_t)harqId);
1215 NS_LOG_ERROR(
"No info find in UL-HARQ buffer for UE (might change eNB) "
1222 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1224 if ((*itStat).second.at(harqId) >= 3)
1226 NS_LOG_INFO(
"Max number of retransmissions reached (UL)-> drop process");
1244 rbgAllocationMap.at(j) = dci.
m_rnti;
1249 << (*itStat).second.at(harqId) + 1);
1253 NS_LOG_INFO(
"Cannot allocate retx due to RACH allocations for UE " << rnti);
1258 (*itStat).second.at((*itProcId).second) = (*itStat).second.at(harqId) + 1;
1259 (*itStat).second.at(harqId) = 0;
1260 (*itHarq).second.at((*itProcId).second) = dci;
1262 rntiAllocated.insert(dci.
m_rnti);
1267 std::map<uint16_t, uint32_t>::iterator it;
1272 auto itRnti = rntiAllocated.find((*it).first);
1274 NS_LOG_INFO(
this <<
" UE " << (*it).first <<
" queue " << (*it).second);
1275 if (((*it).second > 0) && (itRnti == rntiAllocated.end()))
1286 std::pair<uint16_t, std::vector<uint16_t>>(params.m_sfnSf, rbgAllocationMap));
1300 uint16_t rbAllocated = 0;
1321 NS_LOG_INFO(
this <<
" NFlows " << nflows <<
" RB per Flow " << rbPerFlow);
1324 auto itRnti = rntiAllocated.find((*it).first);
1325 if ((itRnti != rntiAllocated.end()) || ((*it).second == 0))
1347 NS_LOG_INFO(
this <<
" try to allocate " << (*it).first);
1349 uldci.
m_rnti = (*it).first;
1351 bool allocated =
false;
1352 NS_LOG_INFO(
this <<
" RB Allocated " << rbAllocated <<
" rbPerFlow " << rbPerFlow
1353 <<
" flows " << nflows);
1359 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1371 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1375 rbgAllocationMap.at(j) = (*it).first;
1378 rbAllocated += rbPerFlow;
1404 std::pair<uint16_t, std::vector<uint16_t>>(params.m_sfnSf, rbgAllocationMap));
1407 auto itCqi =
m_ueCqi.find((*it).first);
1413 NS_LOG_INFO(
this <<
" UE does not have ULCQI " << (*it).first);
1419 "CQI of RNTI = " << (*it).first <<
" has expired");
1420 double minSinr = (*itCqi).second.at(uldci.
m_rbStart);
1423 if ((*itCqi).second.at(i) < minSinr)
1425 minSinr = (*itCqi).second.at(i);
1429 double s = log2(1 + (std::pow(10, minSinr / 10) / ((-std::log(5.0 * 0.00005)) / 1.5)));
1431 cqi =
m_amc->GetCqiFromSpectralEfficiency(s);
1444 rbgAllocationMap.at(i) = 0;
1451 (
m_amc->GetUlTbSizeFromMcs(uldci.
m_mcs, rbPerFlow) / 8);
1476 harqId = (*itProcId).second;
1480 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
1483 (*itDci).second.at(harqId) = uldci;
1488 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
1491 (*itStat).second.at(harqId) = 0;
1494 NS_LOG_INFO(
this <<
" UL Allocation - UE " << (*it).first <<
" startPRB "
1496 <<
" CQI " << cqi <<
" MCS " << (
uint32_t)uldci.
m_mcs <<
" TBsize "
1497 << uldci.
m_tbSize <<
" harqId " << (uint16_t)harqId);
1511 }
while (((*it).first !=
m_nextRntiUl) && (rbPerFlow != 0));
1514 std::pair<uint16_t, std::vector<uint16_t>>(params.m_sfnSf, rbgAllocationMap));
1539 for (
unsigned int i = 0; i < params.m_macCeList.size(); i++)
1551 for (uint8_t lcg = 0; lcg < 4; ++lcg)
1553 uint8_t bsrId = params.m_macCeList.at(i).m_macCeValue.m_bufferStatus.at(lcg);
1557 uint16_t rnti = params.m_macCeList.at(i).m_rnti;
1562 m_ceBsrRxed.insert(std::pair<uint16_t, uint32_t>(rnti, buffer));
1563 NS_LOG_INFO(
this <<
" Insert RNTI " << rnti <<
" queue " << buffer);
1568 (*it).second = buffer;
1569 NS_LOG_INFO(
this <<
" Update RNTI " << rnti <<
" queue " << buffer);
1602 switch (params.m_ulCqi.m_type)
1608 NS_LOG_INFO(
this <<
" Does not find info on allocation, size : "
1612 for (
uint32_t i = 0; i < (*itMap).second.size(); i++)
1616 auto itCqi =
m_ueCqi.find((*itMap).second.at(i));
1620 std::vector<double> newCqi;
1625 newCqi.push_back(sinr);
1630 newCqi.push_back(30.0);
1634 std::pair<uint16_t, std::vector<double>>((*itMap).second.at(i), newCqi));
1642 (*itCqi).second.at(i) = sinr;
1655 NS_ASSERT(!params.m_vendorSpecificList.empty());
1656 for (std::size_t i = 0; i < params.m_vendorSpecificList.size(); i++)
1661 DynamicCast<SrsCqiRntiVsp>(params.m_vendorSpecificList.at(i).m_value);
1662 rnti = vsp->GetRnti();
1665 auto itCqi =
m_ueCqi.find(rnti);
1669 std::vector<double> newCqi;
1673 newCqi.push_back(sinr);
1674 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value "
1677 m_ueCqi.insert(std::pair<uint16_t, std::vector<double>>(rnti, newCqi));
1687 (*itCqi).second.at(j) = sinr;
1688 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value "
1700 NS_FATAL_ERROR(
"PfFfMacScheduler supports only PUSCH and SRS UL-CQIs");
1716 NS_LOG_INFO(
this <<
" P10-CQI for user " << (*itP10).first <<
" is "
1718 if ((*itP10).second == 0)
1723 " Does not find CQI report for user " << (*itP10).first);
1724 NS_LOG_INFO(
this <<
" P10-CQI exired for user " << (*itP10).first);
1745 NS_LOG_INFO(
this <<
" UL-CQI for user " << (*itUl).first <<
" is "
1747 if ((*itUl).second == 0)
1750 auto itMap =
m_ueCqi.find((*itUl).first);
1752 " Does not find CQI report for user " << (*itUl).first);
1753 NS_LOG_INFO(
this <<
" UL-CQI exired for user " << (*itUl).first);
1754 (*itMap).second.clear();
1774 if (((*it).m_rnti == rnti) && ((*it).m_logicalChannelIdentity == lcid))
1776 NS_LOG_INFO(
this <<
" UE " << rnti <<
" LC " << (uint16_t)lcid <<
" txqueue "
1777 << (*it).m_rlcTransmissionQueueSize <<
" retxqueue "
1778 << (*it).m_rlcRetransmissionQueueSize <<
" status "
1779 << (*it).m_rlcStatusPduSize <<
" decrease " << size);
1782 if (((*it).m_rlcStatusPduSize > 0) && (size >= (*it).m_rlcStatusPduSize))
1784 (*it).m_rlcStatusPduSize = 0;
1786 else if (((*it).m_rlcRetransmissionQueueSize > 0) &&
1787 (size >= (*it).m_rlcRetransmissionQueueSize))
1789 (*it).m_rlcRetransmissionQueueSize = 0;
1791 else if ((*it).m_rlcTransmissionQueueSize > 0)
1808 if ((*it).m_rlcTransmissionQueueSize <= size - rlcOverhead)
1810 (*it).m_rlcTransmissionQueueSize = 0;
1814 (*it).m_rlcTransmissionQueueSize -= size - rlcOverhead;
1829 NS_LOG_INFO(
this <<
" Update RLC BSR UE " << rnti <<
" size " << size <<
" BSR "
1831 if ((*it).second >= size)
1833 (*it).second -= size;
1842 NS_LOG_ERROR(
this <<
" Does not find BSR report info of UE " << rnti);
1849 NS_LOG_FUNCTION(
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);
1851 params.m_rnti = rnti;
1852 params.m_transmissionMode = txMode;
AttributeValue implementation for Boolean.
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...
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Ptr< const AttributeChecker > MakeBooleanChecker()
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
#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.
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.
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.
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?