26 #include <ns3/boolean.h>
27 #include <ns3/integer.h>
30 #include <ns3/pointer.h>
31 #include <ns3/simulator.h>
52 : m_cschedSapUser(nullptr),
53 m_schedSapUser(nullptr),
57 m_amc = CreateObject<LteAmc>();
89 TypeId(
"ns3::FdTbfqFfMacScheduler")
93 .AddAttribute(
"CqiTimerThreshold",
94 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
97 MakeUintegerChecker<uint32_t>())
98 .AddAttribute(
"DebtLimit",
99 "Flow debt limit (default -625000 bytes)",
102 MakeIntegerChecker<int>())
103 .AddAttribute(
"CreditLimit",
104 "Flow credit limit (default 625000 bytes)",
107 MakeUintegerChecker<uint32_t>())
108 .AddAttribute(
"TokenPoolSize",
109 "The maximum value of flow token pool (default 1 bytes)",
112 MakeUintegerChecker<uint32_t>())
113 .AddAttribute(
"CreditableThreshold",
114 "Threshold of flow credit (default 0 bytes)",
117 MakeUintegerChecker<uint32_t>())
119 .AddAttribute(
"HarqEnabled",
120 "Activate/Deactivate the HARQ [by default is active].",
124 .AddAttribute(
"UlGrantMcs",
125 "The MCS of the UL grant, must be [0..15] (default 0)",
128 MakeUintegerChecker<uint8_t>());
186 << (uint16_t)
params.m_transmissionMode);
194 dlHarqPrcStatus.resize(8, 0);
197 dlHarqProcessesTimer.resize(8, 0);
203 dlHarqRlcPdu.resize(2);
204 dlHarqRlcPdu.at(0).resize(8);
205 dlHarqRlcPdu.at(1).resize(8);
209 ulHarqPrcStatus.resize(8, 0);
217 (*it).second =
params.m_transmissionMode;
227 for (std::size_t i = 0; i <
params.m_logicalChannelConfigList.size(); i++)
233 uint64_t mbrDlInBytes =
234 params.m_logicalChannelConfigList.at(i).m_eRabMaximulBitrateDl / 8;
235 uint64_t mbrUlInBytes =
236 params.m_logicalChannelConfigList.at(i).m_eRabMaximulBitrateUl / 8;
237 NS_LOG_DEBUG(
"mbrDlInBytes: " << mbrDlInBytes <<
" mbrUlInBytes: " << mbrUlInBytes);
250 std::pair<uint16_t, fdtbfqsFlowPerf_t>(
params.m_rnti, flowStatsDl));
262 std::pair<uint16_t, fdtbfqsFlowPerf_t>(
params.m_rnti, flowStatsUl));
267 uint64_t mbrDlInBytes =
268 params.m_logicalChannelConfigList.at(i).m_eRabMaximulBitrateDl / 8;
269 uint64_t mbrUlInBytes =
270 params.m_logicalChannelConfigList.at(i).m_eRabMaximulBitrateUl / 8;
271 NS_LOG_DEBUG(
"mbrDlInBytes: " << mbrDlInBytes <<
" mbrUlInBytes: " << mbrUlInBytes);
272 m_flowStatsDl[(*it).first].tokenGenerationRate = mbrDlInBytes;
273 m_flowStatsUl[(*it).first].tokenGenerationRate = mbrUlInBytes;
283 for (std::size_t i = 0; i <
params.m_logicalChannelIdentity.size(); i++)
288 if (((*it).first.m_rnti ==
params.m_rnti) &&
289 ((*it).first.m_lcId ==
params.m_logicalChannelIdentity.at(i)))
324 if ((*it).first.m_rnti ==
params.m_rnti)
381 for (
int i = 0; i < 4; i++)
395 unsigned int lcActive = 0;
398 if (((*it).first.m_rnti == rnti) && (((*it).second.m_rlcTransmissionQueueSize > 0) ||
399 ((*it).second.m_rlcRetransmissionQueueSize > 0) ||
400 ((*it).second.m_rlcStatusPduSize > 0)))
404 if ((*it).first.m_rnti > rnti)
425 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
427 uint8_t i = (*it).second;
431 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
433 return (*itStat).second.at(i) == 0;
454 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
456 uint8_t i = (*it).second;
460 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
461 if ((*itStat).second.at(i) == 0)
464 (*itStat).second.at(i) = 1;
469 << rnti <<
" check before update with HarqProcessAvailability");
489 NS_LOG_DEBUG(
this <<
" Reset HARQ proc " << i <<
" for RNTI " << (*itTimers).first);
494 << (*itTimers).first);
496 (*itStat).second.at(i) = 0;
497 (*itTimers).second.at(i) = 0;
501 (*itTimers).second.at(i)++;
512 << (0xF &
params.m_sfnSf));
523 std::map<uint16_t, std::vector<uint16_t>> allocationMap;
524 std::vector<bool> rbgMap;
525 uint16_t rbgAllocatedNum = 0;
526 std::set<uint16_t> rntiAllocated;
530 for (
auto it = rbgMap.begin(); it != rbgMap.end(); it++)
545 (*itProcId).second = ((*itProcId).second + 1) %
HARQ_PROC_NUM;
549 std::vector<bool> ulRbMap;
552 uint8_t maxContinuousUlBandwidth = 0;
553 uint8_t tmpMinBandwidth = 0;
554 uint16_t ffrRbStartOffset = 0;
555 uint16_t tmpFfrRbStartOffset = 0;
558 for (
auto it = ulRbMap.begin(); it != ulRbMap.end(); it++)
562 if (tmpMinBandwidth > maxContinuousUlBandwidth)
564 maxContinuousUlBandwidth = tmpMinBandwidth;
565 ffrRbStartOffset = tmpFfrRbStartOffset;
571 if (tmpMinBandwidth == 0)
573 tmpFfrRbStartOffset = index;
580 if (tmpMinBandwidth > maxContinuousUlBandwidth)
582 maxContinuousUlBandwidth = tmpMinBandwidth;
583 ffrRbStartOffset = tmpFfrRbStartOffset;
587 uint16_t rbStart = 0;
588 rbStart = ffrRbStartOffset;
592 (*itRach).m_estimatedSize,
593 " Default UL Grant MCS does not allow to send RACH messages");
595 newRar.
m_rnti = (*itRach).m_rnti;
602 uint16_t tbSizeBits = 0;
604 while ((tbSizeBits < (*itRach).m_estimatedSize) &&
605 (rbStart + rbLen < (ffrRbStartOffset + maxContinuousUlBandwidth)))
610 if (tbSizeBits < (*itRach).m_estimatedSize)
622 NS_LOG_INFO(
this <<
" UL grant allocated to RNTI " << (*itRach).m_rnti <<
" rbStart "
623 << rbStart <<
" rbLen " << rbLen <<
" MCS " << (uint16_t)
m_ulGrantMcs
625 for (uint16_t i = rbStart; i < rbStart + rbLen; i++)
658 harqId = (*itProcId).second;
662 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
665 (*itDci).second.at(harqId) = uldci;
668 rbStart = rbStart + rbLen;
678 if (!
params.m_dlInfoList.empty())
682 params.m_dlInfoList.begin(),
683 params.m_dlInfoList.end());
688 if (!
params.m_dlInfoList.empty())
698 std::vector<DlInfoListElement_s> dlInfoListUntxed;
702 if (itRnti != rntiAllocated.end())
708 std::vector<bool> retx;
709 NS_LOG_INFO(
this <<
" Processing DLHARQ feedback");
714 retx.push_back(
false);
723 if (retx.at(0) || retx.at(1))
728 NS_LOG_INFO(
this <<
" HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId);
737 if (dci.
m_rv.size() == 1)
749 NS_LOG_INFO(
"Maximum number of retransmissions reached -> drop process");
753 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
756 (*it).second.at(harqId) = 0;
760 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
763 for (std::size_t
k = 0;
k < (*itRlcPdu).second.size();
k++)
765 (*itRlcPdu).second.at(
k).at(harqId).clear();
771 std::vector<int> dciRbg;
774 for (
int j = 0; j < 32; j++)
784 for (std::size_t j = 0; j < dciRbg.size(); j++)
786 if (rbgMap.at(dciRbg.at(j)))
796 for (std::size_t j = 0; j < dciRbg.size(); j++)
798 rbgMap.at(dciRbg.at(j)) =
true;
799 NS_LOG_INFO(
"RBG " << dciRbg.at(j) <<
" assigned");
803 NS_LOG_INFO(
this <<
" Send retx in the same RBGs");
809 uint8_t rbgId = (dciRbg.at(dciRbg.size() - 1) + 1) % rbgNum;
810 uint8_t startRbg = dciRbg.at(dciRbg.size() - 1);
811 std::vector<bool> rbgMapCopy = rbgMap;
812 while ((j < dciRbg.size()) && (startRbg != rbgId))
814 if (!rbgMapCopy.at(rbgId))
816 rbgMapCopy.at(rbgId) =
true;
817 dciRbg.at(j) = rbgId;
820 rbgId = (rbgId + 1) % rbgNum;
822 if (j == dciRbg.size())
825 uint32_t rbgMask = 0;
826 for (std::size_t
k = 0;
k < dciRbg.size();
k++)
828 rbgMask = rbgMask + (0x1 << dciRbg.at(
k));
833 NS_LOG_INFO(
this <<
" Move retx in RBGs " << dciRbg.size());
839 NS_LOG_INFO(
this <<
" No resource for this retx -> buffer it");
847 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI " << rnti);
849 for (std::size_t j = 0; j < nLayers; j++)
853 if (j >= dci.
m_ndi.size())
856 dci.
m_ndi.push_back(0);
857 dci.
m_rv.push_back(0);
858 dci.
m_mcs.push_back(0);
861 <<
" no txed (MIMO transition)");
867 (*itHarq).second.at(harqId).m_rv.at(j)++;
868 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" RV "
869 << (uint16_t)dci.
m_rv.at(j));
879 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" no retx");
882 for (std::size_t
k = 0;
k < (*itRlcPdu).second.at(0).at(dci.
m_harqProcess).size();
k++)
884 std::vector<RlcPduListElement_s> rlcPduListPerLc;
885 for (std::size_t j = 0; j < nLayers; j++)
889 if (j < dci.
m_ndi.size())
891 NS_LOG_INFO(
" layer " << (uint16_t)j <<
" tb size "
893 rlcPduListPerLc.push_back(
906 .m_logicalChannelIdentity;
908 rlcPduListPerLc.push_back(emptyElement);
912 if (!rlcPduListPerLc.empty())
919 (*itHarq).second.at(harqId).
m_rv = dci.
m_rv;
924 NS_FATAL_ERROR(
"Unable to find HARQ timer for RNTI " << (uint16_t)rnti);
926 (*itHarqTimer).second.at(harqId) = 0;
928 rntiAllocated.insert(rnti);
945 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
948 for (std::size_t
k = 0;
k < (*itRlcPdu).second.size();
k++)
957 if (rbgAllocatedNum == rbgNum)
970 if ((*itStats).second.tokenGenerationRate / 1000 + (*itStats).second.tokenPoolSize >
971 (*itStats).second.maxTokenPoolSize)
973 (*itStats).second.counter +=
974 (*itStats).second.tokenGenerationRate / 1000 -
975 ((*itStats).second.maxTokenPoolSize - (*itStats).second.tokenPoolSize);
976 (*itStats).second.tokenPoolSize = (*itStats).second.maxTokenPoolSize;
977 bankSize += (*itStats).second.tokenGenerationRate / 1000 -
978 ((*itStats).second.maxTokenPoolSize - (*itStats).second.tokenPoolSize);
982 (*itStats).second.tokenPoolSize += (*itStats).second.tokenGenerationRate / 1000;
986 std::set<uint16_t> allocatedRnti;
987 std::set<uint8_t> allocatedRbg;
990 while (totalRbg < rbgNum)
993 std::map<uint16_t, fdtbfqsFlowPerf_t>::iterator it;
995 double metricMax = 0.0;
996 bool firstRnti =
true;
999 auto itRnti = rntiAllocated.find((*it).first);
1003 if (itRnti != rntiAllocated.end())
1005 NS_LOG_DEBUG(
this <<
" RNTI discarded for HARQ tx" << (uint16_t)(*it).first);
1009 NS_LOG_DEBUG(
this <<
" RNTI discarded for HARQ id" << (uint16_t)(*it).first);
1018 NS_FATAL_ERROR(
"No Transmission Mode info on user " << (*it).first);
1023 for (
int k = 0;
k < rbgNum;
k++)
1025 for (uint8_t j = 0; j < nLayer; j++)
1033 cqiSum += (*itCqi).second.m_higherLayerSelected.at(
k).m_sbCqi.at(j);
1040 NS_LOG_INFO(
"Skip this flow, CQI==0, rnti:" << (*it).first);
1049 auto rnti = allocatedRnti.find((*it).first);
1050 if (rnti != allocatedRnti.end())
1056 (((double)(*it).second.counter) / ((double)(*it).second.tokenGenerationRate));
1065 if (metric > metricMax)
1080 allocatedRnti.insert((*itMax).first);
1083 uint32_t budget = 0;
1086 budget = (*itMax).second.counter - (*itMax).second.debtLimit;
1087 if (budget > (*itMax).second.burstCredit)
1089 budget = (*itMax).second.burstCredit;
1096 budget = budget + (*itMax).second.tokenPoolSize;
1107 uint32_t rlcBufSize = 0;
1112 if ((*itRlcBuf).first.m_rnti == (*itMax).first)
1114 lcid = (*itRlcBuf).first.m_lcId;
1121 rlcBufSize = (*itRlcBuf).second.m_rlcTransmissionQueueSize +
1122 (*itRlcBuf).second.m_rlcRetransmissionQueueSize +
1123 (*itRlcBuf).second.m_rlcStatusPduSize;
1125 if (budget > rlcBufSize)
1127 budget = rlcBufSize;
1129 <<
" RLC buffer size: " << rlcBufSize);
1134 uint32_t bytesTxed = 0;
1135 uint32_t bytesTxedTmp = 0;
1137 while (bytesTxed <= budget)
1145 NS_FATAL_ERROR(
"No Transmission Mode info on user " << (*it).first);
1150 double achievableRateMax = 0.0;
1152 for (
int k = 0;
k < rbgNum;
k++)
1154 auto rbg = allocatedRbg.find(
k);
1155 if (rbg != allocatedRbg.end())
1170 std::vector<uint8_t> sbCqi;
1173 sbCqi = std::vector<uint8_t>(nLayer, 1);
1177 sbCqi = (*itCqi).second.m_higherLayerSelected.at(
k).m_sbCqi;
1179 uint8_t cqi1 = sbCqi.at(0);
1181 if (sbCqi.size() > 1)
1192 double achievableRate = 0.0;
1193 for (uint8_t j = 0; j < nLayer; j++)
1196 if (sbCqi.size() > j)
1198 mcs =
m_amc->GetMcsFromCqi(sbCqi.at(j));
1205 achievableRate += ((
m_amc->GetDlTbSizeFromMcs(mcs, rbgSize) / 8) /
1209 if (achievableRate > achievableRateMax)
1211 achievableRateMax = achievableRate;
1218 if (rbgIndex == rbgNum)
1227 allocatedRbg.insert(rbgIndex);
1231 auto itMap = allocationMap.find((*itMax).first);
1232 uint16_t RbgPerRnti;
1233 if (itMap == allocationMap.end())
1236 std::vector<uint16_t> tempMap;
1237 tempMap.push_back(rbgIndex);
1238 allocationMap[(*itMax).first] = tempMap;
1239 itMap = allocationMap.find(
1244 (*itMap).second.push_back(rbgIndex);
1246 rbgMap.at(rbgIndex) =
true;
1248 RbgPerRnti = (*itMap).second.size();
1251 std::vector<uint8_t> worstCqi(2, 15);
1254 for (std::size_t
k = 0;
k < (*itMap).second.size();
k++)
1256 if ((*itCqi).second.m_higherLayerSelected.size() > (*itMap).second.at(
k))
1258 for (uint8_t j = 0; j < nLayer; j++)
1261 .
second.m_higherLayerSelected.at((*itMap).second.at(
k))
1262 .m_sbCqi.size() > j)
1265 .
second.m_higherLayerSelected.at((*itMap).second.at(
k))
1266 .m_sbCqi.at(j)) < worstCqi.at(j))
1270 .second.m_higherLayerSelected.at((*itMap).second.at(
k))
1283 for (uint8_t j = 0; j < nLayer; j++)
1293 for (uint8_t j = 0; j < nLayer; j++)
1299 bytesTxedTmp = bytesTxed;
1301 for (uint8_t j = 0; j < nLayer; j++)
1303 int tbSize = (
m_amc->GetDlTbSizeFromMcs(
m_amc->GetMcsFromCqi(worstCqi.at(j)),
1304 RbgPerRnti * rbgSize) /
1306 bytesTxed += tbSize;
1312 if (bytesTxed > budget)
1314 NS_LOG_DEBUG(
"budget: " << budget <<
" bytesTxed: " << bytesTxed <<
" at "
1316 auto itMap = allocationMap.find((*itMax).first);
1317 (*itMap).second.pop_back();
1318 allocatedRbg.erase(rbgIndex);
1319 bytesTxed = bytesTxedTmp;
1321 rbgMap.at(rbgIndex) =
false;
1324 if ((*itMap).second.empty())
1326 itMap = allocationMap.erase(itMap);
1331 if (allocationMap.find((*itMax).first) != allocationMap.end())
1334 if (bytesTxed <= (*itMax).second.tokenPoolSize)
1336 (*itMax).second.tokenPoolSize -= bytesTxed;
1340 (*itMax).second.counter =
1341 (*itMax).second.counter - (bytesTxed - (*itMax).second.tokenPoolSize);
1342 (*itMax).second.tokenPoolSize = 0;
1343 if (
bankSize <= (bytesTxed - (*itMax).second.tokenPoolSize))
1357 auto itMap = allocationMap.begin();
1358 while (itMap != allocationMap.end())
1360 NS_LOG_DEBUG(
"Preparing DCI for RNTI " << (*itMap).first);
1363 newEl.
m_rnti = (*itMap).first;
1366 newDci.
m_rnti = (*itMap).first;
1374 lcActives = (uint16_t)65535;
1376 uint16_t RgbPerRnti = (*itMap).second.size();
1381 NS_FATAL_ERROR(
"No Transmission Mode info on user " << (*itMap).first);
1384 std::vector<uint8_t> worstCqi(2, 15);
1387 for (std::size_t
k = 0;
k < (*itMap).second.size();
k++)
1389 if ((*itCqi).second.m_higherLayerSelected.size() > (*itMap).second.at(
k))
1391 NS_LOG_INFO(
this <<
" RBG " << (*itMap).second.at(
k) <<
" CQI "
1392 << (uint16_t)((*itCqi)
1393 .second.m_higherLayerSelected
1394 .at((*itMap).second.at(
k))
1396 for (uint8_t j = 0; j < nLayer; j++)
1399 .
second.m_higherLayerSelected.at((*itMap).second.at(
k))
1400 .m_sbCqi.size() > j)
1403 .
second.m_higherLayerSelected.at((*itMap).second.at(
k))
1404 .m_sbCqi.at(j)) < worstCqi.at(j))
1408 .second.m_higherLayerSelected.at((*itMap).second.at(
k))
1421 for (uint8_t j = 0; j < nLayer; j++)
1430 for (uint8_t j = 0; j < nLayer; j++)
1435 for (uint8_t j = 0; j < nLayer; j++)
1437 NS_LOG_INFO(
this <<
" Layer " << (uint16_t)j <<
" CQI selected "
1438 << (uint16_t)worstCqi.at(j));
1440 for (uint8_t j = 0; j < nLayer; j++)
1442 newDci.
m_mcs.push_back(
m_amc->GetMcsFromCqi(worstCqi.at(j)));
1443 int tbSize = (
m_amc->GetDlTbSizeFromMcs(newDci.
m_mcs.at(j), RgbPerRnti * rbgSize) /
1446 NS_LOG_INFO(
this <<
" Layer " << (uint16_t)j <<
" MCS selected"
1447 << (uint16_t)
m_amc->GetMcsFromCqi(worstCqi.at(j)));
1452 uint32_t rbgMask = 0;
1453 for (std::size_t
k = 0;
k < (*itMap).second.size();
k++)
1455 rbgMask = rbgMask + (0x1 << (*itMap).second.at(
k));
1456 NS_LOG_INFO(
this <<
" Allocated RBG " << (*itMap).second.at(
k));
1463 if (((*itBufReq).first.m_rnti == (*itMap).first) &&
1464 (((*itBufReq).second.m_rlcTransmissionQueueSize > 0) ||
1465 ((*itBufReq).second.m_rlcRetransmissionQueueSize > 0) ||
1466 ((*itBufReq).second.m_rlcStatusPduSize > 0)))
1468 std::vector<RlcPduListElement_s> newRlcPduLe;
1469 for (uint8_t j = 0; j < nLayer; j++)
1475 <<
" size " << newRlcEl.
m_size <<
" layer " << (uint16_t)j);
1476 newRlcPduLe.push_back(newRlcEl);
1486 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
1489 (*itRlcPdu).second.at(j).at(newDci.
m_harqProcess).push_back(newRlcEl);
1494 if ((*itBufReq).first.m_rnti > (*itMap).first)
1499 for (uint8_t j = 0; j < nLayer; j++)
1501 newDci.
m_ndi.push_back(1);
1502 newDci.
m_rv.push_back(0);
1507 newEl.
m_dci = newDci;
1515 NS_FATAL_ERROR(
"Unable to find RNTI entry in DCI HARQ buffer for RNTI "
1555 for (
unsigned int i = 0; i <
params.m_cqiList.size(); i++)
1561 uint16_t rnti =
params.m_cqiList.at(i).m_rnti;
1567 params.m_cqiList.at(i).m_wbCqi.at(0);
1574 (*it).second =
params.m_cqiList.at(i).m_wbCqi.at(0);
1583 uint16_t rnti =
params.m_cqiList.at(i).m_rnti;
1594 (*it).second =
params.m_cqiList.at(i).m_sbMeasResult;
1609 auto itCqi =
m_ueCqi.find(rnti);
1619 unsigned int sinrNum = 0;
1622 double sinr = (*itCqi).second.at(i);
1629 double estimatedSinr = (sinrNum > 0) ? (sinrSum / sinrNum) : DBL_MAX;
1631 (*itCqi).second.at(rb) = estimatedSinr;
1632 return estimatedSinr;
1641 << (0xF &
params.m_sfnSf) <<
" size " <<
params.m_ulInfoList.size());
1648 std::vector<bool> rbMap;
1649 uint16_t rbAllocatedNum = 0;
1650 std::set<uint16_t> rntiAllocated;
1651 std::vector<uint16_t> rbgAllocationMap;
1662 for (
auto it = rbMap.begin(); it != rbMap.end(); it++)
1676 if (rbgAllocationMap.at(i) != 0)
1686 for (std::size_t i = 0; i <
params.m_ulInfoList.size(); i++)
1691 uint16_t rnti =
params.m_ulInfoList.at(i).m_rnti;
1695 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1698 NS_LOG_INFO(
this <<
" UL-HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId
1699 <<
" i " << i <<
" size " <<
params.m_ulInfoList.size());
1703 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1710 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1712 if ((*itStat).second.at(harqId) >= 3)
1714 NS_LOG_INFO(
"Max number of retransmissions reached (UL)-> drop process");
1732 rbgAllocationMap.at(j) = dci.
m_rnti;
1738 << (*itStat).second.at(harqId) + 1);
1742 NS_LOG_INFO(
"Cannot allocate retx due to RACH allocations for UE " << rnti);
1747 (*itStat).second.at((*itProcId).second) = (*itStat).second.at(harqId) + 1;
1748 (*itStat).second.at(harqId) = 0;
1749 (*itHarq).second.at((*itProcId).second) = dci;
1751 rntiAllocated.insert(dci.
m_rnti);
1755 NS_LOG_INFO(
this <<
" HARQ-ACK feedback from RNTI "
1756 <<
params.m_ulInfoList.at(i).m_rnti);
1761 std::map<uint16_t, uint32_t>::iterator it;
1766 auto itRnti = rntiAllocated.find((*it).first);
1768 if (((*it).second > 0) && (itRnti == rntiAllocated.end()))
1787 uint16_t tempRbPerFlow = (ffrUlBandwidth) / (nflows + rntiAllocated.size());
1788 uint16_t rbPerFlow =
1789 (minContinuousUlBandwidth < tempRbPerFlow) ? minContinuousUlBandwidth : tempRbPerFlow;
1796 int rbAllocated = 0;
1819 auto itRnti = rntiAllocated.find((*it).first);
1820 if ((itRnti != rntiAllocated.end()) || ((*it).second == 0))
1823 NS_LOG_DEBUG(
this <<
" UE already allocated in HARQ -> discarded, RNTI "
1847 uldci.
m_rnti = (*it).first;
1849 bool allocated =
false;
1850 NS_LOG_INFO(
this <<
" RB Allocated " << rbAllocated <<
" rbPerFlow " << rbPerFlow
1851 <<
" flows " << nflows);
1857 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1872 NS_LOG_INFO(
this <<
"RNTI: " << (*it).first <<
" RB Allocated " << rbAllocated
1873 <<
" rbPerFlow " << rbPerFlow <<
" flows " << nflows);
1876 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1880 rbgAllocationMap.at(j) = (*it).first;
1882 rbAllocated += rbPerFlow;
1911 auto itCqi =
m_ueCqi.find((*it).first);
1922 "CQI of RNTI = " << (*it).first <<
" has expired");
1923 double minSinr = (*itCqi).second.at(uldci.
m_rbStart);
1930 double sinr = (*itCqi).second.at(i);
1942 double s = log2(1 + (std::pow(10, minSinr / 10) / ((-std::log(5.0 * 0.00005)) / 1.5)));
1943 cqi =
m_amc->GetCqiFromSpectralEfficiency(s);
1956 rbgAllocationMap.at(i) = 0;
1987 harqId = (*itProcId).second;
1991 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
1994 (*itDci).second.at(harqId) = uldci;
1999 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
2002 (*itStat).second.at(harqId) = 0;
2005 NS_LOG_INFO(
this <<
" UE Allocation RNTI " << (*it).first <<
" startPRB "
2007 <<
" CQI " << cqi <<
" MCS " << (uint32_t)uldci.
m_mcs <<
" TBsize "
2008 << uldci.
m_tbSize <<
" RbAlloc " << rbAllocated <<
" harqId "
2009 << (uint16_t)harqId);
2023 }
while (((*it).first !=
m_nextRntiUl) && (rbPerFlow != 0));
2049 for (
unsigned int i = 0; i <
params.m_macCeList.size(); i++)
2060 uint32_t buffer = 0;
2061 for (uint8_t lcg = 0; lcg < 4; ++lcg)
2063 uint8_t bsrId =
params.m_macCeList.at(i).m_macCeValue.m_bufferStatus.at(lcg);
2067 uint16_t rnti =
params.m_macCeList.at(i).m_rnti;
2068 NS_LOG_LOGIC(
this <<
"RNTI=" << rnti <<
" buffer=" << buffer);
2073 m_ceBsrRxed.insert(std::pair<uint16_t, uint32_t>(rnti, buffer));
2078 (*it).second = buffer;
2112 switch (
params.m_ulCqi.m_type)
2116 <<
" subframe no. " << (0xF &
params.m_sfnSf));
2122 for (uint32_t i = 0; i < (*itMap).second.size(); i++)
2126 auto itCqi =
m_ueCqi.find((*itMap).second.at(i));
2130 std::vector<double> newCqi;
2135 newCqi.push_back(sinr);
2143 m_ueCqi[(*itMap).second.at(i)] = newCqi;
2150 (*itCqi).second.at(i) = sinr;
2151 NS_LOG_DEBUG(
this <<
" RNTI " << (*itMap).second.at(i) <<
" RB " << i <<
" SINR "
2166 for (std::size_t i = 0; i <
params.m_vendorSpecificList.size(); i++)
2171 DynamicCast<SrsCqiRntiVsp>(
params.m_vendorSpecificList.at(i).m_value);
2172 rnti = vsp->GetRnti();
2175 auto itCqi =
m_ueCqi.find(rnti);
2179 std::vector<double> newCqi;
2183 newCqi.push_back(sinr);
2184 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value "
2187 m_ueCqi.insert(std::pair<uint16_t, std::vector<double>>(rnti, newCqi));
2197 (*itCqi).second.at(j) = sinr;
2198 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value "
2210 NS_FATAL_ERROR(
"FdTbfqFfMacScheduler supports only PUSCH and SRS UL-CQIs");
2225 NS_LOG_INFO(
this <<
" P10-CQI for user " << (*itP10).first <<
" is "
2227 if ((*itP10).second == 0)
2232 " Does not find CQI report for user " << (*itP10).first);
2233 NS_LOG_INFO(
this <<
" P10-CQI expired for user " << (*itP10).first);
2250 NS_LOG_INFO(
this <<
" A30-CQI for user " << (*itA30).first <<
" is "
2252 if ((*itA30).second == 0)
2257 " Does not find CQI report for user " << (*itA30).first);
2258 NS_LOG_INFO(
this <<
" A30-CQI expired for user " << (*itA30).first);
2279 NS_LOG_INFO(
this <<
" UL-CQI for user " << (*itUl).first <<
" is "
2281 if ((*itUl).second == 0)
2284 auto itMap =
m_ueCqi.find((*itUl).first);
2286 " Does not find CQI report for user " << (*itUl).first);
2287 NS_LOG_INFO(
this <<
" UL-CQI exired for user " << (*itUl).first);
2288 (*itMap).second.clear();
2309 NS_LOG_INFO(
this <<
" UE " << rnti <<
" LC " << (uint16_t)lcid <<
" txqueue "
2310 << (*it).second.m_rlcTransmissionQueueSize <<
" retxqueue "
2311 << (*it).second.m_rlcRetransmissionQueueSize <<
" status "
2312 << (*it).second.m_rlcStatusPduSize <<
" decrease " << size);
2315 if (((*it).second.m_rlcStatusPduSize > 0) && (size >= (*it).second.m_rlcStatusPduSize))
2317 (*it).second.m_rlcStatusPduSize = 0;
2319 else if (((*it).second.m_rlcRetransmissionQueueSize > 0) &&
2320 (size >= (*it).second.m_rlcRetransmissionQueueSize))
2322 (*it).second.m_rlcRetransmissionQueueSize = 0;
2324 else if ((*it).second.m_rlcTransmissionQueueSize > 0)
2326 uint32_t rlcOverhead;
2341 if ((*it).second.m_rlcTransmissionQueueSize <= size - rlcOverhead)
2343 (*it).second.m_rlcTransmissionQueueSize = 0;
2347 (*it).second.m_rlcTransmissionQueueSize -= size - rlcOverhead;
2353 NS_LOG_ERROR(
this <<
" Does not find DL RLC Buffer Report of UE " << rnti);
2364 NS_LOG_INFO(
this <<
" UE " << rnti <<
" size " << size <<
" BSR " << (*it).second);
2365 if ((*it).second >= size)
2367 (*it).second -= size;
2376 NS_LOG_ERROR(
this <<
" Does not find BSR report info of UE " << rnti);
2383 NS_LOG_FUNCTION(
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);
2386 params.m_transmissionMode = txMode;
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.
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)
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.
void DoSchedDlPagingBufferReq(const FfMacSchedSapProvider::SchedDlPagingBufferReqParameters ¶ms)
Sched DL paging buffer request function.
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.
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.
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 DoCschedLcConfigReq(const FfMacCschedSapProvider::CschedLcConfigReqParameters ¶ms)
CSched LC config request function.
void DoSchedDlMacBufferReq(const FfMacSchedSapProvider::SchedDlMacBufferReqParameters ¶ms)
Sched DL MAC buffer 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.
std::map< uint16_t, uint8_t > m_p10CqiRxed
Map of UE's DL CQI P01 received.
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.
std::vector< RachListElement_s > m_rachList
RACH list.
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.
std::map< uint16_t, UlHarqProcessesStatus_t > m_ulHarqProcessesStatus
UL HARQ process status.
uint32_t m_creditLimit
flow credit limit (byte)
void DoSchedDlRlcBufferReq(const FfMacSchedSapProvider::SchedDlRlcBufferReqParameters ¶ms)
Sched DL RLC buffer request function.
int m_debtLimit
flow debt limit (byte)
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 DoSchedUlNoiseInterferenceReq(const FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters ¶ms)
Sched UL noise interference request function.
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 DoSchedDlRachInfoReq(const FfMacSchedSapProvider::SchedDlRachInfoReqParameters ¶ms)
Sched DL RACH info 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 DoSchedUlMacCtrlInfoReq(const FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters ¶ms)
Sched UL MAC control info request function.
void DoSchedUlCqiInfoReq(const FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ¶ms)
Sched UL CQI info request function.
void DoCschedLcReleaseReq(const FfMacCschedSapProvider::CschedLcReleaseReqParameters ¶ms)
CSched LC release request function.
std::map< uint16_t, uint8_t > m_uesTxMode
txMode of the UEs
void DoSchedDlCqiInfoReq(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)
Sched DL CQI info 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.
void DoCschedUeConfigReq(const FfMacCschedSapProvider::CschedUeConfigReqParameters ¶ms)
CSched UE config request function.
FfMacSchedSapUser * m_schedSapUser
sched SAP user
void DoCschedCellConfigReq(const FfMacCschedSapProvider::CschedCellConfigReqParameters ¶ms)
Csched cell config request function.
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.
void DoCschedUeReleaseReq(const FfMacCschedSapProvider::CschedUeReleaseReqParameters ¶ms)
CSched UE release request function.
void DoSchedUlSrInfoReq(const FfMacSchedSapProvider::SchedUlSrInfoReqParameters ¶ms)
Sched UL SR info request 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.
void DoSchedUlTriggerReq(const FfMacSchedSapProvider::SchedUlTriggerReqParameters ¶ms)
Sched UL trigger request function.
void DoSchedDlTriggerReq(const FfMacSchedSapProvider::SchedDlTriggerReqParameters ¶ms)
Sched DL trigger request function.
bool m_harqOn
m_harqOn when false inhibit the HARQ mechanisms (by default active)
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.
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 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 void ReportDlCqiInfo(const FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)=0
ReportDlCqiInfo.
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 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...
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeBooleanChecker()
constexpr double NO_SINR
Value for SINR outside the range defined by FF-API, used to indicate that there is no CQI for this el...
std::vector< UlDciListElement_s > UlHarqProcessesDciBuffer_t
UL HARQ process DCI buffer vector.
Ptr< const AttributeAccessor > MakeIntegerAccessor(T1 a1)
std::vector< RlcPduList_t > DlHarqRlcPduListBuffer_t
Vector of the 8 HARQ processes per UE.
constexpr uint32_t HARQ_DL_TIMEOUT
HARQ DL timeout.
constexpr uint32_t HARQ_PROC_NUM
Number of HARQ processes.
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
std::vector< DlDciListElement_s > DlHarqProcessesDciBuffer_t
DL HARQ process DCI buffer vector.
std::vector< uint8_t > UlHarqProcessesStatus_t
UL HARQ process status vector.
std::vector< uint8_t > DlHarqProcessesTimer_t
DL HARQ process timer vector.
static const int FdTbfqType0AllocationRbg[4]
FdTbfqType0AllocationRbg value array.
std::vector< uint8_t > DlHarqProcessesStatus_t
DL HARQ process status vector.
params
Fit Fluctuating Two Ray model to the 3GPP TR 38.901 using the Anderson-Darling goodness-of-fit ##.
See section 4.3.8 buildDataListElement.
std::vector< std::vector< struct RlcPduListElement_s > > m_rlcPduList
RLC PDU list.
struct DlDciListElement_s m_dci
DCI.
See section 4.3.10 buildRARListElement.
See section 4.3.1 dlDciListElement.
std::vector< uint8_t > m_ndi
New data indicator.
uint8_t m_harqProcess
HARQ process.
uint32_t m_rbBitmap
RB bitmap.
std::vector< uint8_t > m_mcs
MCS.
uint8_t m_resAlloc
The type of resource allocation.
std::vector< uint16_t > m_tbsSize
The TBs size.
std::vector< uint8_t > m_rv
Redundancy version.
uint8_t m_tpc
Tx power control command.
Parameters of the API primitives.
uint16_t m_dlBandwidth
DL bandwidth.
uint16_t m_ulBandwidth
UL bandwidth.
Parameters of the CSCHED_LC_CONFIG_REQ primitive.
Parameters of the CSCHED_LC_RELEASE_REQ primitive.
Parameters of the CSCHED_UE_CONFIG_REQ primitive.
Parameters of the CSCHED_UE_RELEASE_REQ primitive.
Parameters of the CSCHED_UE_CONFIG_CNF primitive.
Parameters of the CSCHED_UE_CONFIG_UPDATE_IND primitive.
Parameters of the SCHED_DL_CQI_INFO_REQ primitive.
Parameters of the SCHED_DL_MAC_BUFFER_REQ primitive.
Parameters of the SCHED_DL_PAGING_BUFFER_REQ primitive.
Parameters of the SCHED_DL_RACH_INFO_REQ primitive.
Parameters of the API primitives.
Parameters of the SCHED_DL_TRIGGER_REQ primitive.
Parameters of the SCHED_UL_CQI_INFO_REQ primitive.
Parameters of the SCHED_UL_MAC_CTRL_INFO_REQ primitive.
Parameters of the SCHED_UL_NOISE_INTERFERENCE_REQ primitive.
Parameters of the SCHED_UL_SR_INFO_REQ primitive.
Parameters of the SCHED_UL_TRIGGER_REQ primitive.
Parameters of the API primitives.
std::vector< BuildDataListElement_s > m_buildDataList
build data list
std::vector< BuildRarListElement_s > m_buildRarList
build rar list
uint8_t m_nrOfPdcchOfdmSymbols
number of PDCCH OFDM symbols
Parameters of the SCHED_UL_CONFIG_IND primitive.
std::vector< UlDciListElement_s > m_dciList
DCI list.
See section 4.3.9 rlcPDU_ListElement.
uint8_t m_logicalChannelIdentity
logical channel identity
See section 4.3.2 ulDciListElement.
int8_t m_pdcchPowerOffset
CCH power offset.
int8_t m_tpc
Tx power control command.
uint8_t m_dai
DL assignment index.
uint8_t m_cceIndex
Control Channel Element index.
uint8_t m_ulIndex
UL index.
uint8_t m_ueTxAntennaSelection
UE antenna selection.
bool m_cqiRequest
CQI request.
uint8_t m_freqHopping
freq hopping
uint8_t m_aggrLevel
The aggregation level.
int8_t m_tpc
Tx power control command.
bool m_cqiRequest
CQI request?
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 )