22 #include <ns3/pointer.h>
25 #include <ns3/simulator.h>
26 #include <ns3/lte-amc.h>
27 #include <ns3/pf-ff-mac-scheduler.h>
28 #include <ns3/lte-vendor-specific-parameters.h>
29 #include <ns3/boolean.h>
52 : m_cschedSapUser (0),
57 m_amc = CreateObject <LteAmc> ();
92 .AddAttribute (
"CqiTimerThreshold",
93 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
96 MakeUintegerChecker<uint32_t> ())
97 .AddAttribute (
"HarqEnabled",
98 "Activate/Deactivate the HARQ [by default is active].",
102 .AddAttribute (
"UlGrantMcs",
103 "The MCS of the UL grant, must be [0..15] (default 0)",
106 MakeUintegerChecker<uint8_t> ())
173 dlHarqPrcStatus.resize (8,0);
176 dlHarqProcessesTimer.resize (8,0);
179 dlHarqdci.resize (8);
182 dlHarqRlcPdu.resize (2);
183 dlHarqRlcPdu.at (0).resize (8);
184 dlHarqRlcPdu.at (1).resize (8);
188 ulHarqPrcStatus.resize (8,0);
191 ulHarqdci.resize (8);
206 std::map <uint16_t, pfsFlowPerf_t>::iterator it;
237 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
m_rlcBufferReq.begin ();
238 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
273 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
m_rlcBufferReq.begin ();
274 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
277 if ((*it).first.m_rnti == params.
m_rnti)
303 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
311 m_rlcBufferReq.insert (std::pair <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters> (flow, params));
315 (*it).second = params;
340 for (
int i = 0; i < 4; i++)
355 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
356 unsigned int lcActive = 0;
359 if (((*it).first.m_rnti == rnti) && (((*it).second.m_rlcTransmissionQueueSize > 0)
360 || ((*it).second.m_rlcRetransmissionQueueSize > 0)
361 || ((*it).second.m_rlcStatusPduSize > 0) ))
365 if ((*it).first.m_rnti > rnti)
388 NS_FATAL_ERROR (
"No Process Id Statusfound for this RNTI " << rnti);
390 uint8_t i = (*it).second;
395 while ( ((*itStat).second.at (i) != 0)&&(i != (*it).second));
396 if ((*itStat).second.at (i) == 0)
427 NS_FATAL_ERROR (
"No Process Id Statusfound for this RNTI " << rnti);
429 uint8_t i = (*it).second;
434 while ( ((*itStat).second.at (i) != 0)&&(i != (*it).second));
435 if ((*itStat).second.at (i) == 0)
438 (*itStat).second.at (i) = 1;
442 NS_FATAL_ERROR (
"No HARQ process available for RNTI " << rnti <<
" check before update with HarqProcessAvailability");
445 return ((*it).second);
454 std::map <uint16_t, DlHarqProcessesTimer_t>::iterator itTimers;
463 NS_LOG_DEBUG (
this <<
" Reset HARQ proc " << i <<
" for RNTI " << (*itTimers).first);
464 std::map <uint16_t, DlHarqProcessesStatus_t>::iterator itStat =
m_dlHarqProcessesStatus.find ((*itTimers).first);
467 NS_FATAL_ERROR (
"No Process Id Status found for this RNTI " << (*itTimers).first);
469 (*itStat).second.at (i) = 0;
470 (*itTimers).second.at (i) = 0;
474 (*itTimers).second.at (i)++;
497 std::map <uint16_t, std::vector <uint16_t> > allocationMap;
498 std::vector <bool> rbgMap;
499 uint16_t rbgAllocatedNum = 0;
500 std::set <uint16_t> rntiAllocated;
504 for (std::vector<bool>::iterator it = rbgMap.begin (); it != rbgMap.end (); it++)
515 std::map <uint16_t, uint8_t>::iterator itProcId;
518 (*itProcId).second = ((*itProcId).second + 1) %
HARQ_PROC_NUM;
523 uint16_t rbAllocatedNum = 0;
524 std::vector <bool> ulRbMap;
527 uint8_t maxContinuousUlBandwidth = 0;
528 uint8_t tmpMinBandwidth = 0;
529 uint16_t ffrRbStartOffset = 0;
530 uint16_t tmpFfrRbStartOffset = 0;
533 for (std::vector<bool>::iterator it = ulRbMap.begin (); it != ulRbMap.end (); it++)
538 if (tmpMinBandwidth > maxContinuousUlBandwidth)
540 maxContinuousUlBandwidth = tmpMinBandwidth;
541 ffrRbStartOffset = tmpFfrRbStartOffset;
547 if (tmpMinBandwidth == 0)
549 tmpFfrRbStartOffset = index;
556 if (tmpMinBandwidth > maxContinuousUlBandwidth)
558 maxContinuousUlBandwidth = tmpMinBandwidth;
559 ffrRbStartOffset = tmpFfrRbStartOffset;
563 uint16_t rbStart = 0;
564 rbStart = ffrRbStartOffset;
565 std::vector <struct RachListElement_s>::iterator itRach;
570 newRar.
m_rnti = (*itRach).m_rnti;
577 uint16_t tbSizeBits = 0;
579 while ((tbSizeBits < (*itRach).m_estimatedSize) && (rbStart + rbLen < (ffrRbStartOffset + maxContinuousUlBandwidth)))
584 if (tbSizeBits < (*itRach).m_estimatedSize)
596 NS_LOG_INFO (
this <<
" UL grant allocated to RNTI " << (*itRach).m_rnti <<
" rbStart " << rbStart <<
" rbLen " << rbLen <<
" MCS " <<
m_ulGrantMcs <<
" tbSize " << newRar.
m_grant.
m_tbSize);
597 for (uint16_t i = rbStart; i < rbStart + rbLen; i++)
625 std::map <uint16_t, uint8_t>::iterator itProcId;
631 harqId = (*itProcId).second;
637 (*itDci).second.at (harqId) = uldci;
640 rbStart = rbStart + rbLen;
653 NS_LOG_INFO (
this <<
" Received DL-HARQ feedback");
669 std::vector <struct DlInfoListElement_s> dlInfoListUntxed;
673 if (itRnti != rntiAllocated.end ())
679 std::vector <bool> retx;
680 NS_LOG_INFO (
this <<
" Processing DLHARQ feedback");
684 retx.push_back (
false);
691 if (retx.at (0) || retx.at (1))
696 NS_LOG_INFO (
this <<
" HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId);
705 if (dci.
m_rv.size () == 1)
707 rv = dci.
m_rv.at (0);
711 rv = (dci.
m_rv.at (0) > dci.
m_rv.at (1) ? dci.
m_rv.at (0) : dci.
m_rv.at (1));
717 NS_LOG_INFO (
"Maximum number of retransmissions reached -> drop process");
723 (*it).second.at (harqId) = 0;
729 for (uint16_t
k = 0;
k < (*itRlcPdu).second.size ();
k++)
731 (*itRlcPdu).second.at (
k).at (harqId).clear ();
737 std::vector <int> dciRbg;
740 for (
int j = 0; j < 32; j++)
744 dciRbg.push_back (j);
750 for (uint8_t j = 0; j < dciRbg.size (); j++)
752 if (rbgMap.at (dciRbg.at (j)) ==
true)
762 for (uint8_t j = 0; j < dciRbg.size (); j++)
764 rbgMap.at (dciRbg.at (j)) =
true;
765 NS_LOG_INFO (
"RBG " << dciRbg.at (j) <<
" assigned");
769 NS_LOG_INFO (
this <<
" Send retx in the same RBGs");
775 uint8_t rbgId = (dciRbg.at (dciRbg.size () - 1) + 1) % rbgNum;
776 uint8_t startRbg = dciRbg.at (dciRbg.size () - 1);
777 std::vector <bool> rbgMapCopy = rbgMap;
778 while ((j < dciRbg.size ())&&(startRbg != rbgId))
780 if (rbgMapCopy.at (rbgId) ==
false)
782 rbgMapCopy.at (rbgId) =
true;
783 dciRbg.at (j) = rbgId;
786 rbgId = (rbgId + 1) % rbgNum;
788 if (j == dciRbg.size ())
791 uint32_t rbgMask = 0;
792 for (uint16_t
k = 0;
k < dciRbg.size ();
k++)
794 rbgMask = rbgMask + (0x1 << dciRbg.at (
k));
799 NS_LOG_INFO (
this <<
" Move retx in RBGs " << dciRbg.size ());
805 NS_LOG_INFO (
this <<
" No resource for this retx -> buffer it");
813 NS_FATAL_ERROR (
"Unable to find RlcPdcList in HARQ buffer for RNTI " << rnti);
815 for (uint8_t j = 0; j < nLayers; j++)
819 if (j >= dci.
m_ndi.size ())
822 dci.
m_ndi.push_back (0);
823 dci.
m_rv.push_back (0);
824 dci.
m_mcs.push_back (0);
826 NS_LOG_INFO (
this <<
" layer " << (uint16_t)j <<
" no txed (MIMO transition)");
830 dci.
m_ndi.at (j) = 0;
832 (*itHarq).second.at (harqId).m_rv.at (j)++;
833 NS_LOG_INFO (
this <<
" layer " << (uint16_t)j <<
" RV " << (uint16_t)dci.
m_rv.at (j));
839 dci.
m_ndi.at (j) = 0;
841 dci.
m_mcs.at (j) = 0;
843 NS_LOG_INFO (
this <<
" layer " << (uint16_t)j <<
" no retx");
846 for (uint16_t
k = 0;
k < (*itRlcPdu).second.at (0).at (dci.
m_harqProcess).size ();
k++)
848 std::vector <struct RlcPduListElement_s> rlcPduListPerLc;
849 for (uint8_t j = 0; j < nLayers; j++)
853 if (j < dci.
m_ndi.size ())
856 rlcPduListPerLc.push_back ((*itRlcPdu).second.at (j).at (dci.
m_harqProcess).at (
k));
865 rlcPduListPerLc.push_back (emptyElement);
869 if (rlcPduListPerLc.size () > 0)
876 (*itHarq).second.at (harqId).
m_rv = dci.
m_rv;
881 NS_FATAL_ERROR (
"Unable to find HARQ timer for RNTI " << (uint16_t)rnti);
883 (*itHarqTimer).second.at (harqId) = 0;
885 rntiAllocated.insert (rnti);
902 for (uint16_t
k = 0;
k < (*itRlcPdu).second.size ();
k++)
911 if (rbgAllocatedNum == rbgNum)
923 for (
int i = 0; i < rbgNum; i++)
925 NS_LOG_INFO (
this <<
" ALLOCATION for RBG " << i <<
" of " << rbgNum);
926 if (rbgMap.at (i) ==
false)
928 std::map <uint16_t, pfsFlowPerf_t>::iterator it;
929 std::map <uint16_t, pfsFlowPerf_t>::iterator itMax =
m_flowStatsDl.end ();
930 double rcqiMax = 0.0;
936 std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
940 if (itRnti != rntiAllocated.end ())
942 NS_LOG_DEBUG (
this <<
" RNTI discared for HARQ tx" << (uint16_t)(*it).first);
946 NS_LOG_DEBUG (
this <<
" RNTI discared for HARQ id" << (uint16_t)(*it).first);
950 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
952 std::map <uint16_t,uint8_t>::iterator itTxMode;
956 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
959 std::vector <uint8_t> sbCqi;
962 for (uint8_t
k = 0;
k < nLayer;
k++)
969 sbCqi = (*itCqi).second.m_higherLayerSelected.at (i).m_sbCqi;
971 uint8_t cqi1 = sbCqi.at (0);
973 if (sbCqi.size () > 1)
978 if ((cqi1 > 0)||(cqi2 > 0))
983 double achievableRate = 0.0;
985 for (uint8_t
k = 0;
k < nLayer;
k++)
987 if (sbCqi.size () >
k)
989 mcs =
m_amc->GetMcsFromCqi (sbCqi.at (
k));
996 achievableRate += ((
m_amc->GetDlTbSizeFromMcs (mcs, rbgSize) / 8) / 0.001);
999 double rcqi = achievableRate / (*it).second.lastAveragedThroughput;
1000 NS_LOG_INFO (
this <<
" RNTI " << (*it).first <<
" MCS " << (uint32_t)mcs <<
" achievableRate " << achievableRate <<
" avgThr " << (*it).second.lastAveragedThroughput <<
" RCQI " << rcqi);
1018 rbgMap.at (i) =
true;
1019 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
1020 itMap = allocationMap.find ((*itMax).first);
1021 if (itMap == allocationMap.end ())
1024 std::vector <uint16_t> tempMap;
1025 tempMap.push_back (i);
1026 allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax).first, tempMap));
1030 (*itMap).second.push_back (i);
1032 NS_LOG_INFO (
this <<
" UE assigned " << (*itMax).first);
1038 std::map <uint16_t, pfsFlowPerf_t>::iterator itStats;
1041 (*itStats).second.lastTtiBytesTrasmitted = 0;
1046 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap = allocationMap.begin ();
1047 while (itMap != allocationMap.end ())
1051 newEl.
m_rnti = (*itMap).first;
1054 newDci.
m_rnti = (*itMap).first;
1062 lcActives = (uint16_t)65535;
1064 uint16_t RgbPerRnti = (*itMap).second.size ();
1065 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
1067 std::map <uint16_t,uint8_t>::iterator itTxMode;
1071 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*itMap).first);
1074 std::vector <uint8_t> worstCqi (2, 15);
1077 for (uint16_t
k = 0;
k < (*itMap).second.size ();
k++)
1079 if ((*itCqi).second.m_higherLayerSelected.size () > (*itMap).second.at (
k))
1081 NS_LOG_INFO (
this <<
" RBG " << (*itMap).second.at (
k) <<
" CQI " << (uint16_t)((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (
k)).m_sbCqi.at (0)) );
1082 for (uint8_t j = 0; j < nLayer; j++)
1084 if ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (
k)).m_sbCqi.size () > j)
1086 if (((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (
k)).m_sbCqi.at (j)) < worstCqi.at (j))
1088 worstCqi.at (j) = ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (
k)).m_sbCqi.at (j));
1094 worstCqi.at (j) = 1;
1100 for (uint8_t j = 0; j < nLayer; j++)
1102 worstCqi.at (j) = 1;
1109 for (uint8_t j = 0; j < nLayer; j++)
1111 worstCqi.at (j) = 1;
1114 for (uint8_t j = 0; j < nLayer; j++)
1116 NS_LOG_INFO (
this <<
" Layer " << (uint16_t)j <<
" CQI selected " << (uint16_t)worstCqi.at (j));
1118 uint32_t bytesTxed = 0;
1119 for (uint8_t j = 0; j < nLayer; j++)
1121 newDci.
m_mcs.push_back (
m_amc->GetMcsFromCqi (worstCqi.at (j)));
1122 int tbSize = (
m_amc->GetDlTbSizeFromMcs (newDci.
m_mcs.at (j), RgbPerRnti * rbgSize) / 8);
1124 NS_LOG_INFO (
this <<
" Layer " << (uint16_t)j <<
" MCS selected" <<
m_amc->GetMcsFromCqi (worstCqi.at (j)));
1125 bytesTxed += tbSize;
1130 uint32_t rbgMask = 0;
1131 for (uint16_t
k = 0;
k < (*itMap).second.size ();
k++)
1133 rbgMask = rbgMask + (0x1 << (*itMap).second.at (
k));
1134 NS_LOG_INFO (
this <<
" Allocated RBG " << (*itMap).second.at (
k));
1139 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator itBufReq;
1142 if (((*itBufReq).first.m_rnti == (*itMap).first)
1143 && (((*itBufReq).second.m_rlcTransmissionQueueSize > 0)
1144 || ((*itBufReq).second.m_rlcRetransmissionQueueSize > 0)
1145 || ((*itBufReq).second.m_rlcStatusPduSize > 0) ))
1147 std::vector <struct RlcPduListElement_s> newRlcPduLe;
1148 for (uint8_t j = 0; j < nLayer; j++)
1154 newRlcPduLe.push_back (newRlcEl);
1162 NS_FATAL_ERROR (
"Unable to find RlcPdcList in HARQ buffer for RNTI " << (*itMap).first);
1164 (*itRlcPdu).second.at (j).at (newDci.
m_harqProcess).push_back (newRlcEl);
1169 if ((*itBufReq).first.m_rnti > (*itMap).first)
1174 for (uint8_t j = 0; j < nLayer; j++)
1176 newDci.
m_ndi.push_back (1);
1177 newDci.
m_rv.push_back (0);
1182 newEl.
m_dci = newDci;
1206 std::map <uint16_t, pfsFlowPerf_t>::iterator it;
1210 (*it).second.lastTtiBytesTrasmitted = bytesTxed;
1211 NS_LOG_INFO (
this <<
" UE total bytes txed " << (*it).second.lastTtiBytesTrasmitted);
1229 (*itStats).second.totalBytesTransmitted += (*itStats).second.lastTtiBytesTrasmitted;
1231 (*itStats).second.lastAveragedThroughput = ((1.0 - (1.0 /
m_timeWindow)) * (*itStats).second.lastAveragedThroughput) + ((1.0 /
m_timeWindow) * (double)((*itStats).second.lastTtiBytesTrasmitted / 0.001));
1232 NS_LOG_INFO (
this <<
" UE total bytes " << (*itStats).second.totalBytesTransmitted);
1233 NS_LOG_INFO (
this <<
" UE average throughput " << (*itStats).second.lastAveragedThroughput);
1234 (*itStats).second.lastTtiBytesTrasmitted = 0;
1259 for (
unsigned int i = 0; i < params.
m_cqiList.size (); i++)
1264 std::map <uint16_t,uint8_t>::iterator it;
1265 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
1270 m_p10CqiRxed.insert ( std::pair<uint16_t, uint8_t > (rnti, params.
m_cqiList.at (i).m_wbCqi.at (0)) );
1277 (*it).second = params.
m_cqiList.at (i).m_wbCqi.at (0);
1279 std::map <uint16_t,uint32_t>::iterator itTimers;
1287 std::map <uint16_t,SbMeasResult_s>::iterator it;
1288 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
1293 m_a30CqiRxed.insert ( std::pair<uint16_t, SbMeasResult_s > (rnti, params.
m_cqiList.at (i).m_sbMeasResult) );
1299 (*it).second = params.
m_cqiList.at (i).m_sbMeasResult;
1300 std::map <uint16_t,uint32_t>::iterator itTimers;
1318 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find (rnti);
1329 unsigned int sinrNum = 0;
1332 double sinr = (*itCqi).second.at (i);
1339 double estimatedSinr = (sinrNum > 0) ? (sinrSum / sinrNum) : DBL_MAX;
1341 (*itCqi).second.at (rb) = estimatedSinr;
1342 return (estimatedSinr);
1356 std::vector <bool> rbMap;
1357 uint16_t rbAllocatedNum = 0;
1358 std::set <uint16_t> rntiAllocated;
1359 std::vector <uint16_t> rbgAllocationMap;
1369 for (std::vector<bool>::iterator it = rbMap.begin (); it != rbMap.end (); it++)
1383 if (rbgAllocationMap.at (i) != 0)
1385 rbMap.at (i) =
true;
1395 for (uint16_t i = 0; i < params.
m_ulInfoList.size (); i++)
1404 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1407 NS_LOG_INFO (
this <<
" UL-HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId <<
" i " << i <<
" size " << params.
m_ulInfoList.size ());
1411 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1418 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1420 if ((*itStat).second.at (harqId) >= 3)
1422 NS_LOG_INFO (
"Max number of retransmissions reached (UL)-> drop process");
1428 if (rbMap.at (j) ==
true)
1439 rbMap.at (j) =
true;
1440 rbgAllocationMap.at (j) = dci.
m_rnti;
1448 NS_LOG_INFO (
"Cannot allocate retx due to RACH allocations for UE " << rnti);
1453 (*itStat).second.at ((*itProcId).second) = (*itStat).second.at (harqId) + 1;
1454 (*itStat).second.at (harqId) = 0;
1455 (*itHarq).second.at ((*itProcId).second) = dci;
1457 rntiAllocated.insert (dci.
m_rnti);
1466 std::map <uint16_t,uint32_t>::iterator it;
1471 std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
1473 if (((*it).second > 0)&&(itRnti == rntiAllocated.end ()))
1492 uint16_t tempRbPerFlow = (ffrUlBandwidth) / (nflows + rntiAllocated.size ());
1493 uint16_t rbPerFlow = (minContinuousUlBandwidth < tempRbPerFlow) ? minContinuousUlBandwidth : tempRbPerFlow;
1500 int rbAllocated = 0;
1502 std::map <uint16_t, pfsFlowPerf_t>::iterator itStats;
1524 std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
1525 if ((itRnti != rntiAllocated.end ())||((*it).second == 0))
1528 NS_LOG_DEBUG (
this <<
" UE already allocated in HARQ -> discared, RNTI " << (*it).first);
1551 uldci.
m_rnti = (*it).first;
1553 bool allocated =
false;
1559 for (uint16_t j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1561 if (rbMap.at (j) ==
true)
1574 NS_LOG_INFO (
this <<
"RNTI: "<< (*it).first<<
" RB Allocated " << rbAllocated <<
" rbPerFlow " << rbPerFlow <<
" flows " << nflows);
1577 for (uint16_t j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1579 rbMap.at (j) =
true;
1581 rbgAllocationMap.at (j) = (*it).first;
1583 rbAllocated += rbPerFlow;
1615 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find ((*it).first);
1625 NS_ABORT_MSG_IF ((*itCqi).second.size() == 0,
"CQI of RNTI = " << (*it).first <<
" has expired");
1626 double minSinr = (*itCqi).second.at (uldci.
m_rbStart);
1633 double sinr = (*itCqi).second.at (i);
1645 double s = log2 ( 1 + (
1646 std::pow (10, minSinr / 10 ) /
1647 ( (-std::log (5.0 * 0.00005 )) / 1.5) ));
1648 cqi =
m_amc->GetCqiFromSpectralEfficiency (s);
1661 rbgAllocationMap.at (i) = 0;
1687 std::map <uint16_t, uint8_t>::iterator itProcId;
1693 harqId = (*itProcId).second;
1699 (*itDci).second.at (harqId) = uldci;
1704 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << uldci.
m_rnti);
1706 (*itStat).second.at (harqId) = 0;
1709 NS_LOG_INFO (
this <<
" UE Allocation RNTI " << (*it).first <<
" startPRB " << (uint32_t)uldci.
m_rbStart <<
" nPRB " << (uint32_t)uldci.
m_rbLen <<
" CQI " << cqi <<
" MCS " << (uint32_t)uldci.
m_mcs <<
" TBsize " << uldci.
m_tbSize <<
" RbAlloc " << rbAllocated <<
" harqId " << (uint16_t)harqId);
1715 (*itStats).second.lastTtiBytesTrasmitted = uldci.
m_tbSize;
1719 NS_LOG_DEBUG (
this <<
" No Stats for this allocated UE");
1743 (*itStats).second.totalBytesTransmitted += (*itStats).second.lastTtiBytesTrasmitted;
1745 (*itStats).second.lastAveragedThroughput = ((1.0 - (1.0 /
m_timeWindow)) * (*itStats).second.lastAveragedThroughput) + ((1.0 /
m_timeWindow) * (double)((*itStats).second.lastTtiBytesTrasmitted / 0.001));
1746 NS_LOG_INFO (
this <<
" UE total bytes " << (*itStats).second.totalBytesTransmitted);
1747 NS_LOG_INFO (
this <<
" UE average throughput " << (*itStats).second.lastAveragedThroughput);
1748 (*itStats).second.lastTtiBytesTrasmitted = 0;
1775 std::map <uint16_t,uint32_t>::iterator it;
1777 for (
unsigned int i = 0; i < params.
m_macCeList.size (); i++)
1788 uint32_t buffer = 0;
1789 for (uint8_t lcg = 0; lcg < 4; ++lcg)
1791 uint8_t bsrId = params.
m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (lcg);
1796 NS_LOG_LOGIC (
this <<
"RNTI=" << rnti <<
" buffer=" << buffer);
1801 m_ceBsrRxed.insert ( std::pair<uint16_t, uint32_t > (rnti, buffer));
1806 (*it).second = buffer;
1846 switch (params.
m_ulCqi.m_type)
1850 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
1851 std::map <uint16_t, std::vector <double> >::iterator itCqi;
1852 NS_LOG_DEBUG (
this <<
" Collect PUSCH CQIs of Frame no. " << (params.
m_sfnSf >> 4) <<
" subframe no. " << (0xF & params.
m_sfnSf));
1858 for (uint32_t i = 0; i < (*itMap).second.size (); i++)
1862 itCqi =
m_ueCqi.find ((*itMap).second.at (i));
1866 std::vector <double> newCqi;
1871 newCqi.push_back (sinr);
1880 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > ((*itMap).second.at (i), newCqi));
1887 (*itCqi).second.at (i) = sinr;
1888 NS_LOG_DEBUG (
this <<
" RNTI " << (*itMap).second.at (i) <<
" RB " << i <<
" SINR " << sinr);
1890 std::map <uint16_t, uint32_t>::iterator itTimers;
1903 NS_LOG_DEBUG (
this <<
" Collect SRS CQIs of Frame no. " << (params.
m_sfnSf >> 4) <<
" subframe no. " << (0xF & params.
m_sfnSf));
1912 rnti = vsp->GetRnti ();
1915 std::map <uint16_t, std::vector <double> >::iterator itCqi;
1920 std::vector <double> newCqi;
1924 newCqi.push_back (sinr);
1925 NS_LOG_INFO (
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value " << sinr);
1928 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > (rnti, newCqi));
1938 (*itCqi).second.at (j) = sinr;
1939 NS_LOG_INFO (
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value " << sinr);
1942 std::map <uint16_t, uint32_t>::iterator itTimers;
1955 NS_FATAL_ERROR (
"PfFfMacScheduler supports only PUSCH and SRS UL-CQIs");
1968 std::map <uint16_t,uint32_t>::iterator itP10 =
m_p10CqiTimers.begin ();
1972 if ((*itP10).second == 0)
1975 std::map <uint16_t,uint8_t>::iterator itMap =
m_p10CqiRxed.find ((*itP10).first);
1977 NS_LOG_INFO (
this <<
" P10-CQI expired for user " << (*itP10).first);
1979 std::map <uint16_t,uint32_t>::iterator temp = itP10;
1991 std::map <uint16_t,uint32_t>::iterator itA30 =
m_a30CqiTimers.begin ();
1995 if ((*itA30).second == 0)
1998 std::map <uint16_t,SbMeasResult_s>::iterator itMap =
m_a30CqiRxed.find ((*itA30).first);
2000 NS_LOG_INFO (
this <<
" A30-CQI expired for user " << (*itA30).first);
2002 std::map <uint16_t,uint32_t>::iterator temp = itA30;
2021 std::map <uint16_t,uint32_t>::iterator itUl =
m_ueCqiTimers.begin ();
2025 if ((*itUl).second == 0)
2028 std::map <uint16_t, std::vector <double> >::iterator itMap =
m_ueCqi.find ((*itUl).first);
2029 NS_ASSERT_MSG (itMap !=
m_ueCqi.end (),
" Does not find CQI report for user " << (*itUl).first);
2030 NS_LOG_INFO (
this <<
" UL-CQI exired for user " << (*itUl).first);
2031 (*itMap).second.clear ();
2033 std::map <uint16_t,uint32_t>::iterator temp = itUl;
2050 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
2055 NS_LOG_INFO (
this <<
" UE " << rnti <<
" LC " << (uint16_t)lcid <<
" txqueue " << (*it).second.m_rlcTransmissionQueueSize <<
" retxqueue " << (*it).second.m_rlcRetransmissionQueueSize <<
" status " << (*it).second.m_rlcStatusPduSize <<
" decrease " << size);
2058 if (((*it).second.m_rlcStatusPduSize > 0) && (size >= (*it).second.m_rlcStatusPduSize))
2060 (*it).second.m_rlcStatusPduSize = 0;
2062 else if (((*it).second.m_rlcRetransmissionQueueSize > 0) && (size >= (*it).second.m_rlcRetransmissionQueueSize))
2064 (*it).second.m_rlcRetransmissionQueueSize = 0;
2066 else if ((*it).second.m_rlcTransmissionQueueSize > 0)
2068 uint32_t rlcOverhead;
2083 if ((*it).second.m_rlcTransmissionQueueSize <= size - rlcOverhead)
2085 (*it).second.m_rlcTransmissionQueueSize = 0;
2089 (*it).second.m_rlcTransmissionQueueSize -= size - rlcOverhead;
2095 NS_LOG_ERROR (
this <<
" Does not find DL RLC Buffer Report of UE " << rnti);
2104 std::map <uint16_t,uint32_t>::iterator it =
m_ceBsrRxed.find (rnti);
2107 NS_LOG_INFO (
this <<
" UE " << rnti <<
" size " << size <<
" BSR " << (*it).second);
2108 if ((*it).second >= size)
2110 (*it).second -= size;
2119 NS_LOG_ERROR (
this <<
" Does not find BSR report info of UE " << rnti);
2127 NS_LOG_FUNCTION (
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)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.
std::map< uint16_t, uint32_t > m_ceBsrRxed
Map of UE's buffer status reports received.
FfMacCschedSapProvider::CschedCellConfigReqParameters m_cschedCellConfig
CSched cell config.
void DoSchedDlCqiInfoReq(const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)
Sched DL CQI info request.
void DoCschedUeConfigReq(const struct FfMacCschedSapProvider::CschedUeConfigReqParameters ¶ms)
CSched UE config request.
virtual FfMacSchedSapProvider * GetFfMacSchedSapProvider()
std::map< uint16_t, DlHarqProcessesStatus_t > m_dlHarqProcessesStatus
DL HARQ process status.
double EstimateUlSinr(uint16_t rnti, uint16_t rb)
Estimate UL SINR.
std::map< uint16_t, uint32_t > m_p10CqiTimers
Map of UE's timers on DL CQI P01 received.
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.
void DoSchedUlTriggerReq(const struct FfMacSchedSapProvider::SchedUlTriggerReqParameters ¶ms)
Sched UL trigger request.
virtual void SetFfMacCschedSapUser(FfMacCschedSapUser *s)
set the user part of the FfMacCschedSap that this Scheduler will interact with.
void DoSchedUlNoiseInterferenceReq(const struct FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters ¶ms)
Sched UL noise interference request.
void DoCschedCellConfigReq(const struct FfMacCschedSapProvider::CschedCellConfigReqParameters ¶ms)
CSched cell config request.
std::vector< struct RachListElement_s > m_rachList
RACH list.
void DoSchedDlRlcBufferReq(const struct FfMacSchedSapProvider::SchedDlRlcBufferReqParameters ¶ms)
Sched DL RLC buffer request.
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.
std::map< uint16_t, uint32_t > m_ueCqiTimers
Map of UEs' timers on UL-CQI per RBG.
void RefreshDlCqiMaps(void)
Refresh DL CQI maps.
virtual ~PfFfMacScheduler()
Destructor.
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.
void RefreshUlCqiMaps(void)
Refresh UL CQI maps.
std::map< uint16_t, DlHarqRlcPduListBuffer_t > m_dlHarqProcessesRlcPduListBuffer
DL HARQ process RLC PDU list buffer.
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.
virtual LteFfrSapUser * GetLteFfrSapUser()
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.
std::map< uint16_t, uint32_t > m_a30CqiTimers
Map of UE's timers on DL CQI A30 received.
void DoSchedDlMacBufferReq(const struct FfMacSchedSapProvider::SchedDlMacBufferReqParameters ¶ms)
Sched DL MAC buffer request.
virtual void SetFfMacSchedSapUser(FfMacSchedSapUser *s)
set the user part of the FfMacSchedSap that this Scheduler will interact with.
virtual void DoDispose(void)
Destructor implementation.
uint8_t m_ulGrantMcs
MCS for UL grant (default 0)
friend class MemberSchedSapProvider< PfFfMacScheduler >
allow MemberSchedSapProvider<PfFfMacScheduler> class friend access
std::map< uint16_t, std::vector< uint16_t > > m_allocationMaps
Map of previous allocated UE per RBG (used to retrieve info from UL-CQI)
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.
static TypeId GetTypeId(void)
Get the type ID.
double m_timeWindow
time window
std::map< uint16_t, pfsFlowPerf_t > m_flowStatsUl
Map of UE statistics (per RNTI basis)
LteFfrSapProvider * m_ffrSapProvider
FFR SAP provider.
virtual FfMacCschedSapProvider * GetFfMacCschedSapProvider()
uint8_t HarqProcessAvailability(uint16_t rnti)
Return the availability of free process for the RNTI specified.
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.
std::map< uint16_t, SbMeasResult_s > m_a30CqiRxed
Map of UE's DL CQI A30 received.
std::map< uint16_t, uint8_t > m_uesTxMode
txMode of the UEs
uint32_t m_cqiTimersThreshold
uint16_t m_nextRntiUl
RNTI of the next user to be served next scheduling in UL.
FfMacCschedSapProvider * m_cschedSapProvider
CSched SAP provider.
PfFfMacScheduler()
Constructor.
void DoSchedDlRachInfoReq(const struct FfMacSchedSapProvider::SchedDlRachInfoReqParameters ¶ms)
Sched DL RACH info request.
std::map< uint16_t, uint8_t > m_p10CqiRxed
Map of UE's DL CQI P01 received.
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.
std::vector< uint16_t > m_rachAllocationMap
RACH allocation map.
virtual void SetLteFfrSapProvider(LteFfrSapProvider *s)
Set the Provider part of the LteFfrSap that this Scheduler will interact with.
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(void)
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 AttributeChecker > MakeBooleanChecker(void)
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 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.
See section 4.3.8 builDataListElement.
struct DlDciListElement_s m_dci
DCI.
std::vector< std::vector< struct RlcPduListElement_s > > m_rlcPduList
RLC PDU list.
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 badnwidth.
uint16_t m_ulBandwidth
UL bandwidth.
Parameters of the CSCHED_LC_CONFIG_REQ primitive.
std::vector< struct LogicalChannelConfigListElement_s > m_logicalChannelConfigList
logicalChannelConfigList
Parameters of the CSCHED_LC_RELEASE_REQ primitive.
std::vector< uint8_t > m_logicalChannelIdentity
logical channel identity
Parameters of the CSCHED_UE_CONFIG_REQ primitive.
uint8_t m_transmissionMode
transmission mode
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.
uint8_t m_transmissionMode
transmission mode
Parameters of the SCHED_DL_CQI_INFO_REQ primitive.
std::vector< struct CqiListElement_s > m_cqiList
CQI list.
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.
std::vector< struct RachListElement_s > m_rachList
RACH list.
Parameters of the API primitives.
uint8_t m_logicalChannelIdentity
logical channel identity
Parameters of the SCHED_DL_TRIGGER_REQ primitive.
std::vector< struct DlInfoListElement_s > m_dlInfoList
DL info list.
Parameters of the SCHED_UL_CQI_INFO_REQ primitive.
std::vector< struct VendorSpecificListElement_s > m_vendorSpecificList
vendor specific list
struct UlCqi_s m_ulCqi
UL CQI.
Parameters of the SCHED_UL_MAC_CTRL_INFO_REQ primitive.
std::vector< struct MacCeListElement_s > m_macCeList
MAC CE list.
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.
std::vector< struct UlInfoListElement_s > m_ulInfoList
UL info list.
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
std::vector< uint16_t > m_sinr
SINR.
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