21 #include <ns3/boolean.h>
22 #include <ns3/fdtbfq-ff-mac-scheduler.h>
23 #include <ns3/integer.h>
25 #include <ns3/lte-amc.h>
26 #include <ns3/lte-vendor-specific-parameters.h>
28 #include <ns3/pointer.h>
29 #include <ns3/simulator.h>
50 : m_cschedSapUser(nullptr),
51 m_schedSapUser(nullptr),
55 m_amc = CreateObject<LteAmc>();
87 TypeId(
"ns3::FdTbfqFfMacScheduler")
91 .AddAttribute(
"CqiTimerThreshold",
92 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
95 MakeUintegerChecker<uint32_t>())
96 .AddAttribute(
"DebtLimit",
97 "Flow debt limit (default -625000 bytes)",
100 MakeIntegerChecker<int>())
101 .AddAttribute(
"CreditLimit",
102 "Flow credit limit (default 625000 bytes)",
105 MakeUintegerChecker<uint32_t>())
106 .AddAttribute(
"TokenPoolSize",
107 "The maximum value of flow token pool (default 1 bytes)",
110 MakeUintegerChecker<uint32_t>())
111 .AddAttribute(
"CreditableThreshold",
112 "Threshold of flow credit (default 0 bytes)",
115 MakeUintegerChecker<uint32_t>())
117 .AddAttribute(
"HarqEnabled",
118 "Activate/Deactivate the HARQ [by default is active].",
122 .AddAttribute(
"UlGrantMcs",
123 "The MCS of the UL grant, must be [0..15] (default 0)",
126 MakeUintegerChecker<uint8_t>());
184 << (uint16_t)
params.m_transmissionMode);
192 dlHarqPrcStatus.resize(8, 0);
194 std::pair<uint16_t, DlHarqProcessesStatus_t>(
params.m_rnti, dlHarqPrcStatus));
196 dlHarqProcessesTimer.resize(8, 0);
198 std::pair<uint16_t, DlHarqProcessesTimer_t>(
params.m_rnti, dlHarqProcessesTimer));
202 std::pair<uint16_t, DlHarqProcessesDciBuffer_t>(
params.m_rnti, dlHarqdci));
204 dlHarqRlcPdu.resize(2);
205 dlHarqRlcPdu.at(0).resize(8);
206 dlHarqRlcPdu.at(1).resize(8);
208 std::pair<uint16_t, DlHarqRlcPduListBuffer_t>(
params.m_rnti, dlHarqRlcPdu));
211 ulHarqPrcStatus.resize(8, 0);
213 std::pair<uint16_t, UlHarqProcessesStatus_t>(
params.m_rnti, ulHarqPrcStatus));
217 std::pair<uint16_t, UlHarqProcessesDciBuffer_t>(
params.m_rnti, ulHarqdci));
221 (*it).second =
params.m_transmissionMode;
231 std::map<uint16_t, fdtbfqsFlowPerf_t>::iterator it;
232 for (std::size_t i = 0; i <
params.m_logicalChannelConfigList.size(); i++)
238 uint64_t mbrDlInBytes =
239 params.m_logicalChannelConfigList.at(i).m_eRabMaximulBitrateDl / 8;
240 uint64_t mbrUlInBytes =
241 params.m_logicalChannelConfigList.at(i).m_eRabMaximulBitrateUl / 8;
242 NS_LOG_DEBUG(
"mbrDlInBytes: " << mbrDlInBytes <<
" mbrUlInBytes: " << mbrUlInBytes);
255 std::pair<uint16_t, fdtbfqsFlowPerf_t>(
params.m_rnti, flowStatsDl));
267 std::pair<uint16_t, fdtbfqsFlowPerf_t>(
params.m_rnti, flowStatsUl));
272 uint64_t mbrDlInBytes =
273 params.m_logicalChannelConfigList.at(i).m_eRabMaximulBitrateDl / 8;
274 uint64_t mbrUlInBytes =
275 params.m_logicalChannelConfigList.at(i).m_eRabMaximulBitrateUl / 8;
276 NS_LOG_DEBUG(
"mbrDlInBytes: " << mbrDlInBytes <<
" mbrUlInBytes: " << mbrUlInBytes);
277 m_flowStatsDl[(*it).first].tokenGenerationRate = mbrDlInBytes;
278 m_flowStatsUl[(*it).first].tokenGenerationRate = mbrUlInBytes;
288 for (std::size_t i = 0; i <
params.m_logicalChannelIdentity.size(); i++)
290 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
292 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
295 if (((*it).first.m_rnti ==
params.m_rnti) &&
296 ((*it).first.m_lcId ==
params.m_logicalChannelIdentity.at(i)))
328 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
330 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
333 if ((*it).first.m_rnti ==
params.m_rnti)
357 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
366 std::pair<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>(flow,
394 for (
int i = 0; i < 4; i++)
408 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
409 unsigned int lcActive = 0;
412 if (((*it).first.m_rnti == rnti) && (((*it).second.m_rlcTransmissionQueueSize > 0) ||
413 ((*it).second.m_rlcRetransmissionQueueSize > 0) ||
414 ((*it).second.m_rlcStatusPduSize > 0)))
418 if ((*it).first.m_rnti > rnti)
436 std::map<uint16_t, DlHarqProcessesStatus_t>::iterator itStat =
440 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
442 uint8_t i = (*it).second;
446 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
447 if ((*itStat).second.at(i) == 0)
472 std::map<uint16_t, DlHarqProcessesStatus_t>::iterator itStat =
476 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
478 uint8_t i = (*it).second;
482 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
483 if ((*itStat).second.at(i) == 0)
486 (*itStat).second.at(i) = 1;
491 << rnti <<
" check before update with HarqProcessAvailability");
494 return ((*it).second);
502 std::map<uint16_t, DlHarqProcessesTimer_t>::iterator itTimers;
512 NS_LOG_DEBUG(
this <<
" Reset HARQ proc " << i <<
" for RNTI " << (*itTimers).first);
513 std::map<uint16_t, DlHarqProcessesStatus_t>::iterator itStat =
518 << (*itTimers).first);
520 (*itStat).second.at(i) = 0;
521 (*itTimers).second.at(i) = 0;
525 (*itTimers).second.at(i)++;
536 << (0xF &
params.m_sfnSf));
547 std::map<uint16_t, std::vector<uint16_t>> allocationMap;
548 std::vector<bool> rbgMap;
549 uint16_t rbgAllocatedNum = 0;
550 std::set<uint16_t> rntiAllocated;
554 for (std::vector<bool>::iterator it = rbgMap.begin(); it != rbgMap.end(); it++)
565 std::map<uint16_t, uint8_t>::iterator itProcId;
569 (*itProcId).second = ((*itProcId).second + 1) %
HARQ_PROC_NUM;
573 std::vector<bool> ulRbMap;
576 uint8_t maxContinuousUlBandwidth = 0;
577 uint8_t tmpMinBandwidth = 0;
578 uint16_t ffrRbStartOffset = 0;
579 uint16_t tmpFfrRbStartOffset = 0;
582 for (std::vector<bool>::iterator it = ulRbMap.begin(); it != ulRbMap.end(); it++)
586 if (tmpMinBandwidth > maxContinuousUlBandwidth)
588 maxContinuousUlBandwidth = tmpMinBandwidth;
589 ffrRbStartOffset = tmpFfrRbStartOffset;
595 if (tmpMinBandwidth == 0)
597 tmpFfrRbStartOffset = index;
604 if (tmpMinBandwidth > maxContinuousUlBandwidth)
606 maxContinuousUlBandwidth = tmpMinBandwidth;
607 ffrRbStartOffset = tmpFfrRbStartOffset;
611 uint16_t rbStart = 0;
612 rbStart = ffrRbStartOffset;
613 std::vector<struct RachListElement_s>::iterator itRach;
617 (*itRach).m_estimatedSize,
618 " Default UL Grant MCS does not allow to send RACH messages");
620 newRar.
m_rnti = (*itRach).m_rnti;
627 uint16_t tbSizeBits = 0;
629 while ((tbSizeBits < (*itRach).m_estimatedSize) &&
630 (rbStart + rbLen < (ffrRbStartOffset + maxContinuousUlBandwidth)))
635 if (tbSizeBits < (*itRach).m_estimatedSize)
647 NS_LOG_INFO(
this <<
" UL grant allocated to RNTI " << (*itRach).m_rnti <<
" rbStart "
648 << rbStart <<
" rbLen " << rbLen <<
" MCS " << (uint16_t)
m_ulGrantMcs
650 for (uint16_t i = rbStart; i < rbStart + rbLen; i++)
678 std::map<uint16_t, uint8_t>::iterator itProcId;
684 harqId = (*itProcId).second;
685 std::map<uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci =
689 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
692 (*itDci).second.at(harqId) = uldci;
695 rbStart = rbStart + rbLen;
705 if (!
params.m_dlInfoList.empty())
709 params.m_dlInfoList.begin(),
710 params.m_dlInfoList.end());
715 if (!
params.m_dlInfoList.empty())
725 std::vector<struct DlInfoListElement_s> dlInfoListUntxed;
729 if (itRnti != rntiAllocated.end())
735 std::vector<bool> retx;
736 NS_LOG_INFO(
this <<
" Processing DLHARQ feedback");
741 retx.push_back(
false);
750 if (retx.at(0) || retx.at(1))
755 NS_LOG_INFO(
this <<
" HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId);
756 std::map<uint16_t, DlHarqProcessesDciBuffer_t>::iterator itHarq =
765 if (dci.
m_rv.size() == 1)
777 NS_LOG_INFO(
"Maximum number of retransmissions reached -> drop process");
778 std::map<uint16_t, DlHarqProcessesStatus_t>::iterator it =
782 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
785 (*it).second.at(harqId) = 0;
786 std::map<uint16_t, DlHarqRlcPduListBuffer_t>::iterator itRlcPdu =
790 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
793 for (std::size_t
k = 0;
k < (*itRlcPdu).second.size();
k++)
795 (*itRlcPdu).second.at(
k).at(harqId).clear();
801 std::vector<int> dciRbg;
804 for (
int j = 0; j < 32; j++)
814 for (std::size_t j = 0; j < dciRbg.size(); j++)
816 if (rbgMap.at(dciRbg.at(j)) ==
true)
826 for (std::size_t j = 0; j < dciRbg.size(); j++)
828 rbgMap.at(dciRbg.at(j)) =
true;
829 NS_LOG_INFO(
"RBG " << dciRbg.at(j) <<
" assigned");
833 NS_LOG_INFO(
this <<
" Send retx in the same RBGs");
839 uint8_t rbgId = (dciRbg.at(dciRbg.size() - 1) + 1) % rbgNum;
840 uint8_t startRbg = dciRbg.at(dciRbg.size() - 1);
841 std::vector<bool> rbgMapCopy = rbgMap;
842 while ((j < dciRbg.size()) && (startRbg != rbgId))
844 if (rbgMapCopy.at(rbgId) ==
false)
846 rbgMapCopy.at(rbgId) =
true;
847 dciRbg.at(j) = rbgId;
850 rbgId = (rbgId + 1) % rbgNum;
852 if (j == dciRbg.size())
855 uint32_t rbgMask = 0;
856 for (std::size_t
k = 0;
k < dciRbg.size();
k++)
858 rbgMask = rbgMask + (0x1 << dciRbg.at(
k));
863 NS_LOG_INFO(
this <<
" Move retx in RBGs " << dciRbg.size());
869 NS_LOG_INFO(
this <<
" No resource for this retx -> buffer it");
874 std::map<uint16_t, DlHarqRlcPduListBuffer_t>::iterator itRlcPdu =
878 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI " << rnti);
880 for (std::size_t j = 0; j < nLayers; j++)
884 if (j >= dci.
m_ndi.size())
887 dci.
m_ndi.push_back(0);
888 dci.
m_rv.push_back(0);
889 dci.
m_mcs.push_back(0);
892 <<
" no txed (MIMO transition)");
898 (*itHarq).second.at(harqId).m_rv.at(j)++;
899 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" RV "
900 << (uint16_t)dci.
m_rv.at(j));
910 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" no retx");
913 for (std::size_t
k = 0;
k < (*itRlcPdu).second.at(0).at(dci.
m_harqProcess).size();
k++)
915 std::vector<struct RlcPduListElement_s> rlcPduListPerLc;
916 for (std::size_t j = 0; j < nLayers; j++)
920 if (j < dci.
m_ndi.size())
922 NS_LOG_INFO(
" layer " << (uint16_t)j <<
" tb size "
924 rlcPduListPerLc.push_back(
937 .m_logicalChannelIdentity;
939 rlcPduListPerLc.push_back(emptyElement);
943 if (!rlcPduListPerLc.empty())
950 (*itHarq).second.at(harqId).
m_rv = dci.
m_rv;
952 std::map<uint16_t, DlHarqProcessesTimer_t>::iterator itHarqTimer =
956 NS_FATAL_ERROR(
"Unable to find HARQ timer for RNTI " << (uint16_t)rnti);
958 (*itHarqTimer).second.at(harqId) = 0;
960 rntiAllocated.insert(rnti);
966 std::map<uint16_t, DlHarqProcessesStatus_t>::iterator it =
974 std::map<uint16_t, DlHarqRlcPduListBuffer_t>::iterator itRlcPdu =
978 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
981 for (std::size_t
k = 0;
k < (*itRlcPdu).second.size();
k++)
990 if (rbgAllocatedNum == rbgNum)
1001 std::map<uint16_t, fdtbfqsFlowPerf_t>::iterator itStats;
1004 if ((*itStats).second.tokenGenerationRate / 1000 + (*itStats).second.tokenPoolSize >
1005 (*itStats).second.maxTokenPoolSize)
1007 (*itStats).second.counter +=
1008 (*itStats).second.tokenGenerationRate / 1000 -
1009 ((*itStats).second.maxTokenPoolSize - (*itStats).second.tokenPoolSize);
1010 (*itStats).second.tokenPoolSize = (*itStats).second.maxTokenPoolSize;
1011 bankSize += (*itStats).second.tokenGenerationRate / 1000 -
1012 ((*itStats).second.maxTokenPoolSize - (*itStats).second.tokenPoolSize);
1016 (*itStats).second.tokenPoolSize += (*itStats).second.tokenGenerationRate / 1000;
1020 std::set<uint16_t> allocatedRnti;
1021 std::set<uint8_t> allocatedRbg;
1024 while (totalRbg < rbgNum)
1027 std::map<uint16_t, fdtbfqsFlowPerf_t>::iterator it;
1028 std::map<uint16_t, fdtbfqsFlowPerf_t>::iterator itMax =
m_flowStatsDl.end();
1029 double metricMax = 0.0;
1030 bool firstRnti =
true;
1033 std::set<uint16_t>::iterator itRnti = rntiAllocated.find((*it).first);
1037 if (itRnti != rntiAllocated.end())
1039 NS_LOG_DEBUG(
this <<
" RNTI discarded for HARQ tx" << (uint16_t)(*it).first);
1043 NS_LOG_DEBUG(
this <<
" RNTI discarded for HARQ id" << (uint16_t)(*it).first);
1048 std::map<uint16_t, SbMeasResult_s>::iterator itCqi;
1050 std::map<uint16_t, uint8_t>::iterator itTxMode;
1054 NS_FATAL_ERROR(
"No Transmission Mode info on user " << (*it).first);
1059 for (
int k = 0;
k < rbgNum;
k++)
1061 for (uint8_t j = 0; j < nLayer; j++)
1069 cqiSum += (*itCqi).second.m_higherLayerSelected.at(
k).m_sbCqi.at(j);
1076 NS_LOG_INFO(
"Skip this flow, CQI==0, rnti:" << (*it).first);
1085 std::set<uint16_t>::iterator rnti;
1086 rnti = allocatedRnti.find((*it).first);
1087 if (rnti != allocatedRnti.end())
1093 (((double)(*it).second.counter) / ((double)(*it).second.tokenGenerationRate));
1095 if (firstRnti ==
true)
1102 if (metric > metricMax)
1117 allocatedRnti.insert((*itMax).first);
1120 uint32_t budget = 0;
1123 budget = (*itMax).second.counter - (*itMax).second.debtLimit;
1124 if (budget > (*itMax).second.burstCredit)
1126 budget = (*itMax).second.burstCredit;
1133 budget = budget + (*itMax).second.tokenPoolSize;
1144 uint32_t rlcBufSize = 0;
1146 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator
1150 if ((*itRlcBuf).first.m_rnti == (*itMax).first)
1152 lcid = (*itRlcBuf).first.m_lcId;
1159 rlcBufSize = (*itRlcBuf).second.m_rlcTransmissionQueueSize +
1160 (*itRlcBuf).second.m_rlcRetransmissionQueueSize +
1161 (*itRlcBuf).second.m_rlcStatusPduSize;
1163 if (budget > rlcBufSize)
1165 budget = rlcBufSize;
1167 <<
" RLC buffer size: " << rlcBufSize);
1172 uint32_t bytesTxed = 0;
1173 uint32_t bytesTxedTmp = 0;
1175 while (bytesTxed <= budget)
1179 std::map<uint16_t, SbMeasResult_s>::iterator itCqi;
1181 std::map<uint16_t, uint8_t>::iterator itTxMode;
1185 NS_FATAL_ERROR(
"No Transmission Mode info on user " << (*it).first);
1190 double achievableRateMax = 0.0;
1192 for (
int k = 0;
k < rbgNum;
k++)
1194 std::set<uint8_t>::iterator rbg;
1195 rbg = allocatedRbg.find(
k);
1196 if (rbg != allocatedRbg.end())
1201 if (rbgMap.at(
k) ==
true)
1211 std::vector<uint8_t> sbCqi;
1214 for (uint8_t
k = 0;
k < nLayer;
k++)
1221 sbCqi = (*itCqi).second.m_higherLayerSelected.at(
k).m_sbCqi;
1223 uint8_t cqi1 = sbCqi.at(0);
1225 if (sbCqi.size() > 1)
1236 double achievableRate = 0.0;
1237 for (uint8_t j = 0; j < nLayer; j++)
1240 if (sbCqi.size() > j)
1242 mcs =
m_amc->GetMcsFromCqi(sbCqi.at(j));
1249 achievableRate += ((
m_amc->GetDlTbSizeFromMcs(mcs, rbgSize) / 8) /
1253 if (achievableRate > achievableRateMax)
1255 achievableRateMax = achievableRate;
1262 if (rbgIndex == rbgNum)
1271 allocatedRbg.insert(rbgIndex);
1275 std::map<uint16_t, std::vector<uint16_t>>::iterator itMap;
1276 itMap = allocationMap.find((*itMax).first);
1277 uint16_t RbgPerRnti;
1278 if (itMap == allocationMap.end())
1281 std::vector<uint16_t> tempMap;
1282 tempMap.push_back(rbgIndex);
1283 allocationMap.insert(
1284 std::pair<uint16_t, std::vector<uint16_t>>((*itMax).first, tempMap));
1285 itMap = allocationMap.find(
1290 (*itMap).second.push_back(rbgIndex);
1292 rbgMap.at(rbgIndex) =
true;
1294 RbgPerRnti = (*itMap).second.size();
1297 std::vector<uint8_t> worstCqi(2, 15);
1300 for (std::size_t
k = 0;
k < (*itMap).second.size();
k++)
1302 if ((*itCqi).second.m_higherLayerSelected.size() > (*itMap).second.at(
k))
1304 for (uint8_t j = 0; j < nLayer; j++)
1307 .
second.m_higherLayerSelected.at((*itMap).second.at(
k))
1308 .m_sbCqi.size() > j)
1311 .
second.m_higherLayerSelected.at((*itMap).second.at(
k))
1312 .m_sbCqi.at(j)) < worstCqi.at(j))
1316 .second.m_higherLayerSelected.at((*itMap).second.at(
k))
1329 for (uint8_t j = 0; j < nLayer; j++)
1339 for (uint8_t j = 0; j < nLayer; j++)
1345 bytesTxedTmp = bytesTxed;
1347 for (uint8_t j = 0; j < nLayer; j++)
1349 int tbSize = (
m_amc->GetDlTbSizeFromMcs(
m_amc->GetMcsFromCqi(worstCqi.at(j)),
1350 RbgPerRnti * rbgSize) /
1352 bytesTxed += tbSize;
1358 if (bytesTxed > budget)
1360 NS_LOG_DEBUG(
"budget: " << budget <<
" bytesTxed: " << bytesTxed <<
" at "
1362 std::map<uint16_t, std::vector<uint16_t>>::iterator itMap;
1363 itMap = allocationMap.find((*itMax).first);
1364 (*itMap).second.pop_back();
1365 allocatedRbg.erase(rbgIndex);
1366 bytesTxed = bytesTxedTmp;
1368 rbgMap.at(rbgIndex) =
false;
1371 if ((*itMap).second.empty())
1373 itMap = allocationMap.erase(itMap);
1378 if (allocationMap.find((*itMax).first) != allocationMap.end())
1381 if (bytesTxed <= (*itMax).second.tokenPoolSize)
1383 (*itMax).second.tokenPoolSize -= bytesTxed;
1387 (*itMax).second.counter =
1388 (*itMax).second.counter - (bytesTxed - (*itMax).second.tokenPoolSize);
1389 (*itMax).second.tokenPoolSize = 0;
1390 if (
bankSize <= (bytesTxed - (*itMax).second.tokenPoolSize))
1404 std::map<uint16_t, std::vector<uint16_t>>::iterator itMap = allocationMap.begin();
1405 while (itMap != allocationMap.end())
1407 NS_LOG_DEBUG(
"Preparing DCI for RNTI " << (*itMap).first);
1410 newEl.
m_rnti = (*itMap).first;
1413 newDci.
m_rnti = (*itMap).first;
1421 lcActives = (uint16_t)65535;
1423 uint16_t RgbPerRnti = (*itMap).second.size();
1424 std::map<uint16_t, SbMeasResult_s>::iterator itCqi;
1426 std::map<uint16_t, uint8_t>::iterator itTxMode;
1430 NS_FATAL_ERROR(
"No Transmission Mode info on user " << (*itMap).first);
1433 std::vector<uint8_t> worstCqi(2, 15);
1436 for (std::size_t
k = 0;
k < (*itMap).second.size();
k++)
1438 if ((*itCqi).second.m_higherLayerSelected.size() > (*itMap).second.at(
k))
1440 NS_LOG_INFO(
this <<
" RBG " << (*itMap).second.at(
k) <<
" CQI "
1441 << (uint16_t)((*itCqi)
1442 .second.m_higherLayerSelected
1443 .at((*itMap).second.at(
k))
1445 for (uint8_t j = 0; j < nLayer; j++)
1448 .
second.m_higherLayerSelected.at((*itMap).second.at(
k))
1449 .m_sbCqi.size() > j)
1452 .
second.m_higherLayerSelected.at((*itMap).second.at(
k))
1453 .m_sbCqi.at(j)) < worstCqi.at(j))
1457 .second.m_higherLayerSelected.at((*itMap).second.at(
k))
1470 for (uint8_t j = 0; j < nLayer; j++)
1479 for (uint8_t j = 0; j < nLayer; j++)
1484 for (uint8_t j = 0; j < nLayer; j++)
1486 NS_LOG_INFO(
this <<
" Layer " << (uint16_t)j <<
" CQI selected "
1487 << (uint16_t)worstCqi.at(j));
1489 for (uint8_t j = 0; j < nLayer; j++)
1491 newDci.
m_mcs.push_back(
m_amc->GetMcsFromCqi(worstCqi.at(j)));
1492 int tbSize = (
m_amc->GetDlTbSizeFromMcs(newDci.
m_mcs.at(j), RgbPerRnti * rbgSize) /
1495 NS_LOG_INFO(
this <<
" Layer " << (uint16_t)j <<
" MCS selected"
1496 << (uint16_t)
m_amc->GetMcsFromCqi(worstCqi.at(j)));
1501 uint32_t rbgMask = 0;
1502 for (std::size_t
k = 0;
k < (*itMap).second.size();
k++)
1504 rbgMask = rbgMask + (0x1 << (*itMap).second.at(
k));
1505 NS_LOG_INFO(
this <<
" Allocated RBG " << (*itMap).second.at(
k));
1510 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator
1514 if (((*itBufReq).first.m_rnti == (*itMap).first) &&
1515 (((*itBufReq).second.m_rlcTransmissionQueueSize > 0) ||
1516 ((*itBufReq).second.m_rlcRetransmissionQueueSize > 0) ||
1517 ((*itBufReq).second.m_rlcStatusPduSize > 0)))
1519 std::vector<struct RlcPduListElement_s> newRlcPduLe;
1520 for (uint8_t j = 0; j < nLayer; j++)
1526 <<
" size " << newRlcEl.
m_size <<
" layer " << (uint16_t)j);
1527 newRlcPduLe.push_back(newRlcEl);
1534 std::map<uint16_t, DlHarqRlcPduListBuffer_t>::iterator itRlcPdu =
1538 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
1541 (*itRlcPdu).second.at(j).at(newDci.
m_harqProcess).push_back(newRlcEl);
1546 if ((*itBufReq).first.m_rnti > (*itMap).first)
1551 for (uint8_t j = 0; j < nLayer; j++)
1553 newDci.
m_ndi.push_back(1);
1554 newDci.
m_rv.push_back(0);
1559 newEl.
m_dci = newDci;
1564 std::map<uint16_t, DlHarqProcessesDciBuffer_t>::iterator itDci =
1568 NS_FATAL_ERROR(
"Unable to find RNTI entry in DCI HARQ buffer for RNTI "
1573 std::map<uint16_t, DlHarqProcessesTimer_t>::iterator itHarqTimer =
1609 for (
unsigned int i = 0; i <
params.m_cqiList.size(); i++)
1615 std::map<uint16_t, uint8_t>::iterator it;
1616 uint16_t rnti =
params.m_cqiList.at(i).m_rnti;
1623 params.m_cqiList.at(i).m_wbCqi.at(0)));
1630 (*it).second =
params.m_cqiList.at(i).m_wbCqi.at(0);
1632 std::map<uint16_t, uint32_t>::iterator itTimers;
1640 std::map<uint16_t, SbMeasResult_s>::iterator it;
1641 uint16_t rnti =
params.m_cqiList.at(i).m_rnti;
1647 std::pair<uint16_t, SbMeasResult_s>(rnti,
1648 params.m_cqiList.at(i).m_sbMeasResult));
1654 (*it).second =
params.m_cqiList.at(i).m_sbMeasResult;
1655 std::map<uint16_t, uint32_t>::iterator itTimers;
1670 std::map<uint16_t, std::vector<double>>::iterator itCqi =
m_ueCqi.find(rnti);
1680 unsigned int sinrNum = 0;
1683 double sinr = (*itCqi).second.at(i);
1690 double estimatedSinr = (sinrNum > 0) ? (sinrSum / sinrNum) : DBL_MAX;
1692 (*itCqi).second.at(rb) = estimatedSinr;
1693 return (estimatedSinr);
1702 << (0xF &
params.m_sfnSf) <<
" size " <<
params.m_ulInfoList.size());
1709 std::vector<bool> rbMap;
1710 uint16_t rbAllocatedNum = 0;
1711 std::set<uint16_t> rntiAllocated;
1712 std::vector<uint16_t> rbgAllocationMap;
1723 for (std::vector<bool>::iterator it = rbMap.begin(); it != rbMap.end(); it++)
1737 if (rbgAllocationMap.at(i) != 0)
1747 for (std::size_t i = 0; i <
params.m_ulInfoList.size(); i++)
1752 uint16_t rnti =
params.m_ulInfoList.at(i).m_rnti;
1753 std::map<uint16_t, uint8_t>::iterator itProcId =
1757 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1760 NS_LOG_INFO(
this <<
" UL-HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId
1761 <<
" i " << i <<
" size " <<
params.m_ulInfoList.size());
1762 std::map<uint16_t, UlHarqProcessesDciBuffer_t>::iterator itHarq =
1766 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1770 std::map<uint16_t, UlHarqProcessesStatus_t>::iterator itStat =
1774 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1776 if ((*itStat).second.at(harqId) >= 3)
1778 NS_LOG_INFO(
"Max number of retransmissions reached (UL)-> drop process");
1784 if (rbMap.at(j) ==
true)
1796 rbgAllocationMap.at(j) = dci.
m_rnti;
1802 << (*itStat).second.at(harqId) + 1);
1806 NS_LOG_INFO(
"Cannot allocate retx due to RACH allocations for UE " << rnti);
1811 (*itStat).second.at((*itProcId).second) = (*itStat).second.at(harqId) + 1;
1812 (*itStat).second.at(harqId) = 0;
1813 (*itHarq).second.at((*itProcId).second) = dci;
1815 rntiAllocated.insert(dci.
m_rnti);
1819 NS_LOG_INFO(
this <<
" HARQ-ACK feedback from RNTI "
1820 <<
params.m_ulInfoList.at(i).m_rnti);
1825 std::map<uint16_t, uint32_t>::iterator it;
1830 std::set<uint16_t>::iterator itRnti = rntiAllocated.find((*it).first);
1832 if (((*it).second > 0) && (itRnti == rntiAllocated.end()))
1843 std::pair<uint16_t, std::vector<uint16_t>>(
params.m_sfnSf, rbgAllocationMap));
1852 uint16_t tempRbPerFlow = (ffrUlBandwidth) / (nflows + rntiAllocated.size());
1853 uint16_t rbPerFlow =
1854 (minContinuousUlBandwidth < tempRbPerFlow) ? minContinuousUlBandwidth : tempRbPerFlow;
1861 int rbAllocated = 0;
1863 std::map<uint16_t, fdtbfqsFlowPerf_t>::iterator itStats;
1885 std::set<uint16_t>::iterator itRnti = rntiAllocated.find((*it).first);
1886 if ((itRnti != rntiAllocated.end()) || ((*it).second == 0))
1889 NS_LOG_DEBUG(
this <<
" UE already allocated in HARQ -> discarded, RNTI "
1913 uldci.
m_rnti = (*it).first;
1915 bool allocated =
false;
1916 NS_LOG_INFO(
this <<
" RB Allocated " << rbAllocated <<
" rbPerFlow " << rbPerFlow
1917 <<
" flows " << nflows);
1923 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1925 if (rbMap.at(j) ==
true)
1938 NS_LOG_INFO(
this <<
"RNTI: " << (*it).first <<
" RB Allocated " << rbAllocated
1939 <<
" rbPerFlow " << rbPerFlow <<
" flows " << nflows);
1942 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1946 rbgAllocationMap.at(j) = (*it).first;
1948 rbAllocated += rbPerFlow;
1978 std::map<uint16_t, std::vector<double>>::iterator itCqi =
m_ueCqi.find((*it).first);
1989 "CQI of RNTI = " << (*it).first <<
" has expired");
1990 double minSinr = (*itCqi).second.at(uldci.
m_rbStart);
1997 double sinr = (*itCqi).second.at(i);
2009 double s = log2(1 + (std::pow(10, minSinr / 10) / ((-std::log(5.0 * 0.00005)) / 1.5)));
2010 cqi =
m_amc->GetCqiFromSpectralEfficiency(s);
2023 rbgAllocationMap.at(i) = 0;
2049 std::map<uint16_t, uint8_t>::iterator itProcId;
2055 harqId = (*itProcId).second;
2056 std::map<uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci =
2060 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
2063 (*itDci).second.at(harqId) = uldci;
2065 std::map<uint16_t, UlHarqProcessesStatus_t>::iterator itStat =
2069 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
2072 (*itStat).second.at(harqId) = 0;
2075 NS_LOG_INFO(
this <<
" UE Allocation RNTI " << (*it).first <<
" startPRB "
2077 <<
" CQI " << cqi <<
" MCS " << (uint32_t)uldci.
m_mcs <<
" TBsize "
2078 << uldci.
m_tbSize <<
" RbAlloc " << rbAllocated <<
" harqId "
2079 << (uint16_t)harqId);
2093 }
while (((*it).first !=
m_nextRntiUl) && (rbPerFlow != 0));
2096 std::pair<uint16_t, std::vector<uint16_t>>(
params.m_sfnSf, rbgAllocationMap));
2120 std::map<uint16_t, uint32_t>::iterator it;
2122 for (
unsigned int i = 0; i <
params.m_macCeList.size(); i++)
2133 uint32_t buffer = 0;
2134 for (uint8_t lcg = 0; lcg < 4; ++lcg)
2136 uint8_t bsrId =
params.m_macCeList.at(i).m_macCeValue.m_bufferStatus.at(lcg);
2140 uint16_t rnti =
params.m_macCeList.at(i).m_rnti;
2141 NS_LOG_LOGIC(
this <<
"RNTI=" << rnti <<
" buffer=" << buffer);
2146 m_ceBsrRxed.insert(std::pair<uint16_t, uint32_t>(rnti, buffer));
2151 (*it).second = buffer;
2185 switch (
params.m_ulCqi.m_type)
2188 std::map<uint16_t, std::vector<uint16_t>>::iterator itMap;
2189 std::map<uint16_t, std::vector<double>>::iterator itCqi;
2191 <<
" subframe no. " << (0xF &
params.m_sfnSf));
2197 for (uint32_t i = 0; i < (*itMap).second.size(); i++)
2201 itCqi =
m_ueCqi.find((*itMap).second.at(i));
2205 std::vector<double> newCqi;
2210 newCqi.push_back(sinr);
2219 std::pair<uint16_t, std::vector<double>>((*itMap).second.at(i), newCqi));
2227 (*itCqi).second.at(i) = sinr;
2228 NS_LOG_DEBUG(
this <<
" RNTI " << (*itMap).second.at(i) <<
" RB " << i <<
" SINR "
2231 std::map<uint16_t, uint32_t>::iterator itTimers;
2244 for (std::size_t i = 0; i <
params.m_vendorSpecificList.size(); i++)
2249 DynamicCast<SrsCqiRntiVsp>(
params.m_vendorSpecificList.at(i).m_value);
2250 rnti = vsp->GetRnti();
2253 std::map<uint16_t, std::vector<double>>::iterator itCqi;
2258 std::vector<double> newCqi;
2262 newCqi.push_back(sinr);
2263 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value "
2266 m_ueCqi.insert(std::pair<uint16_t, std::vector<double>>(rnti, newCqi));
2276 (*itCqi).second.at(j) = sinr;
2277 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value "
2281 std::map<uint16_t, uint32_t>::iterator itTimers;
2290 NS_FATAL_ERROR(
"FdTbfqFfMacScheduler supports only PUSCH and SRS UL-CQIs");
2302 std::map<uint16_t, uint32_t>::iterator itP10 =
m_p10CqiTimers.begin();
2305 NS_LOG_INFO(
this <<
" P10-CQI for user " << (*itP10).first <<
" is "
2307 if ((*itP10).second == 0)
2310 std::map<uint16_t, uint8_t>::iterator itMap =
m_p10CqiRxed.find((*itP10).first);
2312 " Does not find CQI report for user " << (*itP10).first);
2313 NS_LOG_INFO(
this <<
" P10-CQI expired for user " << (*itP10).first);
2315 std::map<uint16_t, uint32_t>::iterator temp = itP10;
2327 std::map<uint16_t, uint32_t>::iterator itA30 =
m_a30CqiTimers.begin();
2330 NS_LOG_INFO(
this <<
" A30-CQI for user " << (*itA30).first <<
" is "
2332 if ((*itA30).second == 0)
2335 std::map<uint16_t, SbMeasResult_s>::iterator itMap =
m_a30CqiRxed.find((*itA30).first);
2337 " Does not find CQI report for user " << (*itA30).first);
2338 NS_LOG_INFO(
this <<
" A30-CQI expired for user " << (*itA30).first);
2340 std::map<uint16_t, uint32_t>::iterator temp = itA30;
2356 std::map<uint16_t, uint32_t>::iterator itUl =
m_ueCqiTimers.begin();
2359 NS_LOG_INFO(
this <<
" UL-CQI for user " << (*itUl).first <<
" is "
2361 if ((*itUl).second == 0)
2364 std::map<uint16_t, std::vector<double>>::iterator itMap =
m_ueCqi.find((*itUl).first);
2366 " Does not find CQI report for user " << (*itUl).first);
2367 NS_LOG_INFO(
this <<
" UL-CQI exired for user " << (*itUl).first);
2368 (*itMap).second.clear();
2370 std::map<uint16_t, uint32_t>::iterator temp = itUl;
2385 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
2390 NS_LOG_INFO(
this <<
" UE " << rnti <<
" LC " << (uint16_t)lcid <<
" txqueue "
2391 << (*it).second.m_rlcTransmissionQueueSize <<
" retxqueue "
2392 << (*it).second.m_rlcRetransmissionQueueSize <<
" status "
2393 << (*it).second.m_rlcStatusPduSize <<
" decrease " << size);
2396 if (((*it).second.m_rlcStatusPduSize > 0) && (size >= (*it).second.m_rlcStatusPduSize))
2398 (*it).second.m_rlcStatusPduSize = 0;
2400 else if (((*it).second.m_rlcRetransmissionQueueSize > 0) &&
2401 (size >= (*it).second.m_rlcRetransmissionQueueSize))
2403 (*it).second.m_rlcRetransmissionQueueSize = 0;
2405 else if ((*it).second.m_rlcTransmissionQueueSize > 0)
2407 uint32_t rlcOverhead;
2422 if ((*it).second.m_rlcTransmissionQueueSize <= size - rlcOverhead)
2424 (*it).second.m_rlcTransmissionQueueSize = 0;
2428 (*it).second.m_rlcTransmissionQueueSize -= size - rlcOverhead;
2434 NS_LOG_ERROR(
this <<
" Does not find DL RLC Buffer Report of UE " << rnti);
2442 std::map<uint16_t, uint32_t>::iterator it =
m_ceBsrRxed.find(rnti);
2445 NS_LOG_INFO(
this <<
" UE " << rnti <<
" size " << size <<
" BSR " << (*it).second);
2446 if ((*it).second >= size)
2448 (*it).second -= size;
2457 NS_LOG_ERROR(
this <<
" Does not find BSR report info of UE " << rnti);
2464 NS_LOG_FUNCTION(
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);
2467 params.m_transmissionMode = txMode;
AttributeValue implementation for Boolean.
static uint32_t BsrId2BufferSize(uint8_t val)
Convert BSR ID to buffer size.
Implements the SCHED SAP and CSCHED SAP for a Frequency Domain Token Bank Fair Queue scheduler.
std::vector< uint16_t > m_rachAllocationMap
RACH allocation map.
void DoCschedLcConfigReq(const struct FfMacCschedSapProvider::CschedLcConfigReqParameters ¶ms)
CSched LC config request function.
std::vector< struct RachListElement_s > m_rachList
RACH list.
uint32_t m_tokenPoolSize
maximum size of token pool (byte)
std::map< uint16_t, fdtbfqsFlowPerf_t > m_flowStatsUl
Map of UE statistics (per RNTI basis)
void DoSchedUlCqiInfoReq(const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ¶ms)
Sched UL CQI info request function.
LteFfrSapProvider * m_ffrSapProvider
FFR SAP provider.
std::map< uint16_t, uint32_t > m_ceBsrRxed
Map of UE's buffer status reports received.
std::map< LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters > m_rlcBufferReq
Vectors of UE's LC info.
std::map< uint16_t, std::vector< double > > m_ueCqi
Map of UEs' UL-CQI per RBG.
static TypeId GetTypeId()
Get the type ID.
bool HarqProcessAvailability(uint16_t rnti)
Return the availability of free process for the RNTI specified.
uint64_t bankSize
the number of bytes in token bank
uint8_t UpdateHarqProcessId(uint16_t rnti)
Update and return a new process Id for the RNTI specified.
void DoCschedUeReleaseReq(const struct FfMacCschedSapProvider::CschedUeReleaseReqParameters ¶ms)
CSched UE release request function.
LteFfrSapUser * m_ffrSapUser
FFR SAP user.
std::map< uint16_t, uint8_t > m_ulHarqCurrentProcessId
UL HARQ current process ID.
void SetFfMacCschedSapUser(FfMacCschedSapUser *s) override
Set FF MAC Csched SAP user function.
void DoSchedUlTriggerReq(const struct FfMacSchedSapProvider::SchedUlTriggerReqParameters ¶ms)
Sched UL trigger request function.
std::map< uint16_t, DlHarqProcessesDciBuffer_t > m_dlHarqProcessesDciBuffer
DL HARQ process DCI buffer.
friend class MemberSchedSapProvider< FdTbfqFfMacScheduler >
allow MemberSchedSapProvider<FdTbfqFfMacScheduler> claass friend access
void RefreshHarqProcesses()
Refresh HARQ processes according to the timers.
LteFfrSapUser * GetLteFfrSapUser() override
Get FFR SAP user function.
~FdTbfqFfMacScheduler() override
Destructor.
void DoSchedDlRachInfoReq(const struct FfMacSchedSapProvider::SchedDlRachInfoReqParameters ¶ms)
Sched DL RACH info request function.
void DoCschedUeConfigReq(const struct FfMacCschedSapProvider::CschedUeConfigReqParameters ¶ms)
CSched UE config request function.
uint32_t m_cqiTimersThreshold
uint32_t m_creditableThreshold
threshold of flow credit
void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size)
Update DL RLC buffer info function.
void SetFfMacSchedSapUser(FfMacSchedSapUser *s) override
Set FF MAC sched SAP user function.
std::map< uint16_t, uint8_t > m_dlHarqCurrentProcessId
DL HARQ current process ID.
void DoSchedDlCqiInfoReq(const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)
Sched DL CQI info request function.
void DoSchedDlPagingBufferReq(const struct FfMacSchedSapProvider::SchedDlPagingBufferReqParameters ¶ms)
Sched DL paging buffer request function.
std::map< uint16_t, uint8_t > m_p10CqiRxed
Map of UE's DL CQI P01 received.
void DoSchedUlMacCtrlInfoReq(const struct FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters ¶ms)
Sched UL MAC control info request function.
std::vector< DlInfoListElement_s > m_dlInfoListBuffered
HARQ retx buffered.
FfMacCschedSapProvider::CschedCellConfigReqParameters m_cschedCellConfig
Csched cell config.
void RefreshDlCqiMaps()
Refresh DL CQI maps function.
void DoDispose() override
Destructor implementation.
double EstimateUlSinr(uint16_t rnti, uint16_t rb)
Estimate UL SNR function.
void DoSchedDlRlcBufferReq(const struct FfMacSchedSapProvider::SchedDlRlcBufferReqParameters ¶ms)
Sched DL RLC buffer request function.
std::map< uint16_t, SbMeasResult_s > m_a30CqiRxed
Map of UE's DL CQI A30 received.
std::map< uint16_t, UlHarqProcessesDciBuffer_t > m_ulHarqProcessesDciBuffer
UL HARQ process DCI buffer.
std::map< uint16_t, uint32_t > m_ueCqiTimers
Map of UEs' timers on UL-CQI per RBG.
std::map< uint16_t, uint32_t > m_p10CqiTimers
Map of UE's timers on DL CQI P01 received.
void SetLteFfrSapProvider(LteFfrSapProvider *s) override
Set FFR SAP provider function.
FfMacCschedSapProvider * GetFfMacCschedSapProvider() override
Get FF MAC CSched SAP provider function.
void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode)
Transmisson mode config update function.
void DoSchedUlNoiseInterferenceReq(const struct FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters ¶ms)
Sched UL noise interference request function.
std::map< uint16_t, UlHarqProcessesStatus_t > m_ulHarqProcessesStatus
UL HARQ process status.
uint32_t m_creditLimit
flow credit limit (byte)
int m_debtLimit
flow debt limit (byte)
void DoSchedUlSrInfoReq(const struct FfMacSchedSapProvider::SchedUlSrInfoReqParameters ¶ms)
Sched UL SR info request function.
std::map< uint16_t, uint32_t > m_a30CqiTimers
Map of UE's timers on DL CQI A30 received.
uint8_t m_ulGrantMcs
MCS for UL grant (default 0)
void RefreshUlCqiMaps()
Refresh UL CQI maps function.
FfMacCschedSapProvider * m_cschedSapProvider
CSched SAP provider.
std::map< uint16_t, DlHarqProcessesStatus_t > m_dlHarqProcessesStatus
DL HARQ process status.
void DoCschedCellConfigReq(const struct FfMacCschedSapProvider::CschedCellConfigReqParameters ¶ms)
Csched cell config request function.
FfMacSchedSapProvider * m_schedSapProvider
sched SAP provider
FdTbfqFfMacScheduler()
Constructor.
std::map< uint16_t, DlHarqRlcPduListBuffer_t > m_dlHarqProcessesRlcPduListBuffer
DL HARQ process RLC PDU list buffer.
void DoSchedDlTriggerReq(const struct FfMacSchedSapProvider::SchedDlTriggerReqParameters ¶ms)
Sched DL trigger request function.
std::map< uint16_t, uint8_t > m_uesTxMode
txMode of the UEs
void DoSchedDlMacBufferReq(const struct FfMacSchedSapProvider::SchedDlMacBufferReqParameters ¶ms)
Sched DL MAC buffer request function.
std::map< uint16_t, fdtbfqsFlowPerf_t > m_flowStatsDl
Map of UE statistics (per RNTI basis) in downlink.
FfMacSchedSapProvider * GetFfMacSchedSapProvider() override
Get FF MAC sched SAP provider function.
FfMacSchedSapUser * m_schedSapUser
sched SAP user
uint16_t m_nextRntiUl
RNTI of the next user to be served next scheduling in UL.
std::map< uint16_t, std::vector< uint16_t > > m_allocationMaps
Map of previous allocated UE per RBG (used to retrieve info from UL-CQI)
unsigned int LcActivePerFlow(uint16_t rnti)
LC Active per flow function.
std::map< uint16_t, DlHarqProcessesTimer_t > m_dlHarqProcessesTimer
DL HARQ process timer.
FfMacCschedSapUser * m_cschedSapUser
Csched SAP user.
friend class MemberCschedSapProvider< FdTbfqFfMacScheduler >
allow MemberCschedSapProvider<FdTbfqFfMacScheduler> class friend access
void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size)
Update UL RLC buffer info function.
int GetRbgSize(int dlbandwidth)
Get RBG size function.
bool m_harqOn
m_harqOn when false inhibit the HARQ mechanisms (by default active)
void DoCschedLcReleaseReq(const struct FfMacCschedSapProvider::CschedLcReleaseReqParameters ¶ms)
CSched LC release request function.
FfMacCschedSapUser class.
virtual void CschedUeConfigUpdateInd(const struct CschedUeConfigUpdateIndParameters ¶ms)=0
CSCHED_UE_UPDATE_IND.
virtual void CschedUeConfigCnf(const struct CschedUeConfigCnfParameters ¶ms)=0
CSCHED_UE_CONFIG_CNF.
virtual void SchedUlConfigInd(const struct SchedUlConfigIndParameters ¶ms)=0
SCHED_UL_CONFIG_IND.
virtual void SchedDlConfigInd(const struct 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.
Hold a signed integer type.
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...
virtual uint8_t GetTpc(uint16_t rnti)=0
GetTpc.
virtual void ReportUlCqiInfo(const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ¶ms)=0
ReportUlCqiInfo.
virtual bool IsUlRbgAvailableForUe(int i, uint16_t rnti)=0
Check if UE can be served on i-th RB in UL.
virtual uint16_t GetMinContinuousUlBandwidth()=0
Get the minimum continuous Ul bandwidth.
virtual bool IsDlRbgAvailableForUe(int i, uint16_t rnti)=0
Check if UE can be served on i-th RB in DL.
virtual void ReportDlCqiInfo(const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)=0
ReportDlCqiInfo.
virtual std::vector< bool > GetAvailableUlRbg()=0
Get vector of available RB in UL for this Cell.
virtual std::vector< bool > GetAvailableDlRbg()=0
Get vector of available RBG in DL for this Cell.
Service Access Point (SAP) offered by the eNodeB RRC instance to the Frequency Reuse algorithm instan...
Template for the implementation of the LteFfrSapUser as a member of an owner class of type C to which...
Smart pointer class similar to boost::intrusive_ptr.
static Time Now()
Return the current simulation virtual time.
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)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeChecker > MakeBooleanChecker()
Ptr< const AttributeAccessor > MakeIntegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
#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< uint8_t > DlHarqProcessesTimer_t
DL HARQ process timer vector typedef.
std::vector< uint8_t > DlHarqProcessesStatus_t
DL HARQ process status vector typedef.
std::vector< RlcPduList_t > DlHarqRlcPduListBuffer_t
vector of the 8 HARQ processes per UE
static const int FdTbfqType0AllocationRbg[4]
FdTbfqType0AllocationRbg value array.
std::vector< DlDciListElement_s > DlHarqProcessesDciBuffer_t
DL HARQ process DCI buffer vector typedef.
std::vector< uint8_t > UlHarqProcessesStatus_t
UL 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 builDataListElement.
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.
enum Result_e m_result
result
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.
uint8_t m_nrOfPdcchOfdmSymbols
number of PDCCH OFDM symbols
std::vector< struct BuildDataListElement_s > m_buildDataList
build data list
std::vector< struct BuildRarListElement_s > m_buildRarList
build rar list
Parameters of the SCHED_UL_CONFIG_IND primitive.
std::vector< struct 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?
Time flowStart
flow start time
int counter
the number of token borrow or given to token bank
uint32_t burstCredit
the maximum number of tokens connection i can borrow from the bank each time
int debtLimit
counter threshold that the flow cannot further borrow tokens from bank
uint32_t creditableThreshold
the flow cannot borrow token from bank until the number of token it has deposited to bank reaches thi...
uint64_t packetArrivalRate
packet arrival rate( byte/s)
uint32_t tokenPoolSize
current size of token pool (byte)
uint32_t maxTokenPoolSize
maximum size of token pool (byte)
uint64_t tokenGenerationRate
token generation rate ( byte/s )