23 #include <ns3/pointer.h> 26 #include <ns3/simulator.h> 27 #include <ns3/lte-amc.h> 28 #include <ns3/fdtbfq-ff-mac-scheduler.h> 29 #include <ns3/lte-vendor-specific-parameters.h> 30 #include <ns3/boolean.h> 31 #include <ns3/integer.h> 53 : m_cschedSapUser (0),
58 m_amc = CreateObject <LteAmc> ();
93 .AddAttribute (
"CqiTimerThreshold",
94 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
97 MakeUintegerChecker<uint32_t> ())
98 .AddAttribute (
"DebtLimit",
99 "Flow debt limit (default -625000 bytes)",
102 MakeIntegerChecker<int> ())
103 .AddAttribute (
"CreditLimit",
104 "Flow credit limit (default 625000 bytes)",
107 MakeUintegerChecker<uint32_t> ())
108 .AddAttribute (
"TokenPoolSize",
109 "The maximum value of flow token pool (default 1 bytes)",
112 MakeUintegerChecker<uint32_t> ())
113 .AddAttribute (
"CreditableThreshold",
114 "Threshold of flow credit (default 0 bytes)",
117 MakeUintegerChecker<uint32_t> ())
119 .AddAttribute (
"HarqEnabled",
120 "Activate/Deactivate the HARQ [by default is active].",
124 .AddAttribute (
"UlGrantMcs",
125 "The MCS of the UL grant, must be [0..15] (default 0)",
128 MakeUintegerChecker<uint8_t> ())
195 dlHarqPrcStatus.resize (8,0);
198 dlHarqProcessesTimer.resize (8,0);
201 dlHarqdci.resize (8);
204 dlHarqRlcPdu.resize (2);
205 dlHarqRlcPdu.at (0).resize (8);
206 dlHarqRlcPdu.at (1).resize (8);
210 ulHarqPrcStatus.resize (8,0);
213 ulHarqdci.resize (8);
228 std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator it;
248 m_flowStatsDl.insert (std::pair<uint16_t, fdtbfqsFlowPerf_t> (params.
m_rnti, flowStatsDl));
259 m_flowStatsUl.insert (std::pair<uint16_t, fdtbfqsFlowPerf_t> (params.
m_rnti, flowStatsUl));
266 m_flowStatsDl[(*it).first].tokenGenerationRate = mbrDlInBytes;
267 m_flowStatsUl[(*it).first].tokenGenerationRate = mbrUlInBytes;
281 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
m_rlcBufferReq.begin ();
282 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
317 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
m_rlcBufferReq.begin ();
318 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
321 if ((*it).first.m_rnti == params.
m_rnti)
347 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
355 m_rlcBufferReq.insert (std::pair <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters> (flow, params));
359 (*it).second = params;
384 for (
int i = 0; i < 4; i++)
399 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
400 unsigned int lcActive = 0;
403 if (((*it).first.m_rnti == rnti) && (((*it).second.m_rlcTransmissionQueueSize > 0)
404 || ((*it).second.m_rlcRetransmissionQueueSize > 0)
405 || ((*it).second.m_rlcStatusPduSize > 0) ))
409 if ((*it).first.m_rnti > rnti)
432 NS_FATAL_ERROR (
"No Process Id Statusfound for this RNTI " << rnti);
434 uint8_t i = (*it).second;
439 while ( ((*itStat).second.at (i) != 0)&&(i != (*it).second));
440 if ((*itStat).second.at (i) == 0)
471 NS_FATAL_ERROR (
"No Process Id Statusfound for this RNTI " << rnti);
473 uint8_t i = (*it).second;
478 while ( ((*itStat).second.at (i) != 0)&&(i != (*it).second));
479 if ((*itStat).second.at (i) == 0)
482 (*itStat).second.at (i) = 1;
486 NS_FATAL_ERROR (
"No HARQ process available for RNTI " << rnti <<
" check before update with HarqProcessAvailability");
489 return ((*it).second);
498 std::map <uint16_t, DlHarqProcessesTimer_t>::iterator itTimers;
507 NS_LOG_DEBUG (
this <<
" Reset HARQ proc " << i <<
" for RNTI " << (*itTimers).first);
508 std::map <uint16_t, DlHarqProcessesStatus_t>::iterator itStat =
m_dlHarqProcessesStatus.find ((*itTimers).first);
511 NS_FATAL_ERROR (
"No Process Id Status found for this RNTI " << (*itTimers).first);
513 (*itStat).second.at (i) = 0;
514 (*itTimers).second.at (i) = 0;
518 (*itTimers).second.at (i)++;
541 std::map <uint16_t, std::vector <uint16_t> > allocationMap;
542 std::vector <bool> rbgMap;
543 uint16_t rbgAllocatedNum = 0;
544 std::set <uint16_t> rntiAllocated;
548 for (std::vector<bool>::iterator it = rbgMap.begin (); it != rbgMap.end (); it++)
559 std::map <uint16_t, uint8_t>::iterator itProcId;
562 (*itProcId).second = ((*itProcId).second + 1) %
HARQ_PROC_NUM;
566 uint16_t rbAllocatedNum = 0;
567 std::vector <bool> ulRbMap;
570 uint8_t maxContinuousUlBandwidth = 0;
571 uint8_t tmpMinBandwidth = 0;
572 uint16_t ffrRbStartOffset = 0;
573 uint16_t tmpFfrRbStartOffset = 0;
576 for (std::vector<bool>::iterator it = ulRbMap.begin (); it != ulRbMap.end (); it++)
581 if (tmpMinBandwidth > maxContinuousUlBandwidth)
583 maxContinuousUlBandwidth = tmpMinBandwidth;
584 ffrRbStartOffset = tmpFfrRbStartOffset;
590 if (tmpMinBandwidth == 0)
592 tmpFfrRbStartOffset = index;
599 if (tmpMinBandwidth > maxContinuousUlBandwidth)
601 maxContinuousUlBandwidth = tmpMinBandwidth;
602 ffrRbStartOffset = tmpFfrRbStartOffset;
606 uint16_t rbStart = 0;
607 rbStart = ffrRbStartOffset;
608 std::vector <struct RachListElement_s>::iterator itRach;
613 newRar.
m_rnti = (*itRach).m_rnti;
617 newRar.m_grant.m_rnti = newRar.m_rnti;
620 uint16_t tbSizeBits = 0;
622 while ((tbSizeBits < (*itRach).m_estimatedSize) && (rbStart + rbLen < (ffrRbStartOffset + maxContinuousUlBandwidth)))
627 if (tbSizeBits < (*itRach).m_estimatedSize)
632 newRar.m_grant.m_rbStart = rbStart;
633 newRar.m_grant.m_rbLen = rbLen;
634 newRar.m_grant.m_tbSize = tbSizeBits / 8;
635 newRar.m_grant.m_hopping =
false;
636 newRar.m_grant.m_tpc = 0;
637 newRar.m_grant.m_cqiRequest =
false;
638 newRar.m_grant.m_ulDelay =
false;
639 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);
640 for (uint16_t i = rbStart; i < rbStart + rbLen; i++)
649 uldci.
m_rnti = newRar.m_rnti;
668 std::map <uint16_t, uint8_t>::iterator itProcId;
674 harqId = (*itProcId).second;
680 (*itDci).second.at (harqId) = uldci;
683 rbStart = rbStart + rbLen;
696 NS_LOG_INFO (
this <<
" Received DL-HARQ feedback");
712 std::vector <struct DlInfoListElement_s> dlInfoListUntxed;
716 if (itRnti != rntiAllocated.end ())
722 std::vector <bool> retx;
723 NS_LOG_INFO (
this <<
" Processing DLHARQ feedback");
727 retx.push_back (
false);
734 if (retx.at (0) || retx.at (1))
739 NS_LOG_INFO (
this <<
" HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId);
748 if (dci.
m_rv.size () == 1)
750 rv = dci.
m_rv.at (0);
754 rv = (dci.
m_rv.at (0) > dci.
m_rv.at (1) ? dci.
m_rv.at (0) : dci.
m_rv.at (1));
760 NS_LOG_INFO (
"Maximum number of retransmissions reached -> drop process");
766 (*it).second.at (harqId) = 0;
772 for (uint16_t k = 0; k < (*itRlcPdu).second.size (); k++)
774 (*itRlcPdu).second.at (k).at (harqId).clear ();
780 std::vector <int> dciRbg;
783 for (
int j = 0; j < 32; j++)
787 dciRbg.push_back (j);
793 for (uint8_t j = 0; j < dciRbg.size (); j++)
795 if (rbgMap.at (dciRbg.at (j)) ==
true)
805 for (uint8_t j = 0; j < dciRbg.size (); j++)
807 rbgMap.at (dciRbg.at (j)) =
true;
808 NS_LOG_INFO (
"RBG " << dciRbg.at (j) <<
" assigned");
812 NS_LOG_INFO (
this <<
" Send retx in the same RBGs");
818 uint8_t rbgId = (dciRbg.at (dciRbg.size () - 1) + 1) % rbgNum;
819 uint8_t startRbg = dciRbg.at (dciRbg.size () - 1);
820 std::vector <bool> rbgMapCopy = rbgMap;
821 while ((j < dciRbg.size ())&&(startRbg != rbgId))
823 if (rbgMapCopy.at (rbgId) ==
false)
825 rbgMapCopy.at (rbgId) =
true;
826 dciRbg.at (j) = rbgId;
829 rbgId = (rbgId + 1) % rbgNum;
831 if (j == dciRbg.size ())
834 uint32_t rbgMask = 0;
835 for (uint16_t k = 0; k < dciRbg.size (); k++)
837 rbgMask = rbgMask + (0x1 << dciRbg.at (k));
842 NS_LOG_INFO (
this <<
" Move retx in RBGs " << dciRbg.size ());
848 NS_LOG_INFO (
this <<
" No resource for this retx -> buffer it");
856 NS_FATAL_ERROR (
"Unable to find RlcPdcList in HARQ buffer for RNTI " << rnti);
858 for (uint8_t j = 0; j < nLayers; j++)
862 if (j >= dci.
m_ndi.size ())
865 dci.
m_ndi.push_back (0);
866 dci.
m_rv.push_back (0);
867 dci.
m_mcs.push_back (0);
869 NS_LOG_INFO (
this <<
" layer " << (uint16_t)j <<
" no txed (MIMO transition)");
873 dci.
m_ndi.at (j) = 0;
875 (*itHarq).second.at (harqId).m_rv.at (j)++;
876 NS_LOG_INFO (
this <<
" layer " << (uint16_t)j <<
" RV " << (uint16_t)dci.
m_rv.at (j));
882 dci.
m_ndi.at (j) = 0;
884 dci.
m_mcs.at (j) = 0;
886 NS_LOG_INFO (
this <<
" layer " << (uint16_t)j <<
" no retx");
889 for (uint16_t k = 0; k < (*itRlcPdu).second.at (0).at (dci.
m_harqProcess).size (); k++)
891 std::vector <struct RlcPduListElement_s> rlcPduListPerLc;
892 for (uint8_t j = 0; j < nLayers; j++)
896 if (j < dci.
m_ndi.size ())
899 rlcPduListPerLc.push_back ((*itRlcPdu).second.at (j).at (dci.
m_harqProcess).at (k));
907 emptyElement.m_size = 0;
908 rlcPduListPerLc.push_back (emptyElement);
912 if (rlcPduListPerLc.size () > 0)
919 (*itHarq).second.at (harqId).
m_rv = dci.
m_rv;
924 NS_FATAL_ERROR (
"Unable to find HARQ timer for RNTI " << (uint16_t)rnti);
926 (*itHarqTimer).second.at (harqId) = 0;
928 rntiAllocated.insert (rnti);
945 for (uint16_t k = 0; k < (*itRlcPdu).second.size (); k++)
954 if (rbgAllocatedNum == rbgNum)
965 std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator itStats;
968 if ( (*itStats).second.tokenGenerationRate / 1000 + (*itStats).second.tokenPoolSize > (*itStats).second.maxTokenPoolSize )
970 (*itStats).second.counter += (*itStats).second.tokenGenerationRate / 1000 - ( (*itStats).second.maxTokenPoolSize - (*itStats).second.tokenPoolSize );
971 (*itStats).second.tokenPoolSize = (*itStats).second.maxTokenPoolSize;
972 bankSize += (*itStats).second.tokenGenerationRate / 1000 - ( (*itStats).second.maxTokenPoolSize - (*itStats).second.tokenPoolSize );
976 (*itStats).second.tokenPoolSize += (*itStats).second.tokenGenerationRate / 1000;
980 std::set <uint16_t> allocatedRnti;
981 std::set <uint8_t> allocatedRbg;
984 while (totalRbg < rbgNum)
987 std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator it;
988 std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator itMax =
m_flowStatsDl.end ();
989 double metricMax = 0.0;
990 bool firstRnti =
true;
993 std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
997 if (itRnti != rntiAllocated.end ())
999 NS_LOG_DEBUG (
this <<
" RNTI discared for HARQ tx" << (uint16_t)(*it).first);
1003 NS_LOG_DEBUG (
this <<
" RNTI discared for HARQ id" << (uint16_t)(*it).first);
1008 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
1010 std::map <uint16_t,uint8_t>::iterator itTxMode;
1014 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
1019 for (
int k = 0; k < rbgNum; k++)
1021 for (uint8_t j = 0; j < nLayer; j++)
1029 cqiSum += (*itCqi).second.m_higherLayerSelected.at (k).m_sbCqi.at(j);
1036 NS_LOG_INFO (
"Skip this flow, CQI==0, rnti:"<<(*it).first);
1045 std::set <uint16_t>::iterator rnti;
1046 rnti = allocatedRnti.find((*it).first);
1047 if (rnti != allocatedRnti.end ())
1052 double metric = ( ( (double)(*it).second.counter ) / ( (double)(*it).second.tokenGenerationRate ) );
1054 if (firstRnti ==
true)
1061 if (metric > metricMax)
1075 allocatedRnti.insert((*itMax).first);
1078 uint32_t budget = 0;
1081 budget = (*itMax).second.counter - (*itMax).second.debtLimit;
1082 if ( budget > (*itMax).second.burstCredit )
1083 budget = (*itMax).second.burstCredit;
1087 budget = budget + (*itMax).second.tokenPoolSize;
1098 uint32_t rlcBufSize = 0;
1100 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator itRlcBuf;
1103 if ( (*itRlcBuf).first.m_rnti == (*itMax).first )
1104 lcid = (*itRlcBuf).first.m_lcId;
1109 rlcBufSize = (*itRlcBuf).second.m_rlcTransmissionQueueSize + (*itRlcBuf).second.m_rlcRetransmissionQueueSize + (*itRlcBuf).second.m_rlcStatusPduSize;
1110 if ( budget > rlcBufSize )
1111 budget = rlcBufSize;
1115 uint32_t bytesTxed = 0;
1116 uint32_t bytesTxedTmp = 0;
1118 while ( bytesTxed <= budget )
1122 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
1124 std::map <uint16_t,uint8_t>::iterator itTxMode;
1128 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
1133 double achievableRateMax = 0.0;
1135 for (
int k = 0; k < rbgNum; k++)
1137 std::set <uint8_t>::iterator rbg;
1138 rbg = allocatedRbg.find (k);
1139 if (rbg != allocatedRbg.end ())
1142 if ( rbgMap.at (k) ==
true)
1148 std::vector <uint8_t> sbCqi;
1151 for (uint8_t k = 0; k < nLayer; k++)
1153 sbCqi.push_back (1);
1158 sbCqi = (*itCqi).second.m_higherLayerSelected.at (k).m_sbCqi;
1160 uint8_t cqi1 = sbCqi.at (0);
1162 if (sbCqi.size () > 1)
1164 cqi2 = sbCqi.at (1);
1167 if ((cqi1 > 0)||(cqi2 > 0))
1172 double achievableRate = 0.0;
1173 for (uint8_t j = 0; j < nLayer; j++)
1176 if (sbCqi.size () > j)
1178 mcs =
m_amc->GetMcsFromCqi (sbCqi.at (j));
1185 achievableRate += ((
m_amc->GetDlTbSizeFromMcs (mcs, rbgSize) / 8) / 0.001);
1188 if ( achievableRate > achievableRateMax )
1190 achievableRateMax = achievableRate;
1197 if ( rbgIndex == rbgNum)
1206 allocatedRbg.insert (rbgIndex);
1210 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
1211 itMap = allocationMap.find ((*itMax).first);
1212 uint16_t RbgPerRnti;
1213 if (itMap == allocationMap.end ())
1216 std::vector <uint16_t> tempMap;
1217 tempMap.push_back (rbgIndex);
1218 allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax).first, tempMap));
1219 itMap = allocationMap.find ((*itMax).first);
1223 (*itMap).second.push_back (rbgIndex);
1225 rbgMap.at (rbgIndex) =
true;
1227 RbgPerRnti = (*itMap).second.size();
1230 std::vector <uint8_t> worstCqi (2, 15);
1233 for (uint16_t k = 0; k < (*itMap).second.size (); k++)
1235 if ((*itCqi).second.m_higherLayerSelected.size () > (*itMap).second.at (k))
1237 for (uint8_t j = 0; j < nLayer; j++)
1239 if ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.size () > j)
1241 if (((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j)) < worstCqi.at (j))
1243 worstCqi.at (j) = ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j));
1249 worstCqi.at (j) = 1;
1255 for (uint8_t j = 0; j < nLayer; j++)
1257 worstCqi.at (j) = 1;
1264 for (uint8_t j = 0; j < nLayer; j++)
1266 worstCqi.at (j) = 1;
1270 bytesTxedTmp = bytesTxed;
1272 for (uint8_t j = 0; j < nLayer; j++)
1274 int tbSize = (
m_amc->GetDlTbSizeFromMcs (
m_amc->GetMcsFromCqi (worstCqi.at (j)), RbgPerRnti * rbgSize) / 8);
1275 bytesTxed += tbSize;
1281 if ( bytesTxed > budget )
1283 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
1284 itMap = allocationMap.find ((*itMax).first);
1285 (*itMap).second.pop_back ();
1286 allocatedRbg.erase (rbgIndex);
1287 bytesTxed = bytesTxedTmp;
1289 rbgMap.at (rbgIndex) =
false;
1293 if ( bytesTxed <= (*itMax).second.tokenPoolSize )
1295 (*itMax).second.tokenPoolSize -= bytesTxed;
1299 (*itMax).second.counter = (*itMax).second.counter - ( bytesTxed - (*itMax).second.tokenPoolSize );
1300 (*itMax).second.tokenPoolSize = 0;
1301 if (
bankSize <= ( bytesTxed - (*itMax).second.tokenPoolSize ))
1310 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap = allocationMap.begin ();
1311 while (itMap != allocationMap.end ())
1315 newEl.
m_rnti = (*itMap).first;
1318 newDci.
m_rnti = (*itMap).first;
1326 lcActives = (uint16_t)65535;
1328 uint16_t RgbPerRnti = (*itMap).second.size ();
1329 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
1331 std::map <uint16_t,uint8_t>::iterator itTxMode;
1335 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*itMap).first);
1338 std::vector <uint8_t> worstCqi (2, 15);
1341 for (uint16_t k = 0; k < (*itMap).second.size (); k++)
1343 if ((*itCqi).second.m_higherLayerSelected.size () > (*itMap).second.at (k))
1345 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)) );
1346 for (uint8_t j = 0; j < nLayer; j++)
1348 if ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.size () > j)
1350 if (((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j)) < worstCqi.at (j))
1352 worstCqi.at (j) = ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j));
1358 worstCqi.at (j) = 1;
1364 for (uint8_t j = 0; j < nLayer; j++)
1366 worstCqi.at (j) = 1;
1373 for (uint8_t j = 0; j < nLayer; j++)
1375 worstCqi.at (j) = 1;
1378 for (uint8_t j = 0; j < nLayer; j++)
1380 NS_LOG_INFO (
this <<
" Layer " << (uint16_t)j <<
" CQI selected " << (uint16_t)worstCqi.at (j));
1382 uint32_t bytesTxed = 0;
1383 for (uint8_t j = 0; j < nLayer; j++)
1385 newDci.
m_mcs.push_back (
m_amc->GetMcsFromCqi (worstCqi.at (j)));
1386 int tbSize = (
m_amc->GetDlTbSizeFromMcs (newDci.
m_mcs.at (j), RgbPerRnti * rbgSize) / 8);
1388 NS_LOG_INFO (
this <<
" Layer " << (uint16_t)j <<
" MCS selected" <<
m_amc->GetMcsFromCqi (worstCqi.at (j)));
1389 bytesTxed += tbSize;
1394 uint32_t rbgMask = 0;
1395 for (uint16_t k = 0; k < (*itMap).second.size (); k++)
1397 rbgMask = rbgMask + (0x1 << (*itMap).second.at (k));
1398 NS_LOG_INFO (
this <<
" Allocated RBG " << (*itMap).second.at (k));
1403 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator itBufReq;
1406 if (((*itBufReq).first.m_rnti == (*itMap).first)
1407 && (((*itBufReq).second.m_rlcTransmissionQueueSize > 0)
1408 || ((*itBufReq).second.m_rlcRetransmissionQueueSize > 0)
1409 || ((*itBufReq).second.m_rlcStatusPduSize > 0) ))
1411 std::vector <struct RlcPduListElement_s> newRlcPduLe;
1412 for (uint8_t j = 0; j < nLayer; j++)
1418 newRlcPduLe.push_back (newRlcEl);
1426 NS_FATAL_ERROR (
"Unable to find RlcPdcList in HARQ buffer for RNTI " << (*itMap).first);
1428 (*itRlcPdu).second.at (j).at (newDci.
m_harqProcess).push_back (newRlcEl);
1433 if ((*itBufReq).first.m_rnti > (*itMap).first)
1438 for (uint8_t j = 0; j < nLayer; j++)
1440 newDci.
m_ndi.push_back (1);
1441 newDci.
m_rv.push_back (0);
1446 newEl.
m_dci = newDci;
1496 for (
unsigned int i = 0; i < params.
m_cqiList.size (); i++)
1501 std::map <uint16_t,uint8_t>::iterator it;
1502 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
1507 m_p10CqiRxed.insert ( std::pair<uint16_t, uint8_t > (rnti, params.
m_cqiList.at (i).m_wbCqi.at (0)) );
1514 (*it).second = params.
m_cqiList.at (i).m_wbCqi.at (0);
1516 std::map <uint16_t,uint32_t>::iterator itTimers;
1524 std::map <uint16_t,SbMeasResult_s>::iterator it;
1525 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
1530 m_a30CqiRxed.insert ( std::pair<uint16_t, SbMeasResult_s > (rnti, params.
m_cqiList.at (i).m_sbMeasResult) );
1536 (*it).second = params.
m_cqiList.at (i).m_sbMeasResult;
1537 std::map <uint16_t,uint32_t>::iterator itTimers;
1555 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find (rnti);
1566 unsigned int sinrNum = 0;
1569 double sinr = (*itCqi).second.at (i);
1576 double estimatedSinr = (sinrNum > 0) ? (sinrSum / sinrNum) : DBL_MAX;
1578 (*itCqi).second.at (rb) = estimatedSinr;
1579 return (estimatedSinr);
1593 std::vector <bool> rbMap;
1594 uint16_t rbAllocatedNum = 0;
1595 std::set <uint16_t> rntiAllocated;
1596 std::vector <uint16_t> rbgAllocationMap;
1607 for (std::vector<bool>::iterator it = rbMap.begin (); it != rbMap.end (); it++)
1621 if (rbgAllocationMap.at (i) != 0)
1623 rbMap.at (i) =
true;
1632 for (uint16_t i = 0; i < params.
m_ulInfoList.size (); i++)
1641 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1644 NS_LOG_INFO (
this <<
" UL-HARQ retx RNTI " << rnti <<
" harqId " << (uint16_t)harqId <<
" i " << i <<
" size " << params.
m_ulInfoList.size ());
1648 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1655 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
1657 if ((*itStat).second.at (harqId) >= 3)
1659 NS_LOG_INFO (
"Max number of retransmissions reached (UL)-> drop process");
1665 if (rbMap.at (j) ==
true)
1676 rbMap.at (j) =
true;
1677 rbgAllocationMap.at (j) = dci.
m_rnti;
1685 NS_LOG_INFO (
"Cannot allocate retx due to RACH allocations for UE " << rnti);
1690 (*itStat).second.at ((*itProcId).second) = (*itStat).second.at (harqId) + 1;
1691 (*itStat).second.at (harqId) = 0;
1692 (*itHarq).second.at ((*itProcId).second) = dci;
1694 rntiAllocated.insert (dci.
m_rnti);
1703 std::map <uint16_t,uint32_t>::iterator it;
1708 std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
1710 if (((*it).second > 0)&&(itRnti == rntiAllocated.end ()))
1729 uint16_t tempRbPerFlow = (ffrUlBandwidth) / (nflows + rntiAllocated.size ());
1730 uint16_t rbPerFlow = (minContinuousUlBandwidth < tempRbPerFlow) ? minContinuousUlBandwidth : tempRbPerFlow;
1736 int rbAllocated = 0;
1738 std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator itStats;
1760 std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
1761 if ((itRnti != rntiAllocated.end ())||((*it).second == 0))
1764 NS_LOG_DEBUG (
this <<
" UE already allocated in HARQ -> discared, RNTI " << (*it).first);
1787 uldci.
m_rnti = (*it).first;
1789 bool allocated =
false;
1790 NS_LOG_INFO (
this <<
" RB Allocated " << rbAllocated <<
" rbPerFlow " << rbPerFlow <<
" flows " << nflows);
1795 for (uint16_t j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1797 if (rbMap.at (j) ==
true)
1810 NS_LOG_INFO (
this <<
"RNTI: "<< (*it).first<<
" RB Allocated " << rbAllocated <<
" rbPerFlow " << rbPerFlow <<
" flows " << nflows);
1813 for (uint16_t j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
1815 rbMap.at (j) =
true;
1817 rbgAllocationMap.at (j) = (*it).first;
1819 rbAllocated += rbPerFlow;
1851 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find ((*it).first);
1861 double minSinr = (*itCqi).second.at (uldci.
m_rbStart);
1868 double sinr = (*itCqi).second.at (i);
1880 double s = log2 ( 1 + (
1881 std::pow (10, minSinr / 10 ) /
1882 ( (-std::log (5.0 * 0.00005 )) / 1.5) ));
1883 cqi =
m_amc->GetCqiFromSpectralEfficiency (s);
1896 rbgAllocationMap.at (i) = 0;
1922 std::map <uint16_t, uint8_t>::iterator itProcId;
1928 harqId = (*itProcId).second;
1934 (*itDci).second.at (harqId) = uldci;
1939 NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << uldci.
m_rnti);
1941 (*itStat).second.at (harqId) = 0;
1944 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);
1987 std::map <uint16_t,uint32_t>::iterator it;
1989 for (
unsigned int i = 0; i < params.
m_macCeList.size (); i++)
2000 uint32_t buffer = 0;
2001 for (uint8_t lcg = 0; lcg < 4; ++lcg)
2003 uint8_t bsrId = params.
m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (lcg);
2008 NS_LOG_LOGIC (
this <<
"RNTI=" << rnti <<
" buffer=" << buffer);
2013 m_ceBsrRxed.insert ( std::pair<uint16_t, uint32_t > (rnti, buffer));
2018 (*it).second = buffer;
2061 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
2062 std::map <uint16_t, std::vector <double> >::iterator itCqi;
2063 NS_LOG_DEBUG (
this <<
" Collect PUSCH CQIs of Frame no. " << (params.
m_sfnSf >> 4) <<
" subframe no. " << (0xF & params.
m_sfnSf));
2069 for (uint32_t i = 0; i < (*itMap).second.size (); i++)
2073 itCqi =
m_ueCqi.find ((*itMap).second.at (i));
2077 std::vector <double> newCqi;
2082 newCqi.push_back (sinr);
2091 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > ((*itMap).second.at (i), newCqi));
2098 (*itCqi).second.at (i) = sinr;
2099 NS_LOG_DEBUG (
this <<
" RNTI " << (*itMap).second.at (i) <<
" RB " << i <<
" SINR " << sinr);
2101 std::map <uint16_t, uint32_t>::iterator itTimers;
2122 rnti = vsp->GetRnti ();
2125 std::map <uint16_t, std::vector <double> >::iterator itCqi;
2130 std::vector <double> newCqi;
2134 newCqi.push_back (sinr);
2135 NS_LOG_INFO (
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value " << sinr);
2138 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > (rnti, newCqi));
2148 (*itCqi).second.at (j) = sinr;
2149 NS_LOG_INFO (
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value " << sinr);
2152 std::map <uint16_t, uint32_t>::iterator itTimers;
2165 NS_FATAL_ERROR (
"FdTbfqFfMacScheduler supports only PUSCH and SRS UL-CQIs");
2178 std::map <uint16_t,uint32_t>::iterator itP10 =
m_p10CqiTimers.begin ();
2182 if ((*itP10).second == 0)
2185 std::map <uint16_t,uint8_t>::iterator itMap =
m_p10CqiRxed.find ((*itP10).first);
2187 NS_LOG_INFO (
this <<
" P10-CQI expired for user " << (*itP10).first);
2189 std::map <uint16_t,uint32_t>::iterator temp = itP10;
2201 std::map <uint16_t,uint32_t>::iterator itA30 =
m_a30CqiTimers.begin ();
2205 if ((*itA30).second == 0)
2208 std::map <uint16_t,SbMeasResult_s>::iterator itMap =
m_a30CqiRxed.find ((*itA30).first);
2210 NS_LOG_INFO (
this <<
" A30-CQI expired for user " << (*itA30).first);
2212 std::map <uint16_t,uint32_t>::iterator temp = itA30;
2231 std::map <uint16_t,uint32_t>::iterator itUl =
m_ueCqiTimers.begin ();
2235 if ((*itUl).second == 0)
2238 std::map <uint16_t, std::vector <double> >::iterator itMap =
m_ueCqi.find ((*itUl).first);
2239 NS_ASSERT_MSG (itMap !=
m_ueCqi.end (),
" Does not find CQI report for user " << (*itUl).first);
2240 NS_LOG_INFO (
this <<
" UL-CQI exired for user " << (*itUl).first);
2241 (*itMap).second.clear ();
2243 std::map <uint16_t,uint32_t>::iterator temp = itUl;
2260 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
2265 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);
2268 if (((*it).second.m_rlcStatusPduSize > 0) && (size >= (*it).second.m_rlcStatusPduSize))
2270 (*it).second.m_rlcStatusPduSize = 0;
2272 else if (((*it).second.m_rlcRetransmissionQueueSize > 0) && (size >= (*it).second.m_rlcRetransmissionQueueSize))
2274 (*it).second.m_rlcRetransmissionQueueSize = 0;
2276 else if ((*it).second.m_rlcTransmissionQueueSize > 0)
2278 uint32_t rlcOverhead;
2293 if ((*it).second.m_rlcTransmissionQueueSize <= size - rlcOverhead)
2295 (*it).second.m_rlcTransmissionQueueSize = 0;
2299 (*it).second.m_rlcTransmissionQueueSize -= size - rlcOverhead;
2305 NS_LOG_ERROR (
this <<
" Does not find DL RLC Buffer Report of UE " << rnti);
2314 std::map <uint16_t,uint32_t>::iterator it =
m_ceBsrRxed.find (rnti);
2317 NS_LOG_INFO (
this <<
" UE " << rnti <<
" size " << size <<
" BSR " << (*it).second);
2318 if ((*it).second >= size)
2320 (*it).second -= size;
2329 NS_LOG_ERROR (
this <<
" Does not find BSR report info of UE " << rnti);
2337 NS_LOG_FUNCTION (
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);
std::vector< struct UlInfoListElement_s > m_ulInfoList
UL info list.
See section 4.3.1 dlDciListElement.
std::map< uint16_t, uint32_t > m_a30CqiTimers
Map of UE's timers on DL CQI A30 received.
virtual void SetFfMacCschedSapUser(FfMacCschedSapUser *s)
Set FF MAC Csched SAP user function.
void DoCschedCellConfigReq(const struct FfMacCschedSapProvider::CschedCellConfigReqParameters ¶ms)
Csched cell config request function.
uint32_t creditableThreshold
the flow cannot borrow token from bank until the number of token it has deposited to bank reaches thi...
Smart pointer class similar to boost::intrusive_ptr.
Service Access Point (SAP) offered by the eNodeB RRC instance to the Frequency Reuse algorithm instan...
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
std::map< uint16_t, uint8_t > m_uesTxMode
txMode of the UEs
std::map< uint16_t, std::vector< double > > m_ueCqi
Map of UEs' UL-CQI per RBG.
Time flowStart
flow start time
AttributeValue implementation for Boolean.
std::map< LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters > m_rlcBufferReq
Vectors of UE's LC info.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
virtual void ReportUlCqiInfo(const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ¶ms)=0
ReportUlCqiInfo.
std::map< uint16_t, SbMeasResult_s > m_a30CqiRxed
Map of UE's DL CQI A30 received.
NS_ASSERT_MSG(false, "Ipv4AddressGenerator::MaskToIndex(): Impossible")
Parameters of the CSCHED_UE_CONFIG_CNF primitive.
Parameters of the CSCHED_UE_RELEASE_REQ primitive.
void DoSchedUlNoiseInterferenceReq(const struct FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters ¶ms)
Sched UL noise interference request function.
void DoCschedLcConfigReq(const struct FfMacCschedSapProvider::CschedLcConfigReqParameters ¶ms)
CSched LC config request function.
virtual bool IsDlRbgAvailableForUe(int i, uint16_t rnti)=0
Check if UE can be served on i-th RB in DL.
virtual bool IsUlRbgAvailableForUe(int i, uint16_t rnti)=0
Check if UE can be served on i-th RB in UL.
std::map< uint16_t, UlHarqProcessesDciBuffer_t > m_ulHarqProcessesDciBuffer
UL HARQ process DCI buffer.
enum ns3::UlCqi_s::Type_e m_type
type
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
void DoSchedUlSrInfoReq(const struct FfMacSchedSapProvider::SchedUlSrInfoReqParameters ¶ms)
Sched UL SR info request function.
std::vector< UlDciListElement_s > UlHarqProcessesDciBuffer_t
UL HARQ process DCI buffer vector.
std::vector< struct LogicalChannelConfigListElement_s > m_logicalChannelConfigList
logicalChannelConfigList
std::vector< uint16_t > m_sinr
SINR.
void DoSchedDlPagingBufferReq(const struct FfMacSchedSapProvider::SchedDlPagingBufferReqParameters ¶ms)
Sched DL paging buffer request function.
std::vector< uint8_t > DlHarqProcessesTimer_t
DL HARQ process timer vector typedef.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Hold a signed integer type.
int debtLimit
counter threshold that the flow cannot further borrow tokens from bank
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
std::vector< uint8_t > m_mcs
mcs
void DoSchedDlCqiInfoReq(const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)
Sched DL CQI info request function.
See section 4.3.2 ulDciListElement.
bool m_harqOn
m_harqOn when false inhibit the HARQ mechanisms (by default active)
uint32_t tokenPoolSize
current size of token pool (byte)
std::vector< struct UlDciListElement_s > m_dciList
DCI list.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
See section 4.3.10 buildRARListElement.
Parameters of the CSCHED_UE_CONFIG_UPDATE_IND primitive.
uint8_t m_ulBandwidth
UL bandwidth.
std::map< uint16_t, fdtbfqsFlowPerf_t > m_flowStatsUl
Map of UE statistics (per RNTI basis)
void DoSchedDlRachInfoReq(const struct FfMacSchedSapProvider::SchedDlRachInfoReqParameters ¶ms)
Sched DL RACH info request function.
Parameters of the CSCHED_LC_RELEASE_REQ primitive.
uint16_t m_nextRntiUl
RNTI of the next user to be served next scheduling in UL.
virtual uint8_t GetTpc(uint16_t rnti)=0
GetTpc.
virtual void SetLteFfrSapProvider(LteFfrSapProvider *s)
Set FFR SAP provider function.
std::vector< std::vector< struct RlcPduListElement_s > > m_rlcPduList
RLC PDU list.
uint8_t m_transmissionMode
transmission mode
uint32_t m_cqiTimersThreshold
of TTIs for which a CQI can be considered valid
Parameters of the SCHED_DL_TRIGGER_REQ primitive.
uint8_t m_logicalChannelIdentity
logical channel identity
virtual ~FdTbfqFfMacScheduler()
Destructor.
uint8_t m_harqProcess
HARQ process.
Ptr< const AttributeAccessor > MakeIntegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
std::vector< RlcPduList_t > DlHarqRlcPduListBuffer_t
vector of the 8 HARQ processes per UE
Parameters of the SCHED_DL_MAC_BUFFER_REQ primitive.
uint8_t m_dlBandwidth
DL badnwidth.
Parameters of the SCHED_DL_PAGING_BUFFER_REQ primitive.
virtual void CschedUeConfigUpdateInd(const struct CschedUeConfigUpdateIndParameters ¶ms)=0
CSCHED_UE_UPDATE_IND.
virtual void SetFfMacSchedSapUser(FfMacSchedSapUser *s)
Set FF MAC sched SAP user function.
std::vector< struct RachListElement_s > m_rachList
RACH list.
std::vector< struct VendorSpecificListElement_s > m_vendorSpecificList
vendor specific list
uint8_t m_aggrLevel
aggr level
FfMacSchedSapUser * m_schedSapUser
sched SAP user
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, DlHarqProcessesDciBuffer_t > m_dlHarqProcessesDciBuffer
DL HARQ process DCI buffer.
uint8_t HarqProcessAvailability(uint16_t rnti)
Return the availability of free process for the RNTI specified.
static TypeId GetTypeId(void)
Get the type ID.
std::map< uint16_t, DlHarqProcessesTimer_t > m_dlHarqProcessesTimer
DL HARQ process timer.
uint64_t packetArrivalRate
packet arrival rate( byte/s)
void DoCschedLcReleaseReq(const struct FfMacCschedSapProvider::CschedLcReleaseReqParameters ¶ms)
CSched LC release request function.
std::map< uint16_t, fdtbfqsFlowPerf_t > m_flowStatsDl
Map of UE statistics (per RNTI basis) in downlink.
Service Access Point (SAP) offered by the Frequency Reuse algorithm instance to the MAC Scheduler ins...
Parameters of the SCHED_UL_TRIGGER_REQ primitive.
uint32_t m_rbBitmap
rb bitmap
Hold an unsigned integer type.
static uint8_t TxMode2LayerNum(uint8_t txMode)
Transmit mode 2 layer number.
bool m_cqiRequest
CQI request.
uint64_t bankSize
the number of bytes in token bank
std::vector< uint8_t > m_ndi
ndi
uint8_t m_cceIndex
CCE index.
FfMacCschedSapProvider::CschedCellConfigReqParameters m_cschedCellConfig
Csched cell config.
LteFfrSapProvider * m_ffrSapProvider
FFR SAP provider.
virtual FfMacCschedSapProvider * GetFfMacCschedSapProvider()
Get FF MAC CSched SAP provider function.
virtual void CschedUeConfigCnf(const struct CschedUeConfigCnfParameters ¶ms)=0
CSCHED_UE_CONFIG_CNF.
struct UlCqi_s m_ulCqi
UL CQI.
std::vector< uint16_t > m_rachAllocationMap
RACH allocation map.
uint32_t m_tokenPoolSize
maximum size of token pool (byte)
std::map< uint16_t, uint32_t > m_p10CqiTimers
Map of UE's timers on DL CQI P01 received.
std::vector< uint8_t > m_logicalChannelIdentity
logical channel identity
Parameters of the SCHED_UL_NOISE_INTERFERENCE_REQ primitive.
uint8_t m_logicalChannelIdentity
logical channel indentity
std::vector< struct CqiListElement_s > m_cqiList
CQI list.
uint8_t m_ulGrantMcs
MCS for UL grant (default 0)
std::vector< struct DlInfoListElement_s > m_dlInfoList
DL info list.
void DoSchedDlRlcBufferReq(const struct FfMacSchedSapProvider::SchedDlRlcBufferReqParameters ¶ms)
Sched DL RLC buffer request function.
std::map< uint16_t, uint32_t > m_ueCqiTimers
Map of UEs' timers on UL-CQI per RBG.
virtual void ReportDlCqiInfo(const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)=0
ReportDlCqiInfo.
Implements the SCHED SAP and CSCHED SAP for a Frequency Domain Token Bank Fair Queue scheduler...
virtual void SchedDlConfigInd(const struct SchedDlConfigIndParameters ¶ms)=0
SCHED_DL_CONFIG_IND.
Parameters of the API primitives.
int8_t m_pdcchPowerOffset
CCH power offset.
std::vector< uint16_t > m_tbsSize
tbs size
uint32_t m_creditableThreshold
threshold of flow credit
See section 4.3.9 rlcPDU_ListElement.
void DoSchedUlMacCtrlInfoReq(const struct FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters ¶ms)
Sched UL MAC control info request function.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeBooleanChecker(void)
LteFfrSapUser * m_ffrSapUser
FFR SAP user.
uint8_t m_freqHopping
freq hopping
std::vector< DlDciListElement_s > DlHarqProcessesDciBuffer_t
DL HARQ process DCI buffer vector typedef.
Parameters of the CSCHED_LC_CONFIG_REQ primitive.
std::vector< uint8_t > m_rv
rv
FdTbfqFfMacScheduler()
Constructor.
unsigned int LcActivePerFlow(uint16_t rnti)
LC Active per flow function.
void RefreshHarqProcesses()
Refresh HARQ processes according to the timers.
std::map< uint16_t, uint8_t > m_dlHarqCurrentProcessId
DL HARQ current process ID.
MemberCschedSapProvider class.
virtual std::vector< bool > GetAvailableUlRbg()=0
Get vector of available RB in UL for this Cell.
FfMacCschedSapProvider * m_cschedSapProvider
CSched SAP provider.
virtual uint8_t GetMinContinuousUlBandwidth()=0
Get the minimum continuous Ul bandwidth.
uint64_t tokenGenerationRate
token generation rate ( byte/s )
virtual void SchedUlConfigInd(const struct SchedUlConfigIndParameters ¶ms)=0
SCHED_UL_CONFIG_IND.
uint8_t m_ulIndex
UL index.
static Time Now(void)
Return the current simulation virtual time.
double EstimateUlSinr(uint16_t rnti, uint16_t rb)
Estimate UL SNR function.
std::map< uint16_t, DlHarqRlcPduListBuffer_t > m_dlHarqProcessesRlcPduListBuffer
DL HARQ process RLC PDU list buffer.
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
UlCqiFilter_t m_ulCqiFilter
UL CQI filter.
int GetRbgSize(int dlbandwidth)
Get RBG size function.
This abstract base class identifies the interface by means of which the helper object can plug on the...
FfMacCschedSapUser class.
enum Result_e m_result
result
uint8_t m_nrOfPdcchOfdmSymbols
number of PDCCH OFDM symbols
Parameters of the SCHED_DL_CQI_INFO_REQ primitive.
std::vector< struct MacCeListElement_s > m_macCeList
MAC CE list.
Parameters of the API primitives.
uint32_t burstCredit
the maximum number of tokens connection i can borrow from the bank each time
virtual LteFfrSapUser * GetLteFfrSapUser()
Get FFR SAP user function.
std::vector< struct RachListElement_s > m_rachList
RACH list.
static double fpS11dot3toDouble(uint16_t val)
Convert from fixed point S11.3 notation to double.
int counter
the number of token borrow or given to token bank
std::vector< uint8_t > UlHarqProcessesStatus_t
UL HARQ process status vector.
void DoSchedUlCqiInfoReq(const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ¶ms)
Sched UL CQI info request function.
std::vector< uint8_t > DlHarqProcessesStatus_t
DL HARQ process status vector typedef.
Parameters of the SCHED_UL_CQI_INFO_REQ primitive.
virtual void DoDispose(void)
Destructor implementation.
static uint32_t BsrId2BufferSize(uint8_t val)
Convert BSR ID to buffer size.
uint8_t m_transmissionMode
transmission mode
Template for the implementation of the LteFfrSapUser as a member of an owner class of type C to which...
void DoSchedDlTriggerReq(const struct FfMacSchedSapProvider::SchedDlTriggerReqParameters ¶ms)
Sched DL trigger request function.
FfMacSchedSapProvider * m_schedSapProvider
sched SAP provider
void RefreshDlCqiMaps(void)
Refresh DL CQI maps function.
Parameters of the API primitives.
Parameters of the SCHED_UL_MAC_CTRL_INFO_REQ primitive.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
std::map< uint16_t, UlHarqProcessesStatus_t > m_ulHarqProcessesStatus
UL HARQ process status.
virtual std::vector< bool > GetAvailableDlRbg()=0
Get vector of available RBG in DL for this Cell.
void DoSchedDlMacBufferReq(const struct FfMacSchedSapProvider::SchedDlMacBufferReqParameters ¶ms)
Sched DL MAC buffer request function.
FfMacCschedSapUser * m_cschedSapUser
Csched SAP user.
void DoSchedUlTriggerReq(const struct FfMacSchedSapProvider::SchedUlTriggerReqParameters ¶ms)
Sched UL trigger request function.
std::vector< DlInfoListElement_s > m_dlInfoListBuffered
HARQ retx buffered.
Parameters of the SCHED_UL_SR_INFO_REQ primitive.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
Parameters of the SCHED_DL_RACH_INFO_REQ primitive.
Parameters of the SCHED_UL_CONFIG_IND primitive.
std::map< uint16_t, DlHarqProcessesStatus_t > m_dlHarqProcessesStatus
DL HARQ process status.
uint32_t m_creditLimit
flow credit limit (byte)
MemberSchedSapProvider class.
Parameters of the CSCHED_UE_CONFIG_REQ primitive.
std::map< uint16_t, uint8_t > m_ulHarqCurrentProcessId
UL HARQ current process ID.
virtual FfMacSchedSapProvider * GetFfMacSchedSapProvider()
Get FF MAC sched SAP provider function.
uint32_t maxTokenPoolSize
maximum size of token pool (byte)
struct DlDciListElement_s m_dci
DCI.
std::vector< struct BuildRarListElement_s > m_buildRarList
build rar list
std::map< uint16_t, uint8_t > m_p10CqiRxed
Map of UE's DL CQI P01 received.
void RefreshUlCqiMaps(void)
Refresh UL CQI maps function.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
a unique identifier for an interface.
uint8_t m_resAlloc
res allocate
static const int FdTbfqType0AllocationRbg[4]
FdTbfqType0AllocationRbg value array.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
void DoCschedUeReleaseReq(const struct FfMacCschedSapProvider::CschedUeReleaseReqParameters ¶ms)
CSched UE release request function.
void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size)
Update UL RLC buffer info function.
void DoCschedUeConfigReq(const struct FfMacCschedSapProvider::CschedUeConfigReqParameters ¶ms)
CSched UE config request function.
uint8_t UpdateHarqProcessId(uint16_t rnti)
Update and return a new process Id for the RNTI specified.
int m_debtLimit
flow debt limit (byte)
std::map< uint16_t, uint32_t > m_ceBsrRxed
Map of UE's buffer status reports received.
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)
Transmisson mode config update function.
std::vector< struct BuildDataListElement_s > m_buildDataList
build data list
uint8_t m_ueTxAntennaSelection
UE antenna selection.
See section 4.3.8 builDataListElement.