20 #include <ns3/boolean.h>
22 #include <ns3/lte-amc.h>
23 #include <ns3/lte-vendor-specific-parameters.h>
25 #include <ns3/pf-ff-mac-scheduler.h>
26 #include <ns3/pointer.h>
27 #include <ns3/simulator.h>
48 : m_cschedSapUser(nullptr),
49 m_schedSapUser(nullptr),
53 m_amc = CreateObject<LteAmc>();
85 TypeId(
"ns3::PfFfMacScheduler")
89 .AddAttribute(
"CqiTimerThreshold",
90 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
93 MakeUintegerChecker<uint32_t>())
94 .AddAttribute(
"HarqEnabled",
95 "Activate/Deactivate the HARQ [by default is active].",
99 .AddAttribute(
"UlGrantMcs",
100 "The MCS of the UL grant, must be [0..15] (default 0)",
103 MakeUintegerChecker<uint8_t>());
161 << (uint16_t)
params.m_transmissionMode);
169 dlHarqPrcStatus.resize(8, 0);
171 std::pair<uint16_t, DlHarqProcessesStatus_t>(
params.m_rnti, dlHarqPrcStatus));
173 dlHarqProcessesTimer.resize(8, 0);
175 std::pair<uint16_t, DlHarqProcessesTimer_t>(
params.m_rnti, dlHarqProcessesTimer));
179 std::pair<uint16_t, DlHarqProcessesDciBuffer_t>(
params.m_rnti, dlHarqdci));
181 dlHarqRlcPdu.resize(2);
182 dlHarqRlcPdu.at(0).resize(8);
183 dlHarqRlcPdu.at(1).resize(8);
185 std::pair<uint16_t, DlHarqRlcPduListBuffer_t>(
params.m_rnti, dlHarqRlcPdu));
188 ulHarqPrcStatus.resize(8, 0);
190 std::pair<uint16_t, UlHarqProcessesStatus_t>(
params.m_rnti, ulHarqPrcStatus));
194 std::pair<uint16_t, UlHarqProcessesDciBuffer_t>(
params.m_rnti, ulHarqdci));
198 (*it).second =
params.m_transmissionMode;
208 std::map<uint16_t, pfsFlowPerf_t>::iterator it;
209 for (std::size_t i = 0; i <
params.m_logicalChannelConfigList.size(); i++)
236 for (std::size_t i = 0; i <
params.m_logicalChannelIdentity.size(); i++)
238 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
240 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
243 if (((*it).first.m_rnti ==
params.m_rnti) &&
244 ((*it).first.m_lcId ==
params.m_logicalChannelIdentity.at(i)))
276 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
278 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
281 if ((*it).first.m_rnti ==
params.m_rnti)
305 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
314 std::pair<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>(flow,
342 for (
int i = 0; i < 4; i++)
356 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
357 unsigned int lcActive = 0;
360 if (((*it).first.m_rnti == rnti) && (((*it).second.m_rlcTransmissionQueueSize > 0) ||
361 ((*it).second.m_rlcRetransmissionQueueSize > 0) ||
362 ((*it).second.m_rlcStatusPduSize > 0)))
366 if ((*it).first.m_rnti > rnti)
384 std::map<uint16_t, DlHarqProcessesStatus_t>::iterator itStat =
388 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
390 uint8_t i = (*it).second;
394 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
395 if ((*itStat).second.at(i) == 0)
420 std::map<uint16_t, DlHarqProcessesStatus_t>::iterator itStat =
424 NS_FATAL_ERROR(
"No Process Id Statusfound for this RNTI " << rnti);
426 uint8_t i = (*it).second;
430 }
while (((*itStat).second.at(i) != 0) && (i != (*it).second));
431 if ((*itStat).second.at(i) == 0)
434 (*itStat).second.at(i) = 1;
439 << rnti <<
" check before update with HarqProcessAvailability");
442 return ((*it).second);
450 std::map<uint16_t, DlHarqProcessesTimer_t>::iterator itTimers;
460 NS_LOG_DEBUG(
this <<
" Reset HARQ proc " << i <<
" for RNTI " << (*itTimers).first);
461 std::map<uint16_t, DlHarqProcessesStatus_t>::iterator itStat =
466 << (*itTimers).first);
468 (*itStat).second.at(i) = 0;
469 (*itTimers).second.at(i) = 0;
473 (*itTimers).second.at(i)++;
484 << (0xF &
params.m_sfnSf));
495 std::map<uint16_t, std::vector<uint16_t>> allocationMap;
496 std::vector<bool> rbgMap;
497 uint16_t rbgAllocatedNum = 0;
498 std::set<uint16_t> rntiAllocated;
502 for (std::vector<bool>::iterator it = rbgMap.begin(); it != rbgMap.end(); it++)
513 std::map<uint16_t, uint8_t>::iterator itProcId;
517 (*itProcId).second = ((*itProcId).second + 1) %
HARQ_PROC_NUM;
521 std::vector<bool> ulRbMap;
524 uint8_t maxContinuousUlBandwidth = 0;
525 uint8_t tmpMinBandwidth = 0;
526 uint16_t ffrRbStartOffset = 0;
527 uint16_t tmpFfrRbStartOffset = 0;
530 for (std::vector<bool>::iterator it = ulRbMap.begin(); it != ulRbMap.end(); it++)
534 if (tmpMinBandwidth > maxContinuousUlBandwidth)
536 maxContinuousUlBandwidth = tmpMinBandwidth;
537 ffrRbStartOffset = tmpFfrRbStartOffset;
543 if (tmpMinBandwidth == 0)
545 tmpFfrRbStartOffset = index;
552 if (tmpMinBandwidth > maxContinuousUlBandwidth)
554 maxContinuousUlBandwidth = tmpMinBandwidth;
555 ffrRbStartOffset = tmpFfrRbStartOffset;
559 uint16_t rbStart = 0;
560 rbStart = ffrRbStartOffset;
561 std::vector<struct RachListElement_s>::iterator itRach;
565 (*itRach).m_estimatedSize,
566 " Default UL Grant MCS does not allow to send RACH messages");
568 newRar.
m_rnti = (*itRach).m_rnti;
575 uint16_t tbSizeBits = 0;
577 while ((tbSizeBits < (*itRach).m_estimatedSize) &&
578 (rbStart + rbLen < (ffrRbStartOffset + maxContinuousUlBandwidth)))
583 if (tbSizeBits < (*itRach).m_estimatedSize)
595 NS_LOG_INFO(
this <<
" UL grant allocated to RNTI " << (*itRach).m_rnti <<
" rbStart "
596 << rbStart <<
" rbLen " << rbLen <<
" MCS " <<
m_ulGrantMcs <<
" tbSize "
598 for (uint16_t i = rbStart; i < rbStart + rbLen; i++)
626 std::map<uint16_t, uint8_t>::iterator itProcId;
632 harqId = (*itProcId).second;
633 std::map<uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci =
637 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
640 (*itDci).second.at(harqId) = uldci;
643 rbStart = rbStart + rbLen;
653 if (!
params.m_dlInfoList.empty())
657 params.m_dlInfoList.begin(),
658 params.m_dlInfoList.end());
663 if (!
params.m_dlInfoList.empty())
673 std::vector<struct DlInfoListElement_s> dlInfoListUntxed;
677 if (itRnti != rntiAllocated.end())
683 std::vector<bool> retx;
684 NS_LOG_INFO(
this <<
" Processing DLHARQ feedback");
689 retx.push_back(
false);
698 if (retx.at(0) || retx.at(1))
703 NS_LOG_INFO(
this <<
" HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId);
704 std::map<uint16_t, DlHarqProcessesDciBuffer_t>::iterator itHarq =
713 if (dci.
m_rv.size() == 1)
725 NS_LOG_INFO(
"Maximum number of retransmissions reached -> drop process");
726 std::map<uint16_t, DlHarqProcessesStatus_t>::iterator it =
730 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
733 (*it).second.at(harqId) = 0;
734 std::map<uint16_t, DlHarqRlcPduListBuffer_t>::iterator itRlcPdu =
738 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
741 for (std::size_t
k = 0;
k < (*itRlcPdu).second.size();
k++)
743 (*itRlcPdu).second.at(
k).at(harqId).clear();
749 std::vector<int> dciRbg;
752 for (
int j = 0; j < 32; j++)
762 for (std::size_t j = 0; j < dciRbg.size(); j++)
764 if (rbgMap.at(dciRbg.at(j)) ==
true)
774 for (std::size_t j = 0; j < dciRbg.size(); j++)
776 rbgMap.at(dciRbg.at(j)) =
true;
777 NS_LOG_INFO(
"RBG " << dciRbg.at(j) <<
" assigned");
781 NS_LOG_INFO(
this <<
" Send retx in the same RBGs");
787 uint8_t rbgId = (dciRbg.at(dciRbg.size() - 1) + 1) % rbgNum;
788 uint8_t startRbg = dciRbg.at(dciRbg.size() - 1);
789 std::vector<bool> rbgMapCopy = rbgMap;
790 while ((j < dciRbg.size()) && (startRbg != rbgId))
792 if (rbgMapCopy.at(rbgId) ==
false)
794 rbgMapCopy.at(rbgId) =
true;
795 dciRbg.at(j) = rbgId;
798 rbgId = (rbgId + 1) % rbgNum;
800 if (j == dciRbg.size())
803 uint32_t rbgMask = 0;
804 for (std::size_t
k = 0;
k < dciRbg.size();
k++)
806 rbgMask = rbgMask + (0x1 << dciRbg.at(
k));
811 NS_LOG_INFO(
this <<
" Move retx in RBGs " << dciRbg.size());
817 NS_LOG_INFO(
this <<
" No resource for this retx -> buffer it");
822 std::map<uint16_t, DlHarqRlcPduListBuffer_t>::iterator itRlcPdu =
826 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI " << rnti);
828 for (std::size_t j = 0; j < nLayers; j++)
832 if (j >= dci.
m_ndi.size())
835 dci.
m_ndi.push_back(0);
836 dci.
m_rv.push_back(0);
837 dci.
m_mcs.push_back(0);
840 <<
" no txed (MIMO transition)");
846 (*itHarq).second.at(harqId).m_rv.at(j)++;
847 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" RV "
848 << (uint16_t)dci.
m_rv.at(j));
858 NS_LOG_INFO(
this <<
" layer " << (uint16_t)j <<
" no retx");
861 for (std::size_t
k = 0;
k < (*itRlcPdu).second.at(0).at(dci.
m_harqProcess).size();
k++)
863 std::vector<struct RlcPduListElement_s> rlcPduListPerLc;
864 for (std::size_t j = 0; j < nLayers; j++)
868 if (j < dci.
m_ndi.size())
870 NS_LOG_INFO(
" layer " << (uint16_t)j <<
" tb size "
872 rlcPduListPerLc.push_back(
885 .m_logicalChannelIdentity;
887 rlcPduListPerLc.push_back(emptyElement);
891 if (!rlcPduListPerLc.empty())
898 (*itHarq).second.at(harqId).
m_rv = dci.
m_rv;
900 std::map<uint16_t, DlHarqProcessesTimer_t>::iterator itHarqTimer =
904 NS_FATAL_ERROR(
"Unable to find HARQ timer for RNTI " << (uint16_t)rnti);
906 (*itHarqTimer).second.at(harqId) = 0;
908 rntiAllocated.insert(rnti);
914 std::map<uint16_t, DlHarqProcessesStatus_t>::iterator it =
922 std::map<uint16_t, DlHarqRlcPduListBuffer_t>::iterator itRlcPdu =
926 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
929 for (std::size_t
k = 0;
k < (*itRlcPdu).second.size();
k++)
938 if (rbgAllocatedNum == rbgNum)
948 for (
int i = 0; i < rbgNum; i++)
950 NS_LOG_INFO(
this <<
" ALLOCATION for RBG " << i <<
" of " << rbgNum);
951 if (rbgMap.at(i) ==
false)
953 std::map<uint16_t, pfsFlowPerf_t>::iterator it;
954 std::map<uint16_t, pfsFlowPerf_t>::iterator itMax =
m_flowStatsDl.end();
955 double rcqiMax = 0.0;
963 std::set<uint16_t>::iterator itRnti = rntiAllocated.find((*it).first);
967 if (itRnti != rntiAllocated.end())
970 << (uint16_t)(*it).first);
975 << (uint16_t)(*it).first);
979 std::map<uint16_t, SbMeasResult_s>::iterator itCqi;
981 std::map<uint16_t, uint8_t>::iterator itTxMode;
985 NS_FATAL_ERROR(
"No Transmission Mode info on user " << (*it).first);
988 std::vector<uint8_t> sbCqi;
991 for (uint8_t
k = 0;
k < nLayer;
k++)
998 sbCqi = (*itCqi).second.m_higherLayerSelected.at(i).m_sbCqi;
1000 uint8_t cqi1 = sbCqi.at(0);
1002 if (sbCqi.size() > 1)
1013 double achievableRate = 0.0;
1015 for (uint8_t
k = 0;
k < nLayer;
k++)
1017 if (sbCqi.size() >
k)
1019 mcs =
m_amc->GetMcsFromCqi(sbCqi.at(
k));
1026 achievableRate += ((
m_amc->GetDlTbSizeFromMcs(mcs, rbgSize) / 8) /
1030 double rcqi = achievableRate / (*it).second.lastAveragedThroughput;
1031 NS_LOG_INFO(
this <<
" RNTI " << (*it).first <<
" MCS " << (uint32_t)mcs
1032 <<
" achievableRate " << achievableRate <<
" avgThr "
1033 << (*it).second.lastAveragedThroughput <<
" RCQI "
1052 rbgMap.at(i) =
true;
1053 std::map<uint16_t, std::vector<uint16_t>>::iterator itMap;
1054 itMap = allocationMap.find((*itMax).first);
1055 if (itMap == allocationMap.end())
1058 std::vector<uint16_t> tempMap;
1059 tempMap.push_back(i);
1060 allocationMap.insert(
1061 std::pair<uint16_t, std::vector<uint16_t>>((*itMax).first, tempMap));
1065 (*itMap).second.push_back(i);
1067 NS_LOG_INFO(
this <<
" UE assigned " << (*itMax).first);
1073 std::map<uint16_t, pfsFlowPerf_t>::iterator itStats;
1076 (*itStats).second.lastTtiBytesTrasmitted = 0;
1081 std::map<uint16_t, std::vector<uint16_t>>::iterator itMap = allocationMap.begin();
1082 while (itMap != allocationMap.end())
1086 newEl.
m_rnti = (*itMap).first;
1089 newDci.
m_rnti = (*itMap).first;
1097 lcActives = (uint16_t)65535;
1099 uint16_t RgbPerRnti = (*itMap).second.size();
1100 std::map<uint16_t, SbMeasResult_s>::iterator itCqi;
1102 std::map<uint16_t, uint8_t>::iterator itTxMode;
1106 NS_FATAL_ERROR(
"No Transmission Mode info on user " << (*itMap).first);
1109 std::vector<uint8_t> worstCqi(2, 15);
1112 for (std::size_t
k = 0;
k < (*itMap).second.size();
k++)
1114 if ((*itCqi).second.m_higherLayerSelected.size() > (*itMap).second.at(
k))
1116 NS_LOG_INFO(
this <<
" RBG " << (*itMap).second.at(
k) <<
" CQI "
1117 << (uint16_t)((*itCqi)
1118 .second.m_higherLayerSelected
1119 .at((*itMap).second.at(
k))
1121 for (uint8_t j = 0; j < nLayer; j++)
1124 .
second.m_higherLayerSelected.at((*itMap).second.at(
k))
1125 .m_sbCqi.size() > j)
1128 .
second.m_higherLayerSelected.at((*itMap).second.at(
k))
1129 .m_sbCqi.at(j)) < worstCqi.at(j))
1133 .second.m_higherLayerSelected.at((*itMap).second.at(
k))
1146 for (uint8_t j = 0; j < nLayer; j++)
1155 for (uint8_t j = 0; j < nLayer; j++)
1160 for (uint8_t j = 0; j < nLayer; j++)
1162 NS_LOG_INFO(
this <<
" Layer " << (uint16_t)j <<
" CQI selected "
1163 << (uint16_t)worstCqi.at(j));
1165 uint32_t bytesTxed = 0;
1166 for (uint8_t j = 0; j < nLayer; j++)
1168 newDci.
m_mcs.push_back(
m_amc->GetMcsFromCqi(worstCqi.at(j)));
1169 int tbSize = (
m_amc->GetDlTbSizeFromMcs(newDci.
m_mcs.at(j), RgbPerRnti * rbgSize) /
1172 NS_LOG_INFO(
this <<
" Layer " << (uint16_t)j <<
" MCS selected"
1173 <<
m_amc->GetMcsFromCqi(worstCqi.at(j)));
1174 bytesTxed += tbSize;
1179 uint32_t rbgMask = 0;
1180 for (std::size_t
k = 0;
k < (*itMap).second.size();
k++)
1182 rbgMask = rbgMask + (0x1 << (*itMap).second.at(
k));
1183 NS_LOG_INFO(
this <<
" Allocated RBG " << (*itMap).second.at(
k));
1188 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator
1192 if (((*itBufReq).first.m_rnti == (*itMap).first) &&
1193 (((*itBufReq).second.m_rlcTransmissionQueueSize > 0) ||
1194 ((*itBufReq).second.m_rlcRetransmissionQueueSize > 0) ||
1195 ((*itBufReq).second.m_rlcStatusPduSize > 0)))
1197 std::vector<struct RlcPduListElement_s> newRlcPduLe;
1198 for (uint8_t j = 0; j < nLayer; j++)
1204 <<
" size " << newRlcEl.
m_size <<
" layer " << (uint16_t)j);
1205 newRlcPduLe.push_back(newRlcEl);
1212 std::map<uint16_t, DlHarqRlcPduListBuffer_t>::iterator itRlcPdu =
1216 NS_FATAL_ERROR(
"Unable to find RlcPdcList in HARQ buffer for RNTI "
1219 (*itRlcPdu).second.at(j).at(newDci.
m_harqProcess).push_back(newRlcEl);
1224 if ((*itBufReq).first.m_rnti > (*itMap).first)
1229 for (uint8_t j = 0; j < nLayer; j++)
1231 newDci.
m_ndi.push_back(1);
1232 newDci.
m_rv.push_back(0);
1237 newEl.
m_dci = newDci;
1242 std::map<uint16_t, DlHarqProcessesDciBuffer_t>::iterator itDci =
1246 NS_FATAL_ERROR(
"Unable to find RNTI entry in DCI HARQ buffer for RNTI "
1251 std::map<uint16_t, DlHarqProcessesTimer_t>::iterator itHarqTimer =
1264 std::map<uint16_t, pfsFlowPerf_t>::iterator it;
1268 (*it).second.lastTtiBytesTrasmitted = bytesTxed;
1269 NS_LOG_INFO(
this <<
" UE total bytes txed " << (*it).second.lastTtiBytesTrasmitted);
1284 (*itStats).second.totalBytesTransmitted += (*itStats).second.lastTtiBytesTrasmitted;
1287 (*itStats).second.lastAveragedThroughput =
1288 ((1.0 - (1.0 /
m_timeWindow)) * (*itStats).second.lastAveragedThroughput) +
1289 ((1.0 /
m_timeWindow) * (double)((*itStats).second.lastTtiBytesTrasmitted / 0.001));
1290 NS_LOG_INFO(
this <<
" UE total bytes " << (*itStats).second.totalBytesTransmitted);
1291 NS_LOG_INFO(
this <<
" UE average throughput " << (*itStats).second.lastAveragedThroughput);
1292 (*itStats).second.lastTtiBytesTrasmitted = 0;
1314 for (
unsigned int i = 0; i <
params.m_cqiList.size(); i++)
1320 std::map<uint16_t, uint8_t>::iterator it;
1321 uint16_t rnti =
params.m_cqiList.at(i).m_rnti;
1328 params.m_cqiList.at(i).m_wbCqi.at(0)));
1335 (*it).second =
params.m_cqiList.at(i).m_wbCqi.at(0);
1337 std::map<uint16_t, uint32_t>::iterator itTimers;
1345 std::map<uint16_t, SbMeasResult_s>::iterator it;
1346 uint16_t rnti =
params.m_cqiList.at(i).m_rnti;
1352 std::pair<uint16_t, SbMeasResult_s>(rnti,
1353 params.m_cqiList.at(i).m_sbMeasResult));
1359 (*it).second =
params.m_cqiList.at(i).m_sbMeasResult;
1360 std::map<uint16_t, uint32_t>::iterator itTimers;
1375 std::map<uint16_t, std::vector<double>>::iterator itCqi =
m_ueCqi.find(rnti);
1385 unsigned int sinrNum = 0;
1388 double sinr = (*itCqi).second.at(i);
1395 double estimatedSinr = (sinrNum > 0) ? (sinrSum / sinrNum) : DBL_MAX;
1397 (*itCqi).second.at(rb) = estimatedSinr;
1398 return (estimatedSinr);
1407 << (0xF &
params.m_sfnSf) <<
" size " <<
params.m_ulInfoList.size());
1414 std::vector<bool> rbMap;
1415 uint16_t rbAllocatedNum = 0;
1416 std::set<uint16_t> rntiAllocated;
1417 std::vector<uint16_t> rbgAllocationMap;
1427 for (std::vector<bool>::iterator it = rbMap.begin(); it != rbMap.end(); it++)
1441 if (rbgAllocationMap.at(i) != 0)
1452 for (std::size_t i = 0; i <
params.m_ulInfoList.size(); i++)
1457 uint16_t rnti =
params.m_ulInfoList.at(i).m_rnti;
1458 std::map<uint16_t, uint8_t>::iterator itProcId =
1462 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1465 NS_LOG_INFO(
this <<
" UL-HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId
1466 <<
" i " << i <<
" size " <<
params.m_ulInfoList.size());
1467 std::map<uint16_t, UlHarqProcessesDciBuffer_t>::iterator itHarq =
1471 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1475 std::map<uint16_t, UlHarqProcessesStatus_t>::iterator itStat =
1479 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1481 if ((*itStat).second.at(harqId) >= 3)
1483 NS_LOG_INFO(
"Max number of retransmissions reached (UL)-> drop process");
1489 if (rbMap.at(j) ==
true)
1501 rbgAllocationMap.at(j) = dci.
m_rnti;
1507 << (*itStat).second.at(harqId) + 1);
1511 NS_LOG_INFO(
"Cannot allocate retx due to RACH allocations for UE " << rnti);
1516 (*itStat).second.at((*itProcId).second) = (*itStat).second.at(harqId) + 1;
1517 (*itStat).second.at(harqId) = 0;
1518 (*itHarq).second.at((*itProcId).second) = dci;
1520 rntiAllocated.insert(dci.
m_rnti);
1524 NS_LOG_INFO(
this <<
" HARQ-ACK feedback from RNTI "
1525 <<
params.m_ulInfoList.at(i).m_rnti);
1530 std::map<uint16_t, uint32_t>::iterator it;
1535 std::set<uint16_t>::iterator itRnti = rntiAllocated.find((*it).first);
1537 if (((*it).second > 0) && (itRnti == rntiAllocated.end()))
1548 std::pair<uint16_t, std::vector<uint16_t>>(
params.m_sfnSf, rbgAllocationMap));
1557 uint16_t tempRbPerFlow = (ffrUlBandwidth) / (nflows + rntiAllocated.size());
1558 uint16_t rbPerFlow =
1559 (minContinuousUlBandwidth < tempRbPerFlow) ? minContinuousUlBandwidth : tempRbPerFlow;
1567 int rbAllocated = 0;
1569 std::map<uint16_t, pfsFlowPerf_t>::iterator itStats;
1591 std::set<uint16_t>::iterator itRnti = rntiAllocated.find((*it).first);
1592 if ((itRnti != rntiAllocated.end()) || ((*it).second == 0))
1595 NS_LOG_DEBUG(
this <<
" UE already allocated in HARQ -> discarded, RNTI "
1619 uldci.
m_rnti = (*it).first;
1621 bool allocated =
false;
1628 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1630 if (rbMap.at(j) ==
true)
1643 NS_LOG_INFO(
this <<
"RNTI: " << (*it).first <<
" RB Allocated " << rbAllocated
1644 <<
" rbPerFlow " << rbPerFlow <<
" flows " << nflows);
1647 for (
int j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1651 rbgAllocationMap.at(j) = (*it).first;
1653 rbAllocated += rbPerFlow;
1683 std::map<uint16_t, std::vector<double>>::iterator itCqi =
m_ueCqi.find((*it).first);
1694 "CQI of RNTI = " << (*it).first <<
" has expired");
1695 double minSinr = (*itCqi).second.at(uldci.
m_rbStart);
1702 double sinr = (*itCqi).second.at(i);
1714 double s = log2(1 + (std::pow(10, minSinr / 10) / ((-std::log(5.0 * 0.00005)) / 1.5)));
1715 cqi =
m_amc->GetCqiFromSpectralEfficiency(s);
1728 rbgAllocationMap.at(i) = 0;
1754 std::map<uint16_t, uint8_t>::iterator itProcId;
1760 harqId = (*itProcId).second;
1761 std::map<uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci =
1765 NS_FATAL_ERROR(
"Unable to find RNTI entry in UL DCI HARQ buffer for RNTI "
1768 (*itDci).second.at(harqId) = uldci;
1770 std::map<uint16_t, UlHarqProcessesStatus_t>::iterator itStat =
1774 NS_LOG_ERROR(
"No info find in HARQ buffer for UE (might change eNB) "
1777 (*itStat).second.at(harqId) = 0;
1780 NS_LOG_INFO(
this <<
" UE Allocation RNTI " << (*it).first <<
" startPRB "
1782 <<
" CQI " << cqi <<
" MCS " << (uint32_t)uldci.
m_mcs <<
" TBsize "
1783 << uldci.
m_tbSize <<
" RbAlloc " << rbAllocated <<
" harqId "
1784 << (uint16_t)harqId);
1790 (*itStats).second.lastTtiBytesTrasmitted = uldci.
m_tbSize;
1794 NS_LOG_DEBUG(
this <<
" No Stats for this allocated UE");
1809 }
while (((*it).first !=
m_nextRntiUl) && (rbPerFlow != 0));
1815 (*itStats).second.totalBytesTransmitted += (*itStats).second.lastTtiBytesTrasmitted;
1818 (*itStats).second.lastAveragedThroughput =
1819 ((1.0 - (1.0 /
m_timeWindow)) * (*itStats).second.lastAveragedThroughput) +
1820 ((1.0 /
m_timeWindow) * (double)((*itStats).second.lastTtiBytesTrasmitted / 0.001));
1821 NS_LOG_INFO(
this <<
" UE total bytes " << (*itStats).second.totalBytesTransmitted);
1822 NS_LOG_INFO(
this <<
" UE average throughput " << (*itStats).second.lastAveragedThroughput);
1823 (*itStats).second.lastTtiBytesTrasmitted = 0;
1826 std::pair<uint16_t, std::vector<uint16_t>>(
params.m_sfnSf, rbgAllocationMap));
1850 std::map<uint16_t, uint32_t>::iterator it;
1852 for (
unsigned int i = 0; i <
params.m_macCeList.size(); i++)
1863 uint32_t buffer = 0;
1864 for (uint8_t lcg = 0; lcg < 4; ++lcg)
1866 uint8_t bsrId =
params.m_macCeList.at(i).m_macCeValue.m_bufferStatus.at(lcg);
1870 uint16_t rnti =
params.m_macCeList.at(i).m_rnti;
1871 NS_LOG_LOGIC(
this <<
"RNTI=" << rnti <<
" buffer=" << buffer);
1876 m_ceBsrRxed.insert(std::pair<uint16_t, uint32_t>(rnti, buffer));
1881 (*it).second = buffer;
1918 switch (
params.m_ulCqi.m_type)
1921 std::map<uint16_t, std::vector<uint16_t>>::iterator itMap;
1922 std::map<uint16_t, std::vector<double>>::iterator itCqi;
1924 <<
" subframe no. " << (0xF &
params.m_sfnSf));
1930 for (uint32_t i = 0; i < (*itMap).second.size(); i++)
1934 itCqi =
m_ueCqi.find((*itMap).second.at(i));
1938 std::vector<double> newCqi;
1943 newCqi.push_back(sinr);
1952 std::pair<uint16_t, std::vector<double>>((*itMap).second.at(i), newCqi));
1960 (*itCqi).second.at(i) = sinr;
1961 NS_LOG_DEBUG(
this <<
" RNTI " << (*itMap).second.at(i) <<
" RB " << i <<
" SINR "
1964 std::map<uint16_t, uint32_t>::iterator itTimers;
1975 <<
" subframe no. " << (0xF &
params.m_sfnSf));
1979 for (std::size_t i = 0; i <
params.m_vendorSpecificList.size(); i++)
1984 DynamicCast<SrsCqiRntiVsp>(
params.m_vendorSpecificList.at(i).m_value);
1985 rnti = vsp->GetRnti();
1988 std::map<uint16_t, std::vector<double>>::iterator itCqi;
1993 std::vector<double> newCqi;
1997 newCqi.push_back(sinr);
1998 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value "
2001 m_ueCqi.insert(std::pair<uint16_t, std::vector<double>>(rnti, newCqi));
2011 (*itCqi).second.at(j) = sinr;
2012 NS_LOG_INFO(
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value "
2016 std::map<uint16_t, uint32_t>::iterator itTimers;
2025 NS_FATAL_ERROR(
"PfFfMacScheduler supports only PUSCH and SRS UL-CQIs");
2037 std::map<uint16_t, uint32_t>::iterator itP10 =
m_p10CqiTimers.begin();
2040 NS_LOG_INFO(
this <<
" P10-CQI for user " << (*itP10).first <<
" is "
2042 if ((*itP10).second == 0)
2045 std::map<uint16_t, uint8_t>::iterator itMap =
m_p10CqiRxed.find((*itP10).first);
2047 " Does not find CQI report for user " << (*itP10).first);
2048 NS_LOG_INFO(
this <<
" P10-CQI expired for user " << (*itP10).first);
2050 std::map<uint16_t, uint32_t>::iterator temp = itP10;
2062 std::map<uint16_t, uint32_t>::iterator itA30 =
m_a30CqiTimers.begin();
2065 NS_LOG_INFO(
this <<
" A30-CQI for user " << (*itA30).first <<
" is "
2067 if ((*itA30).second == 0)
2070 std::map<uint16_t, SbMeasResult_s>::iterator itMap =
m_a30CqiRxed.find((*itA30).first);
2072 " Does not find CQI report for user " << (*itA30).first);
2073 NS_LOG_INFO(
this <<
" A30-CQI expired for user " << (*itA30).first);
2075 std::map<uint16_t, uint32_t>::iterator temp = itA30;
2091 std::map<uint16_t, uint32_t>::iterator itUl =
m_ueCqiTimers.begin();
2094 NS_LOG_INFO(
this <<
" UL-CQI for user " << (*itUl).first <<
" is "
2096 if ((*itUl).second == 0)
2099 std::map<uint16_t, std::vector<double>>::iterator itMap =
m_ueCqi.find((*itUl).first);
2101 " Does not find CQI report for user " << (*itUl).first);
2102 NS_LOG_INFO(
this <<
" UL-CQI exired for user " << (*itUl).first);
2103 (*itMap).second.clear();
2105 std::map<uint16_t, uint32_t>::iterator temp = itUl;
2120 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
2125 NS_LOG_INFO(
this <<
" UE " << rnti <<
" LC " << (uint16_t)lcid <<
" txqueue "
2126 << (*it).second.m_rlcTransmissionQueueSize <<
" retxqueue "
2127 << (*it).second.m_rlcRetransmissionQueueSize <<
" status "
2128 << (*it).second.m_rlcStatusPduSize <<
" decrease " << size);
2131 if (((*it).second.m_rlcStatusPduSize > 0) && (size >= (*it).second.m_rlcStatusPduSize))
2133 (*it).second.m_rlcStatusPduSize = 0;
2135 else if (((*it).second.m_rlcRetransmissionQueueSize > 0) &&
2136 (size >= (*it).second.m_rlcRetransmissionQueueSize))
2138 (*it).second.m_rlcRetransmissionQueueSize = 0;
2140 else if ((*it).second.m_rlcTransmissionQueueSize > 0)
2142 uint32_t rlcOverhead;
2157 if ((*it).second.m_rlcTransmissionQueueSize <= size - rlcOverhead)
2159 (*it).second.m_rlcTransmissionQueueSize = 0;
2163 (*it).second.m_rlcTransmissionQueueSize -= size - rlcOverhead;
2169 NS_LOG_ERROR(
this <<
" Does not find DL RLC Buffer Report of UE " << rnti);
2177 std::map<uint16_t, uint32_t>::iterator it =
m_ceBsrRxed.find(rnti);
2180 NS_LOG_INFO(
this <<
" UE " << rnti <<
" size " << size <<
" BSR " << (*it).second);
2181 if ((*it).second >= size)
2183 (*it).second -= size;
2192 NS_LOG_ERROR(
this <<
" Does not find BSR report info of UE " << rnti);
2199 NS_LOG_FUNCTION(
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);
2202 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 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.
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...
Implements the SCHED SAP and CSCHED SAP for a Proportional Fair scheduler.
void RefreshHarqProcesses()
Refresh HARQ processes according to the timers.
std::map< uint16_t, uint8_t > m_dlHarqCurrentProcessId
DL HARQ current process ID.
FfMacCschedSapProvider::CschedCellConfigReqParameters m_cschedCellConfig
CSched cell config.
void DoSchedDlCqiInfoReq(const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)
Sched DL CQI info request.
static TypeId GetTypeId()
Get the type ID.
void DoCschedUeConfigReq(const struct FfMacCschedSapProvider::CschedUeConfigReqParameters ¶ms)
CSched UE config request.
~PfFfMacScheduler() override
Destructor.
std::map< uint16_t, DlHarqProcessesStatus_t > m_dlHarqProcessesStatus
DL HARQ process status.
double EstimateUlSinr(uint16_t rnti, uint16_t rb)
Estimate UL SINR.
void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode)
transmission mode configuration update
std::map< LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters > m_rlcBufferReq
Vectors of UE's LC info.
bool m_harqOn
m_harqOn when false inhibit the HARQ mechanisms (by default active)
std::map< uint16_t, UlHarqProcessesStatus_t > m_ulHarqProcessesStatus
UL HARQ process status.
std::map< uint16_t, uint32_t > m_a30CqiTimers
Map of UE's timers on DL CQI A30 received.
std::map< uint16_t, uint8_t > m_p10CqiRxed
Map of UE's DL CQI P01 received.
void DoSchedUlTriggerReq(const struct FfMacSchedSapProvider::SchedUlTriggerReqParameters ¶ms)
Sched UL trigger request.
void DoSchedUlNoiseInterferenceReq(const struct FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters ¶ms)
Sched UL noise interference request.
void DoCschedCellConfigReq(const struct FfMacCschedSapProvider::CschedCellConfigReqParameters ¶ms)
CSched cell config request.
LteFfrSapUser * GetLteFfrSapUser() override
std::vector< struct RachListElement_s > m_rachList
RACH list.
void DoSchedDlRlcBufferReq(const struct FfMacSchedSapProvider::SchedDlRlcBufferReqParameters ¶ms)
Sched DL RLC buffer request.
void SetFfMacSchedSapUser(FfMacSchedSapUser *s) override
set the user part of the FfMacSchedSap that this Scheduler will interact with.
std::map< uint16_t, DlHarqProcessesTimer_t > m_dlHarqProcessesTimer
DL HARQ process timer.
std::map< uint16_t, DlHarqProcessesDciBuffer_t > m_dlHarqProcessesDciBuffer
DL HARQ process DCI buffer.
void DoSchedUlMacCtrlInfoReq(const struct FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters ¶ms)
Sched UL MAC control info request.
FfMacSchedSapProvider * m_schedSapProvider
Sched SAP provider.
FfMacCschedSapProvider * GetFfMacCschedSapProvider() override
std::map< uint16_t, uint32_t > m_ueCqiTimers
Map of UEs' timers on UL-CQI per RBG.
friend class MemberCschedSapProvider< PfFfMacScheduler >
allow MemberCschedSapProvider<PfFfMacScheduler> class friend access
void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size)
Update UL RCL buffer info.
void DoCschedUeReleaseReq(const struct FfMacCschedSapProvider::CschedUeReleaseReqParameters ¶ms)
CSched UE release request.
std::map< uint16_t, DlHarqRlcPduListBuffer_t > m_dlHarqProcessesRlcPduListBuffer
DL HARQ process RLC PDU list buffer.
std::map< uint16_t, uint32_t > m_ceBsrRxed
Map of UE's buffer status reports received.
void DoDispose() override
Destructor implementation.
void DoCschedLcReleaseReq(const struct FfMacCschedSapProvider::CschedLcReleaseReqParameters ¶ms)
CSched LC release request.
FfMacCschedSapUser * m_cschedSapUser
CSched SAP user.
unsigned int LcActivePerFlow(uint16_t rnti)
LC active per flow.
void RefreshDlCqiMaps()
Refresh DL CQI maps.
void DoSchedDlTriggerReq(const struct FfMacSchedSapProvider::SchedDlTriggerReqParameters ¶ms)
Sched DL trigger request.
LteFfrSapUser * m_ffrSapUser
FFR SAP user.
void DoSchedUlSrInfoReq(const struct FfMacSchedSapProvider::SchedUlSrInfoReqParameters ¶ms)
Sched UL SR info request.
void DoSchedDlMacBufferReq(const struct FfMacSchedSapProvider::SchedDlMacBufferReqParameters ¶ms)
Sched DL MAC buffer request.
uint8_t m_ulGrantMcs
MCS for UL grant (default 0)
std::map< uint16_t, SbMeasResult_s > m_a30CqiRxed
Map of UE's DL CQI A30 received.
friend class MemberSchedSapProvider< PfFfMacScheduler >
allow MemberSchedSapProvider<PfFfMacScheduler> class friend access
std::map< uint16_t, std::vector< double > > m_ueCqi
Map of UEs' UL-CQI per RBG.
std::map< uint16_t, pfsFlowPerf_t > m_flowStatsDl
Map of UE statistics (per RNTI basis) in downlink.
void DoSchedDlPagingBufferReq(const struct FfMacSchedSapProvider::SchedDlPagingBufferReqParameters ¶ms)
Sched DL paging buffer request.
double m_timeWindow
time window
std::map< uint16_t, pfsFlowPerf_t > m_flowStatsUl
Map of UE statistics (per RNTI basis)
void RefreshUlCqiMaps()
Refresh UL CQI maps.
LteFfrSapProvider * m_ffrSapProvider
FFR SAP provider.
std::map< uint16_t, std::vector< uint16_t > > m_allocationMaps
Map of previous allocated UE per RBG (used to retrieve info from UL-CQI)
bool HarqProcessAvailability(uint16_t rnti)
Return the availability of free process for the RNTI specified.
void SetFfMacCschedSapUser(FfMacCschedSapUser *s) override
set the user part of the FfMacCschedSap that this Scheduler will interact with.
uint8_t UpdateHarqProcessId(uint16_t rnti)
Update and return a new process Id for the RNTI specified.
void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size)
Update DL RCL buffer info.
void DoCschedLcConfigReq(const struct FfMacCschedSapProvider::CschedLcConfigReqParameters ¶ms)
CSched LC config request.
uint32_t m_cqiTimersThreshold
std::map< uint16_t, uint8_t > m_uesTxMode
txMode of the UEs
uint16_t m_nextRntiUl
RNTI of the next user to be served next scheduling in UL.
std::map< uint16_t, uint32_t > m_p10CqiTimers
Map of UE's timers on DL CQI P01 received.
FfMacCschedSapProvider * m_cschedSapProvider
CSched SAP provider.
void SetLteFfrSapProvider(LteFfrSapProvider *s) override
Set the Provider part of the LteFfrSap that this Scheduler will interact with.
PfFfMacScheduler()
Constructor.
void DoSchedDlRachInfoReq(const struct FfMacSchedSapProvider::SchedDlRachInfoReqParameters ¶ms)
Sched DL RACH info request.
int GetRbgSize(int dlbandwidth)
Get RBG size.
std::map< uint16_t, UlHarqProcessesDciBuffer_t > m_ulHarqProcessesDciBuffer
UL HARQ process DCI buffer.
std::map< uint16_t, uint8_t > m_ulHarqCurrentProcessId
UL HARQ current process ID.
void DoSchedUlCqiInfoReq(const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ¶ms)
Sched UL CQI info request.
FfMacSchedSapProvider * GetFfMacSchedSapProvider() override
std::vector< uint16_t > m_rachAllocationMap
RACH allocation map.
std::vector< DlInfoListElement_s > m_dlInfoListBuffered
HARQ retx buffered.
FfMacSchedSapUser * m_schedSapUser
Sched SAP user.
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 > 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.
static const int PfType0AllocationRbg[4]
PF type 0 allocation RBG.
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
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?
unsigned long totalBytesTransmitted
total bytes transmitted
Time flowStart
flow start time
double lastAveragedThroughput
last averaged throughput
unsigned int lastTtiBytesTrasmitted
last total bytes transmitted