23 #include <ns3/pointer.h>
26 #include <ns3/simulator.h>
27 #include <ns3/lte-amc.h>
28 #include <ns3/pss-ff-mac-scheduler.h>
29 #include <ns3/lte-vendor-specific-parameters.h>
30 #include <ns3/boolean.h>
33 #include <ns3/string.h>
55 : m_cschedSapUser (0),
60 m_amc = CreateObject <LteAmc> ();
95 .AddAttribute (
"CqiTimerThreshold",
96 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
99 MakeUintegerChecker<uint32_t> ())
100 .AddAttribute (
"PssFdSchedulerType",
101 "FD scheduler in PSS (default value is PFsch)",
105 .AddAttribute (
"nMux",
106 "The number of UE selected by TD scheduler (default value is 0)",
109 MakeUintegerChecker<uint32_t> ())
110 .AddAttribute (
"HarqEnabled",
111 "Activate/Deactivate the HARQ [by default is active].",
115 .AddAttribute (
"UlGrantMcs",
116 "The MCS of the UL grant, must be [0..15] (default 0)",
119 MakeUintegerChecker<uint8_t> ())
186 dlHarqPrcStatus.resize (8,0);
189 dlHarqProcessesTimer.resize (8,0);
192 dlHarqdci.resize (8);
195 dlHarqRlcPdu.resize (2);
196 dlHarqRlcPdu.at (0).resize (8);
197 dlHarqRlcPdu.at (1).resize (8);
201 ulHarqPrcStatus.resize (8,0);
204 ulHarqdci.resize (8);
219 std::map <uint16_t, pssFlowPerf_t>::iterator it;
265 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
m_rlcBufferReq.begin ();
266 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
301 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
m_rlcBufferReq.begin ();
302 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
305 if ((*it).first.m_rnti == params.
m_rnti)
331 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
339 m_rlcBufferReq.insert (std::pair <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters> (flow, params));
343 (*it).second = params;
368 for (
int i = 0; i < 4; i++)
383 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
384 unsigned int lcActive = 0;
387 if (((*it).first.m_rnti == rnti) && (((*it).second.m_rlcTransmissionQueueSize > 0)
388 || ((*it).second.m_rlcRetransmissionQueueSize > 0)
389 || ((*it).second.m_rlcStatusPduSize > 0) ))
393 if ((*it).first.m_rnti > rnti)
416 NS_FATAL_ERROR (
"No Process Id Statusfound for this RNTI " << rnti);
418 uint8_t i = (*it).second;
423 while ( ((*itStat).second.at (i) != 0)&&(i != (*it).second));
424 if ((*itStat).second.at (i) == 0)
455 NS_FATAL_ERROR (
"No Process Id Statusfound for this RNTI " << rnti);
457 uint8_t i = (*it).second;
462 while ( ((*itStat).second.at (i) != 0)&&(i != (*it).second));
463 if ((*itStat).second.at (i) == 0)
466 (*itStat).second.at (i) = 1;
470 NS_FATAL_ERROR (
"No HARQ process available for RNTI " << rnti <<
" check before update with HarqProcessAvailability");
473 return ((*it).second);
482 std::map <uint16_t, DlHarqProcessesTimer_t>::iterator itTimers;
491 NS_LOG_DEBUG (
this <<
" Reset HARQ proc " << i <<
" for RNTI " << (*itTimers).first);
492 std::map <uint16_t, DlHarqProcessesStatus_t>::iterator itStat =
m_dlHarqProcessesStatus.find ((*itTimers).first);
495 NS_FATAL_ERROR (
"No Process Id Status found for this RNTI " << (*itTimers).first);
497 (*itStat).second.at (i) = 0;
498 (*itTimers).second.at (i) = 0;
502 (*itTimers).second.at (i)++;
525 std::map <uint16_t, std::vector <uint16_t> > allocationMap;
526 std::vector <bool> rbgMap;
527 uint16_t rbgAllocatedNum = 0;
528 std::set <uint16_t> rntiAllocated;
532 for (std::vector<bool>::iterator it = rbgMap.begin (); it != rbgMap.end (); it++)
543 std::map <uint16_t, uint8_t>::iterator itProcId;
546 (*itProcId).second = ((*itProcId).second + 1) %
HARQ_PROC_NUM;
550 uint16_t rbAllocatedNum = 0;
551 std::vector <bool> ulRbMap;
554 uint8_t maxContinuousUlBandwidth = 0;
555 uint8_t tmpMinBandwidth = 0;
556 uint16_t ffrRbStartOffset = 0;
557 uint16_t tmpFfrRbStartOffset = 0;
560 for (std::vector<bool>::iterator it = ulRbMap.begin (); it != ulRbMap.end (); it++)
565 if (tmpMinBandwidth > maxContinuousUlBandwidth)
567 maxContinuousUlBandwidth = tmpMinBandwidth;
568 ffrRbStartOffset = tmpFfrRbStartOffset;
574 if (tmpMinBandwidth == 0)
576 tmpFfrRbStartOffset = index;
583 if (tmpMinBandwidth > maxContinuousUlBandwidth)
585 maxContinuousUlBandwidth = tmpMinBandwidth;
586 ffrRbStartOffset = tmpFfrRbStartOffset;
590 uint16_t rbStart = 0;
591 rbStart = ffrRbStartOffset;
592 std::vector <struct RachListElement_s>::iterator itRach;
597 newRar.
m_rnti = (*itRach).m_rnti;
604 uint16_t tbSizeBits = 0;
606 while ((tbSizeBits < (*itRach).m_estimatedSize) && (rbStart + rbLen < (ffrRbStartOffset + maxContinuousUlBandwidth)))
611 if (tbSizeBits < (*itRach).m_estimatedSize)
623 NS_LOG_INFO (
this <<
" UL grant allocated to RNTI " << (*itRach).m_rnti <<
" rbStart " << rbStart <<
" rbLen " << rbLen <<
" MCS " << (uint16_t)
m_ulGrantMcs <<
" tbSize " << newRar.
m_grant.
m_tbSize);
624 for (uint16_t i = rbStart; i < rbStart + rbLen; i++)
652 std::map <uint16_t, uint8_t>::iterator itProcId;
658 harqId = (*itProcId).second;
664 (*itDci).second.at (harqId) = uldci;
667 rbStart = rbStart + rbLen;
680 NS_LOG_INFO (
this <<
" Received DL-HARQ feedback");
696 std::vector <struct DlInfoListElement_s> dlInfoListUntxed;
700 if (itRnti != rntiAllocated.end ())
706 std::vector <bool> retx;
707 NS_LOG_INFO (
this <<
" Processing DLHARQ feedback");
711 retx.push_back (
false);
718 if (retx.at (0) || retx.at (1))
723 NS_LOG_INFO (
this <<
" HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId);
732 if (dci.
m_rv.size () == 1)
734 rv = dci.
m_rv.at (0);
738 rv = (dci.
m_rv.at (0) > dci.
m_rv.at (1) ? dci.
m_rv.at (0) : dci.
m_rv.at (1));
744 NS_LOG_INFO (
"Maximum number of retransmissions reached -> drop process");
750 (*it).second.at (harqId) = 0;
756 for (uint16_t
k = 0;
k < (*itRlcPdu).second.size ();
k++)
758 (*itRlcPdu).second.at (
k).at (harqId).clear ();
764 std::vector <int> dciRbg;
767 for (
int j = 0; j < 32; j++)
771 dciRbg.push_back (j);
777 for (uint8_t j = 0; j < dciRbg.size (); j++)
779 if (rbgMap.at (dciRbg.at (j)) ==
true)
789 for (uint8_t j = 0; j < dciRbg.size (); j++)
791 rbgMap.at (dciRbg.at (j)) =
true;
792 NS_LOG_INFO (
"RBG " << dciRbg.at (j) <<
" assigned");
796 NS_LOG_INFO (
this <<
" Send retx in the same RBGs");
802 uint8_t rbgId = (dciRbg.at (dciRbg.size () - 1) + 1) % rbgNum;
803 uint8_t startRbg = dciRbg.at (dciRbg.size () - 1);
804 std::vector <bool> rbgMapCopy = rbgMap;
805 while ((j < dciRbg.size ())&&(startRbg != rbgId))
807 if (rbgMapCopy.at (rbgId) ==
false)
809 rbgMapCopy.at (rbgId) =
true;
810 dciRbg.at (j) = rbgId;
813 rbgId = (rbgId + 1) % rbgNum;
815 if (j == dciRbg.size ())
818 uint32_t rbgMask = 0;
819 for (uint16_t
k = 0;
k < dciRbg.size ();
k++)
821 rbgMask = rbgMask + (0x1 << dciRbg.at (
k));
826 NS_LOG_INFO (
this <<
" Move retx in RBGs " << dciRbg.size ());
832 NS_LOG_INFO (
this <<
" No resource for this retx -> buffer it");
840 NS_FATAL_ERROR (
"Unable to find RlcPdcList in HARQ buffer for RNTI " << rnti);
842 for (uint8_t j = 0; j < nLayers; j++)
846 if (j >= dci.
m_ndi.size ())
849 dci.
m_ndi.push_back (0);
850 dci.
m_rv.push_back (0);
851 dci.
m_mcs.push_back (0);
853 NS_LOG_INFO (
this <<
" layer " << (uint16_t)j <<
" no txed (MIMO transition)");
857 dci.
m_ndi.at (j) = 0;
859 (*itHarq).second.at (harqId).m_rv.at (j)++;
860 NS_LOG_INFO (
this <<
" layer " << (uint16_t)j <<
" RV " << (uint16_t)dci.
m_rv.at (j));
866 dci.
m_ndi.at (j) = 0;
868 dci.
m_mcs.at (j) = 0;
870 NS_LOG_INFO (
this <<
" layer " << (uint16_t)j <<
" no retx");
873 for (uint16_t
k = 0;
k < (*itRlcPdu).second.at (0).at (dci.
m_harqProcess).size ();
k++)
875 std::vector <struct RlcPduListElement_s> rlcPduListPerLc;
876 for (uint8_t j = 0; j < nLayers; j++)
880 if (j < dci.
m_ndi.size ())
883 rlcPduListPerLc.push_back ((*itRlcPdu).second.at (j).at (dci.
m_harqProcess).at (
k));
892 rlcPduListPerLc.push_back (emptyElement);
896 if (rlcPduListPerLc.size () > 0)
903 (*itHarq).second.at (harqId).
m_rv = dci.
m_rv;
908 NS_FATAL_ERROR (
"Unable to find HARQ timer for RNTI " << (uint16_t)rnti);
910 (*itHarqTimer).second.at (harqId) = 0;
912 rntiAllocated.insert (rnti);
929 for (uint16_t
k = 0;
k < (*itRlcPdu).second.size ();
k++)
938 if (rbgAllocatedNum == rbgNum)
949 std::map <uint16_t, pssFlowPerf_t>::iterator it;
950 std::map <uint16_t, pssFlowPerf_t> tdUeSet;
953 std::map <uint16_t, pssFlowPerf_t> ueSet;
958 ueSet.insert(std::pair <uint16_t, pssFlowPerf_t> ((*it).first, (*it).second));
962 if (ueSet.size() != 0)
966 std::vector <std::pair<double, uint16_t> > ueSet1;
967 std::vector <std::pair<double,uint16_t> > ueSet2;
968 for (it = ueSet.begin (); it != ueSet.end (); it++)
970 std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
974 if (itRnti != rntiAllocated.end ())
976 NS_LOG_DEBUG (
this <<
" RNTI discared for HARQ tx" << (uint16_t)(*it).first);
980 NS_LOG_DEBUG (
this <<
" RNTI discared for HARQ id" << (uint16_t)(*it).first);
986 if ((*it).second.lastAveragedThroughput < (*it).second.targetThroughput )
989 metric = 1 / (*it).second.lastAveragedThroughput;
992 std::map <uint16_t,uint8_t>::iterator itCqi;
994 std::map <uint16_t,uint8_t>::iterator itTxMode;
998 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
1003 for (uint8_t j = 0; j < nLayer; j++)
1011 cqiSum = (*itCqi).second;
1016 ueSet1.push_back(std::pair<double, uint16_t> (metric, (*it).first));
1022 std::map <uint16_t,uint8_t>::iterator itCqi;
1024 std::map <uint16_t,uint8_t>::iterator itTxMode;
1028 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
1038 wbCqi = (*itCqi).second;
1046 double achievableRate = 0.0;
1047 for (uint8_t
k = 0;
k < nLayer;
k++)
1050 mcs =
m_amc->GetMcsFromCqi (wbCqi);
1051 achievableRate += ((
m_amc->GetDlTbSizeFromMcs (mcs, rbgSize) / 8) / 0.001);
1054 metric = achievableRate / (*it).second.lastAveragedThroughput;
1056 ueSet2.push_back(std::pair<double, uint16_t> (metric, (*it).first));
1062 if (ueSet1.size () != 0 || ueSet2.size () != 0)
1065 std::sort (ueSet1.rbegin (), ueSet1.rend ());
1066 std::sort (ueSet2.rbegin (), ueSet2.rend ());
1075 if (ueSet1.size() + ueSet2.size() <=2 )
1078 nMux = (int)((ueSet1.size() + ueSet2.size()) / 2) ;
1082 std::vector <std::pair<double, uint16_t> >::iterator itSet;
1083 for (itSet = ueSet1.begin (); itSet != ueSet1.end () && nMux != 0; itSet++)
1085 std::map <uint16_t, pssFlowPerf_t>::iterator itUe;
1087 tdUeSet.insert(std::pair<uint16_t, pssFlowPerf_t> ( (*itUe).first, (*itUe).second ) );
1094 for (itSet = ueSet2.begin (); itSet != ueSet2.end () && nMux != 0; itSet++)
1096 std::map <uint16_t, pssFlowPerf_t>::iterator itUe;
1098 tdUeSet.insert(std::pair<uint16_t, pssFlowPerf_t> ( (*itUe).first, (*itUe).second ) );
1111 std::map < uint16_t, uint8_t > sbCqiSum;
1112 for (it = tdUeSet.begin (); it != tdUeSet.end (); it++)
1115 for (
int i = 0; i < rbgNum; i++)
1117 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
1119 std::map <uint16_t,uint8_t>::iterator itTxMode;
1123 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
1126 std::vector <uint8_t> sbCqis;
1129 for (uint8_t
k = 0;
k < nLayer;
k++)
1131 sbCqis.push_back (1);
1136 sbCqis = (*itCqi).second.m_higherLayerSelected.at (i).m_sbCqi;
1139 uint8_t cqi1 = sbCqis.at (0);
1141 if (sbCqis.size () > 1)
1143 cqi2 = sbCqis.at (1);
1147 if ((cqi1 > 0)||(cqi2 > 0))
1149 for (uint8_t
k = 0;
k < nLayer;
k++)
1151 if (sbCqis.size () >
k)
1153 sbCqi = sbCqis.at(
k);
1165 sbCqiSum.insert (std::pair<uint16_t, uint8_t> ((*it).first, sum));
1168 for (
int i = 0; i < rbgNum; i++)
1170 if (rbgMap.at (i) ==
true)
1173 std::map <uint16_t, pssFlowPerf_t>::iterator itMax = tdUeSet.end ();
1174 double metricMax = 0.0;
1175 for (it = tdUeSet.begin (); it != tdUeSet.end (); it++)
1181 double weight = (*it).second.targetThroughput / (*it).second.lastAveragedThroughput;
1185 std::map < uint16_t, uint8_t>::iterator itSbCqiSum;
1186 itSbCqiSum = sbCqiSum.find((*it).first);
1188 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
1190 std::map <uint16_t,uint8_t>::iterator itTxMode;
1194 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
1197 std::vector <uint8_t> sbCqis;
1200 for (uint8_t
k = 0;
k < nLayer;
k++)
1202 sbCqis.push_back (1);
1207 sbCqis = (*itCqi).second.m_higherLayerSelected.at (i).m_sbCqi;
1210 uint8_t cqi1 = sbCqis.at( 0);
1212 if (sbCqis.size () > 1)
1214 cqi2 = sbCqis.at(1);
1218 double colMetric = 0.0;
1219 if ((cqi1 > 0)||(cqi2 > 0))
1221 for (uint8_t
k = 0;
k < nLayer;
k++)
1223 if (sbCqis.size () >
k)
1225 sbCqi = sbCqis.at(
k);
1232 colMetric += (double)sbCqi / (
double)(*itSbCqiSum).second;
1236 double metric = 0.0;
1238 metric= weight * colMetric;
1242 if (metric > metricMax )
1249 if (itMax == tdUeSet.end ())
1255 allocationMap[(*itMax).first].push_back (i);
1256 rbgMap.at (i) =
true;
1266 for (
int i = 0; i < rbgNum; i++)
1268 if (rbgMap.at (i) ==
true)
1271 std::map <uint16_t, pssFlowPerf_t>::iterator itMax = tdUeSet.end ();
1272 double metricMax = 0.0;
1273 for (it = tdUeSet.begin (); it != tdUeSet.end (); it++)
1278 double weight = (*it).second.targetThroughput / (*it).second.lastAveragedThroughput;
1282 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
1284 std::map <uint16_t,uint8_t>::iterator itTxMode;
1288 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
1291 std::vector <uint8_t> sbCqis;
1294 for (uint8_t
k = 0;
k < nLayer;
k++)
1296 sbCqis.push_back (1);
1301 sbCqis = (*itCqi).second.m_higherLayerSelected.at (i).m_sbCqi;
1304 uint8_t cqi1 = sbCqis.at(0);
1306 if (sbCqis.size () > 1)
1308 cqi2 = sbCqis.at(1);
1311 double schMetric = 0.0;
1312 if ((cqi1 > 0)||(cqi2 > 0))
1314 double achievableRate = 0.0;
1315 for (uint8_t
k = 0;
k < nLayer;
k++)
1318 if (sbCqis.size () >
k)
1320 mcs =
m_amc->GetMcsFromCqi (sbCqis.at (
k));
1327 achievableRate += ((
m_amc->GetDlTbSizeFromMcs (mcs, rbgSize) / 8) / 0.001);
1329 schMetric = achievableRate / (*it).second.secondLastAveragedThroughput;
1332 double metric = 0.0;
1333 metric= weight * schMetric;
1335 if (metric > metricMax )
1342 if (itMax == tdUeSet.end ())
1348 allocationMap[(*itMax).first].push_back (i);
1349 rbgMap.at (i) =
true;
1363 std::map <uint16_t, pssFlowPerf_t>::iterator itStats;
1366 (*itStats).second.lastTtiBytesTransmitted = 0;
1371 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap = allocationMap.begin ();
1372 while (itMap != allocationMap.end ())
1376 newEl.
m_rnti = (*itMap).first;
1379 newDci.
m_rnti = (*itMap).first;
1387 lcActives = (uint16_t)65535;
1389 uint16_t RgbPerRnti = (*itMap).second.size ();
1390 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
1392 std::map <uint16_t,uint8_t>::iterator itTxMode;
1396 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*itMap).first);
1399 std::vector <uint8_t> worstCqi (2, 15);
1402 for (uint16_t
k = 0;
k < (*itMap).second.size ();
k++)
1404 if ((*itCqi).second.m_higherLayerSelected.size () > (*itMap).second.at (
k))
1406 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)) );
1407 for (uint8_t j = 0; j < nLayer; j++)
1409 if ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (
k)).m_sbCqi.size () > j)
1411 if (((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (
k)).m_sbCqi.at (j)) < worstCqi.at (j))
1413 worstCqi.at (j) = ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (
k)).m_sbCqi.at (j));
1419 worstCqi.at (j) = 1;
1425 for (uint8_t j = 0; j < nLayer; j++)
1427 worstCqi.at (j) = 1;
1434 for (uint8_t j = 0; j < nLayer; j++)
1436 worstCqi.at (j) = 1;
1439 for (uint8_t j = 0; j < nLayer; j++)
1441 NS_LOG_INFO (
this <<
" Layer " << (uint16_t)j <<
" CQI selected " << (uint16_t)worstCqi.at (j));
1443 uint32_t bytesTxed = 0;
1444 for (uint8_t j = 0; j < nLayer; j++)
1446 newDci.
m_mcs.push_back (
m_amc->GetMcsFromCqi (worstCqi.at (j)));
1447 int tbSize = (
m_amc->GetDlTbSizeFromMcs (newDci.
m_mcs.at (j), RgbPerRnti * rbgSize) / 8);
1449 NS_LOG_INFO (
this <<
" Layer " << (uint16_t)j <<
" MCS selected" <<
m_amc->GetMcsFromCqi (worstCqi.at (j)));
1450 bytesTxed += tbSize;
1455 uint32_t rbgMask = 0;
1456 for (uint16_t
k = 0;
k < (*itMap).second.size ();
k++)
1458 rbgMask = rbgMask + (0x1 << (*itMap).second.at (
k));
1459 NS_LOG_INFO (
this <<
" Allocated RBG " << (*itMap).second.at (
k));
1464 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator itBufReq;
1467 if (((*itBufReq).first.m_rnti == (*itMap).first)
1468 && (((*itBufReq).second.m_rlcTransmissionQueueSize > 0)
1469 || ((*itBufReq).second.m_rlcRetransmissionQueueSize > 0)
1470 || ((*itBufReq).second.m_rlcStatusPduSize > 0) ))
1472 std::vector <struct RlcPduListElement_s> newRlcPduLe;
1473 for (uint8_t j = 0; j < nLayer; j++)
1479 newRlcPduLe.push_back (newRlcEl);
1487 NS_FATAL_ERROR (
"Unable to find RlcPdcList in HARQ buffer for RNTI " << (*itMap).first);
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;
1531 std::map <uint16_t, pssFlowPerf_t>::iterator it;
1535 (*it).second.lastTtiBytesTransmitted = bytesTxed;
1536 NS_LOG_INFO (
this <<
" UE total bytes txed " << (*it).second.lastTtiBytesTransmitted);
1554 std::map <uint16_t, pssFlowPerf_t>::iterator itUeScheduleted = tdUeSet.end();
1555 itUeScheduleted = tdUeSet.find((*itStats).first);
1556 if (itUeScheduleted != tdUeSet.end())
1558 (*itStats).second.secondLastAveragedThroughput = ((1.0 - (1 /
m_timeWindow)) * (*itStats).second.secondLastAveragedThroughput) + ((1 /
m_timeWindow) * (double)((*itStats).second.lastTtiBytesTransmitted / 0.001));
1561 (*itStats).second.totalBytesTransmitted += (*itStats).second.lastTtiBytesTransmitted;
1563 (*itStats).second.lastAveragedThroughput = ((1.0 - (1.0 /
m_timeWindow)) * (*itStats).second.lastAveragedThroughput) + ((1.0 /
m_timeWindow) * (double)((*itStats).second.lastTtiBytesTransmitted / 0.001));
1564 (*itStats).second.lastTtiBytesTransmitted = 0;
1590 for (
unsigned int i = 0; i < params.
m_cqiList.size (); i++)
1595 std::map <uint16_t,uint8_t>::iterator it;
1596 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
1601 m_p10CqiRxed.insert ( std::pair<uint16_t, uint8_t > (rnti, params.
m_cqiList.at (i).m_wbCqi.at (0)) );
1608 (*it).second = params.
m_cqiList.at (i).m_wbCqi.at (0);
1610 std::map <uint16_t,uint32_t>::iterator itTimers;
1618 std::map <uint16_t,SbMeasResult_s>::iterator it;
1619 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
1624 m_a30CqiRxed.insert ( std::pair<uint16_t, SbMeasResult_s > (rnti, params.
m_cqiList.at (i).m_sbMeasResult) );
1630 (*it).second = params.
m_cqiList.at (i).m_sbMeasResult;
1631 std::map <uint16_t,uint32_t>::iterator itTimers;
1649 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find (rnti);
1660 unsigned int sinrNum = 0;
1663 double sinr = (*itCqi).second.at (i);
1670 double estimatedSinr = (sinrNum > 0) ? (sinrSum / sinrNum) : DBL_MAX;
1672 (*itCqi).second.at (rb) = estimatedSinr;
1673 return (estimatedSinr);
1687 std::vector <bool> rbMap;
1688 uint16_t rbAllocatedNum = 0;
1689 std::set <uint16_t> rntiAllocated;
1690 std::vector <uint16_t> rbgAllocationMap;
1701 for (std::vector<bool>::iterator it = rbMap.begin (); it != rbMap.end (); it++)
1716 if (rbgAllocationMap.at (i) != 0)
1718 rbMap.at (i) =
true;
1727 for (uint16_t i = 0; i < params.
m_ulInfoList.size (); i++)
1736 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1739 NS_LOG_INFO (
this <<
" UL-HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId <<
" i " << i <<
" size " << params.
m_ulInfoList.size ());
1743 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1750 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1752 if ((*itStat).second.at (harqId) >= 3)
1754 NS_LOG_INFO (
"Max number of retransmissions reached (UL)-> drop process");
1760 if (rbMap.at (j) ==
true)
1771 rbMap.at (j) =
true;
1772 rbgAllocationMap.at (j) = dci.
m_rnti;
1780 NS_LOG_INFO (
"Cannot allocate retx due to RACH allocations for UE " << rnti);
1785 (*itStat).second.at ((*itProcId).second) = (*itStat).second.at (harqId) + 1;
1786 (*itStat).second.at (harqId) = 0;
1787 (*itHarq).second.at ((*itProcId).second) = dci;
1789 rntiAllocated.insert (dci.
m_rnti);
1798 std::map <uint16_t,uint32_t>::iterator it;
1803 std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
1805 if (((*it).second > 0)&&(itRnti == rntiAllocated.end ()))
1824 uint16_t tempRbPerFlow = (ffrUlBandwidth) / (nflows + rntiAllocated.size ());
1825 uint16_t rbPerFlow = (minContinuousUlBandwidth < tempRbPerFlow) ? minContinuousUlBandwidth : tempRbPerFlow;
1831 int rbAllocated = 0;
1833 std::map <uint16_t, pssFlowPerf_t>::iterator itStats;
1855 std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
1856 if ((itRnti != rntiAllocated.end ())||((*it).second == 0))
1859 NS_LOG_DEBUG (
this <<
" UE already allocated in HARQ -> discared, RNTI " << (*it).first);
1882 uldci.
m_rnti = (*it).first;
1884 bool allocated =
false;
1885 NS_LOG_INFO (
this <<
" RB Allocated " << rbAllocated <<
" rbPerFlow " << rbPerFlow <<
" flows " << nflows);
1890 for (uint16_t j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1892 if (rbMap.at (j) ==
true)
1905 NS_LOG_INFO (
this <<
"RNTI: "<< (*it).first<<
" RB Allocated " << rbAllocated <<
" rbPerFlow " << rbPerFlow <<
" flows " << nflows);
1908 for (uint16_t j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1910 rbMap.at (j) =
true;
1912 rbgAllocationMap.at (j) = (*it).first;
1914 rbAllocated += rbPerFlow;
1946 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find ((*it).first);
1956 NS_ABORT_MSG_IF ((*itCqi).second.size() == 0,
"CQI of RNTI = " << (*it).first <<
" has expired");
1957 double minSinr = (*itCqi).second.at (uldci.
m_rbStart);
1964 double sinr = (*itCqi).second.at (i);
1976 double s = log2 ( 1 + (
1977 std::pow (10, minSinr / 10 ) /
1978 ( (-std::log (5.0 * 0.00005 )) / 1.5) ));
1979 cqi =
m_amc->GetCqiFromSpectralEfficiency (s);
1992 rbgAllocationMap.at (i) = 0;
2018 std::map <uint16_t, uint8_t>::iterator itProcId;
2024 harqId = (*itProcId).second;
2030 (*itDci).second.at (harqId) = uldci;
2035 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << uldci.
m_rnti);
2037 (*itStat).second.at (harqId) = 0;
2040 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);
2082 std::map <uint16_t,uint32_t>::iterator it;
2084 for (
unsigned int i = 0; i < params.
m_macCeList.size (); i++)
2095 uint32_t buffer = 0;
2096 for (uint8_t lcg = 0; lcg < 4; ++lcg)
2098 uint8_t bsrId = params.
m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (lcg);
2103 NS_LOG_LOGIC (
this <<
"RNTI=" << rnti <<
" buffer=" << buffer);
2108 m_ceBsrRxed.insert ( std::pair<uint16_t, uint32_t > (rnti, buffer));
2113 (*it).second = buffer;
2150 switch (params.
m_ulCqi.m_type)
2154 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
2155 std::map <uint16_t, std::vector <double> >::iterator itCqi;
2156 NS_LOG_DEBUG (
this <<
" Collect PUSCH CQIs of Frame no. " << (params.
m_sfnSf >> 4) <<
" subframe no. " << (0xF & params.
m_sfnSf));
2162 for (uint32_t i = 0; i < (*itMap).second.size (); i++)
2166 itCqi =
m_ueCqi.find ((*itMap).second.at (i));
2170 std::vector <double> newCqi;
2175 newCqi.push_back (sinr);
2184 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > ((*itMap).second.at (i), newCqi));
2191 (*itCqi).second.at (i) = sinr;
2192 NS_LOG_DEBUG (
this <<
" RNTI " << (*itMap).second.at (i) <<
" RB " << i <<
" SINR " << sinr);
2194 std::map <uint16_t, uint32_t>::iterator itTimers;
2215 rnti = vsp->GetRnti ();
2218 std::map <uint16_t, std::vector <double> >::iterator itCqi;
2223 std::vector <double> newCqi;
2227 newCqi.push_back (sinr);
2228 NS_LOG_INFO (
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value " << sinr);
2231 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > (rnti, newCqi));
2241 (*itCqi).second.at (j) = sinr;
2242 NS_LOG_INFO (
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value " << sinr);
2245 std::map <uint16_t, uint32_t>::iterator itTimers;
2258 NS_FATAL_ERROR (
"PssFfMacScheduler supports only PUSCH and SRS UL-CQIs");
2271 std::map <uint16_t,uint32_t>::iterator itP10 =
m_p10CqiTimers.begin ();
2275 if ((*itP10).second == 0)
2278 std::map <uint16_t,uint8_t>::iterator itMap =
m_p10CqiRxed.find ((*itP10).first);
2280 NS_LOG_INFO (
this <<
" P10-CQI expired for user " << (*itP10).first);
2282 std::map <uint16_t,uint32_t>::iterator temp = itP10;
2294 std::map <uint16_t,uint32_t>::iterator itA30 =
m_a30CqiTimers.begin ();
2298 if ((*itA30).second == 0)
2301 std::map <uint16_t,SbMeasResult_s>::iterator itMap =
m_a30CqiRxed.find ((*itA30).first);
2303 NS_LOG_INFO (
this <<
" A30-CQI expired for user " << (*itA30).first);
2305 std::map <uint16_t,uint32_t>::iterator temp = itA30;
2324 std::map <uint16_t,uint32_t>::iterator itUl =
m_ueCqiTimers.begin ();
2328 if ((*itUl).second == 0)
2331 std::map <uint16_t, std::vector <double> >::iterator itMap =
m_ueCqi.find ((*itUl).first);
2332 NS_ASSERT_MSG (itMap !=
m_ueCqi.end (),
" Does not find CQI report for user " << (*itUl).first);
2333 NS_LOG_INFO (
this <<
" UL-CQI exired for user " << (*itUl).first);
2334 (*itMap).second.clear ();
2336 std::map <uint16_t,uint32_t>::iterator temp = itUl;
2353 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
2358 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);
2361 if (((*it).second.m_rlcStatusPduSize > 0) && (size >= (*it).second.m_rlcStatusPduSize))
2363 (*it).second.m_rlcStatusPduSize = 0;
2365 else if (((*it).second.m_rlcRetransmissionQueueSize > 0) && (size >= (*it).second.m_rlcRetransmissionQueueSize))
2367 (*it).second.m_rlcRetransmissionQueueSize = 0;
2369 else if ((*it).second.m_rlcTransmissionQueueSize > 0)
2371 uint32_t rlcOverhead;
2386 if ((*it).second.m_rlcTransmissionQueueSize <= size - rlcOverhead)
2388 (*it).second.m_rlcTransmissionQueueSize = 0;
2392 (*it).second.m_rlcTransmissionQueueSize -= size - rlcOverhead;
2398 NS_LOG_ERROR (
this <<
" Does not find DL RLC Buffer Report of UE " << rnti);
2407 std::map <uint16_t,uint32_t>::iterator it =
m_ceBsrRxed.find (rnti);
2410 NS_LOG_INFO (
this <<
" UE " << rnti <<
" size " << size <<
" BSR " << (*it).second);
2411 if ((*it).second >= size)
2413 (*it).second -= size;
2422 NS_LOG_ERROR (
this <<
" Does not find BSR report info of UE " << rnti);
2430 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 Priority Set scheduler.
std::map< uint16_t, DlHarqProcessesStatus_t > m_dlHarqProcessesStatus
DL HARQ process status.
void DoSchedUlCqiInfoReq(const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ¶ms)
Sched UL CQI info request function.
void DoCschedUeReleaseReq(const struct FfMacCschedSapProvider::CschedUeReleaseReqParameters ¶ms)
CSched UE release request function.
double EstimateUlSinr(uint16_t rnti, uint16_t rb)
Estimate UL SINR function.
uint8_t HarqProcessAvailability(uint16_t rnti)
Return the availability of free process for the RNTI specified.
virtual LteFfrSapUser * GetLteFfrSapUser()
std::map< uint16_t, uint8_t > m_uesTxMode
txMode of the UEs
static TypeId GetTypeId(void)
Get the type ID.
void RefreshDlCqiMaps(void)
Refresh DL CQI maps function.
std::map< uint16_t, UlHarqProcessesDciBuffer_t > m_ulHarqProcessesDciBuffer
UL HARQ process DCI buffer.
std::map< uint16_t, uint32_t > m_a30CqiTimers
Map of UE's timers on DL CQI A30 received.
FfMacCschedSapProvider * m_cschedSapProvider
CSched SAP provider.
friend class MemberSchedSapProvider< PssFfMacScheduler >
allow MemberSchedSapProvider<PssFfMacScheduler> class friend access
void DoSchedDlMacBufferReq(const struct FfMacSchedSapProvider::SchedDlMacBufferReqParameters ¶ms)
Sched DL MAC buffer request function.
unsigned int LcActivePerFlow(uint16_t rnti)
Get LC active flow function.
virtual FfMacSchedSapProvider * GetFfMacSchedSapProvider()
void DoCschedUeConfigReq(const struct FfMacCschedSapProvider::CschedUeConfigReqParameters ¶ms)
CSched UE config request function.
std::vector< uint16_t > m_rachAllocationMap
RACH allocation map.
void DoSchedUlMacCtrlInfoReq(const struct FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters ¶ms)
Sched UL MAC control info request function.
uint8_t m_ulGrantMcs
MCS for UL grant (default 0)
uint32_t m_cqiTimersThreshold
void DoSchedUlSrInfoReq(const struct FfMacSchedSapProvider::SchedUlSrInfoReqParameters ¶ms)
Sched UL SR info request function.
std::map< LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters > m_rlcBufferReq
Vectors of UE's LC info.
uint8_t UpdateHarqProcessId(uint16_t rnti)
Update and return a new process Id for the RNTI specified.
void DoCschedLcReleaseReq(const struct FfMacCschedSapProvider::CschedLcReleaseReqParameters ¶ms)
CSched LC release request function.
uint32_t m_nMux
TD scheduler selects nMux UEs and transfer them to FD scheduler.
std::vector< DlInfoListElement_s > m_dlInfoListBuffered
HARQ retx buffered.
FfMacCschedSapProvider::CschedCellConfigReqParameters m_cschedCellConfig
CSched cell config.
bool m_harqOn
m_harqOn when false inhibit the HARQ mechanisms (by default active)
std::map< uint16_t, SbMeasResult_s > m_a30CqiRxed
Map of UE's DL CQI A30 received.
std::map< uint16_t, std::vector< double > > m_ueCqi
Map of UEs' UL-CQI per RBG.
void DoSchedDlTriggerReq(const struct FfMacSchedSapProvider::SchedDlTriggerReqParameters ¶ms)
Sched DL trigger request function.
std::vector< struct RachListElement_s > m_rachList
RACH list.
void DoSchedDlRachInfoReq(const struct FfMacSchedSapProvider::SchedDlRachInfoReqParameters ¶ms)
Sched DL RACH info request function.
void RefreshUlCqiMaps(void)
Refresh UL CQI maps function.
std::string m_fdSchedulerType
FD scheduler type.
void DoSchedDlPagingBufferReq(const struct FfMacSchedSapProvider::SchedDlPagingBufferReqParameters ¶ms)
Sched DL paging buffer request function.
void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size)
Update UL RLC buffer info function.
void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size)
Update DL RLC buffer info function.
void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode)
Transmission mode configuration update function.
std::map< uint16_t, DlHarqProcessesTimer_t > m_dlHarqProcessesTimer
DL HARQ process timer.
virtual void SetLteFfrSapProvider(LteFfrSapProvider *s)
Set the Provider part of the LteFfrSap that this Scheduler will interact with.
void DoSchedUlTriggerReq(const struct FfMacSchedSapProvider::SchedUlTriggerReqParameters ¶ms)
Sched UL trigger request function.
virtual void SetFfMacCschedSapUser(FfMacCschedSapUser *s)
set the user part of the FfMacCschedSap that this Scheduler will interact with.
uint16_t m_nextRntiUl
RNTI of the next user to be served next scheduling in UL.
void DoCschedCellConfigReq(const struct FfMacCschedSapProvider::CschedCellConfigReqParameters ¶ms)
CSched cell config request function.
std::map< uint16_t, std::vector< uint16_t > > m_allocationMaps
Map of previous allocated UE per RBG (used to retrieve info from UL-CQI)
int GetRbgSize(int dlbandwidth)
Get RBG size function.
LteFfrSapProvider * m_ffrSapProvider
FFR SAP provider.
LteFfrSapUser * m_ffrSapUser
FFR SAP user.
std::map< uint16_t, uint8_t > m_dlHarqCurrentProcessId
DL HARQ current proess ID.
void DoSchedDlRlcBufferReq(const struct FfMacSchedSapProvider::SchedDlRlcBufferReqParameters ¶ms)
Sched DL RLC buffer request function.
std::map< uint16_t, DlHarqProcessesDciBuffer_t > m_dlHarqProcessesDciBuffer
DL HARQ process DCI buffer.
std::map< uint16_t, uint8_t > m_ulHarqCurrentProcessId
UL HARQ process ID.
std::map< uint16_t, uint32_t > m_p10CqiTimers
Map of UE's timers on DL CQI P01 received.
void RefreshHarqProcesses()
Refresh HARQ processes according to the timers.
std::map< uint16_t, uint8_t > m_p10CqiRxed
Map of UE's DL CQI P01 received.
std::map< uint16_t, UlHarqProcessesStatus_t > m_ulHarqProcessesStatus
UL HARQ process status.
FfMacSchedSapUser * m_schedSapUser
Sched SAP user.
FfMacCschedSapUser * m_cschedSapUser
CSched SAP user.
PssFfMacScheduler()
Constructor.
FfMacSchedSapProvider * m_schedSapProvider
Sched SAP provider.
friend class MemberCschedSapProvider< PssFfMacScheduler >
allow MemberCschedSapProvider<PssFfMacScheduler> class friend access
std::map< uint16_t, uint32_t > m_ceBsrRxed
Map of UE's buffer status reports received.
void DoSchedUlNoiseInterferenceReq(const struct FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters ¶ms)
Sched UL noise inteference request function.
virtual void SetFfMacSchedSapUser(FfMacSchedSapUser *s)
set the user part of the FfMacSchedSap that this Scheduler will interact with.
std::map< uint16_t, pssFlowPerf_t > m_flowStatsDl
Map of UE statistics (per RNTI basis) in downlink.
void DoSchedDlCqiInfoReq(const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)
Sched DL CQI info request function.
virtual ~PssFfMacScheduler()
Destructor.
std::map< uint16_t, DlHarqRlcPduListBuffer_t > m_dlHarqProcessesRlcPduListBuffer
DL HARQ ELC PDU list buffer.
double m_timeWindow
time window
virtual void DoDispose(void)
Destructor implementation.
virtual FfMacCschedSapProvider * GetFfMacCschedSapProvider()
std::map< uint16_t, pssFlowPerf_t > m_flowStatsUl
Map of UE statistics (per RNTI basis)
std::map< uint16_t, uint32_t > m_ueCqiTimers
Map of UEs' timers on UL-CQI per RBG.
void DoCschedLcConfigReq(const struct FfMacCschedSapProvider::CschedLcConfigReqParameters ¶ms)
CSched LC config request function.
Smart pointer class similar to boost::intrusive_ptr.
static Time Now(void)
Return the current simulation virtual time.
Hold variables of type string.
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 > MakeStringAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeChecker > MakeStringChecker(void)
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::vector< UlDciListElement_s > UlHarqProcessesDciBuffer_t
UL HARQ process DCI buffer vector.
std::vector< uint8_t > DlHarqProcessesTimer_t
DL HARQ process timer vector typedef.
std::vector< uint8_t > DlHarqProcessesStatus_t
DL HARQ process status vector typedef.
std::vector< RlcPduList_t > DlHarqRlcPduListBuffer_t
vector of the 8 HARQ processes per UE
static const int PssType0AllocationRbg[4]
PSS type 0 allocation RBG.
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?
double secondLastAveragedThroughput
Second last average throughput.
double lastAveragedThroughput
Past average throughput.
double targetThroughput
Target throughput.
Time flowStart
flow start time
unsigned int lastTtiBytesTransmitted
Total bytes send by eNB in last tti for this UE.
unsigned long totalBytesTransmitted
Total bytes send by eNb for this UE.