23 #include <ns3/pointer.h>
24 #include <ns3/integer.h>
26 #include <ns3/simulator.h>
27 #include <ns3/lte-amc.h>
28 #include <ns3/tdtbfq-ff-mac-scheduler.h>
29 #include <ns3/lte-vendor-specific-parameters.h>
140 : m_scheduler (scheduler)
215 : m_cschedSapUser (0),
221 m_amc = CreateObject <LteAmc> ();
242 static TypeId tid =
TypeId (
"ns3::TdTbfqFfMacScheduler")
244 .AddConstructor<TdTbfqFfMacScheduler> ()
245 .AddAttribute (
"CqiTimerThreshold",
246 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
249 MakeUintegerChecker<uint32_t> ())
250 .AddAttribute (
"DebtLimit",
251 "Flow debt limit (default -625000 bytes)",
254 MakeIntegerChecker<int> ())
255 .AddAttribute (
"CreditLimit",
256 "Flow credit limit (default 625000 bytes)",
259 MakeUintegerChecker<uint32_t> ())
260 .AddAttribute (
"TokenPoolSize",
261 "The maximum value of flow token pool (default 1 bytes)",
264 MakeUintegerChecker<uint32_t> ())
265 .AddAttribute (
"CreditableThreshold",
266 "Threshold of flow credit (default 0 bytes)",
269 MakeUintegerChecker<uint32_t> ())
333 std::map <uint16_t, tdtbfqsFlowPerf_t>::iterator it;
353 m_flowStatsDl.insert (std::pair<uint16_t, tdtbfqsFlowPerf_t> (params.
m_rnti, flowStatsDl));
364 m_flowStatsUl.insert (std::pair<uint16_t, tdtbfqsFlowPerf_t> (params.
m_rnti, flowStatsUl));
397 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
405 m_rlcBufferReq.insert (std::pair <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters> (flow, params));
409 (*it).second = params;
432 for (
int i = 0; i < 4; i++)
446 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
450 if (((*it).first.m_rnti == rnti) && (((*it).second.m_rlcTransmissionQueueSize > 0)
451 || ((*it).second.m_rlcRetransmissionQueueSize > 0)
452 || ((*it).second.m_rlcStatusPduSize > 0) ))
456 if ((*it).first.m_rnti > rnti)
477 std::map <uint16_t, tdtbfqsFlowPerf_t>::iterator itStats;
480 if ( (*itStats).second.tokenGenerationRate / 1000 + (*itStats).second.tokenPoolSize > (*itStats).second.maxTokenPoolSize )
482 (*itStats).second.counter += (*itStats).second.tokenGenerationRate / 1000 - ( (*itStats).second.maxTokenPoolSize - (*itStats).second.tokenPoolSize );
483 (*itStats).second.tokenPoolSize = (*itStats).second.maxTokenPoolSize;
484 bankSize += (*itStats).second.tokenGenerationRate / 1000 - ( (*itStats).second.maxTokenPoolSize - (*itStats).second.tokenPoolSize );
488 (*itStats).second.tokenPoolSize += (*itStats).second.tokenGenerationRate / 1000;
494 std::map <uint16_t, std::vector <uint16_t> > allocationMap;
497 std::map <uint16_t, tdtbfqsFlowPerf_t>::iterator it;
498 std::map <uint16_t, tdtbfqsFlowPerf_t>::iterator itMax =
m_flowStatsDl.end ();
499 double metricMax = 0.0;
500 bool firstRnti =
true;
508 double metric = ( ( (double)(*it).second.counter ) / ( (double)(*it).second.tokenGenerationRate ) );
510 if (firstRnti ==
true)
517 if (metric > metricMax)
532 std::vector <uint16_t> tempMap;
533 for (
int i = 0; i < rbgNum; i++)
535 tempMap.push_back (i);
537 allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax).first, tempMap));
543 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap = allocationMap.begin ();
545 while (itMap != allocationMap.end ())
549 newEl.
m_rnti = (*itMap).first;
552 std::vector <struct RlcPduListElement_s> newRlcPduLe;
553 newDci.
m_rnti = (*itMap).first;
556 uint16_t RgbPerRnti = (*itMap).second.size ();
557 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
559 std::map <uint16_t,uint8_t>::iterator itTxMode;
563 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*itMap).first);
566 std::vector <uint8_t> worstCqi (2, 15);
569 for (uint16_t k = 0; k < (*itMap).second.size (); k++)
571 if ((*itCqi).second.m_higherLayerSelected.size () > (*itMap).second.at (k))
573 for (uint8_t j = 0; j < nLayer; j++)
575 if ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.size () > j)
577 if (((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j)) < worstCqi.at (j))
579 worstCqi.at (j) = ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j));
591 for (uint8_t j = 0; j < nLayer; j++)
600 for (uint8_t j = 0; j < nLayer; j++)
605 uint32_t bytesTxed = 0;
606 for (uint8_t j = 0; j < nLayer; j++)
616 uint32_t rbgMask = 0;
617 for (uint16_t k = 0; k < (*itMap).second.size (); k++)
619 rbgMask = rbgMask + (0x1 << (*itMap).second.at (k));
624 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator itBufReq;
627 if (((*itBufReq).first.m_rnti == (*itMap).first)
628 && (((*itBufReq).second.m_rlcTransmissionQueueSize > 0)
629 || ((*itBufReq).second.m_rlcRetransmissionQueueSize > 0)
630 || ((*itBufReq).second.m_rlcStatusPduSize > 0) ))
632 for (uint8_t j = 0; j < nLayer; j++)
637 newRlcPduLe.push_back (newRlcEl);
641 if ((*itBufReq).first.m_rnti > (*itMap).first)
646 newDci.
m_ndi.push_back (1);
647 newDci.
m_rv.push_back (0);
649 newEl.
m_dci = newDci;
656 std::map <uint16_t, tdtbfqsFlowPerf_t>::iterator it;
660 if ( bytesTxed <= (*it).second.tokenPoolSize )
662 (*it).second.tokenPoolSize -= bytesTxed;
666 (*it).second.counter = (*it).second.counter - ( bytesTxed - (*it).second.tokenPoolSize );
667 (*it).second.tokenPoolSize = 0;
668 if (
bankSize <= ( bytesTxed - (*it).second.tokenPoolSize ))
676 NS_LOG_DEBUG (
this <<
" No Stats for this allocated UE");
701 for (
unsigned int i = 0; i < params.
m_cqiList.size (); i++)
706 std::map <uint16_t,uint8_t>::iterator it;
707 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
712 m_p10CqiRxed.insert ( std::pair<uint16_t, uint8_t > (rnti, params.
m_cqiList.at (i).m_wbCqi.at (0)) );
719 (*it).second = params.
m_cqiList.at (i).m_wbCqi.at (0);
721 std::map <uint16_t,uint32_t>::iterator itTimers;
729 std::map <uint16_t,SbMeasResult_s>::iterator it;
730 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
735 m_a30CqiRxed.insert ( std::pair<uint16_t, SbMeasResult_s > (rnti, params.
m_cqiList.at (i).m_sbMeasResult) );
741 (*it).second = params.
m_cqiList.at (i).m_sbMeasResult;
742 std::map <uint16_t,uint32_t>::iterator itTimers;
760 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find (rnti);
774 double sinr = (*itCqi).second.at (i);
781 double estimatedSinr = sinrSum / (double)sinrNum;
783 (*itCqi).second.at (rb) = estimatedSinr;
784 return (estimatedSinr);
795 std::map <uint16_t,uint32_t>::iterator it;
801 if ((*it).second > 0)
822 std::vector <uint16_t> rbgAllocationMap;
851 uldci.
m_rnti = (*it).first;
854 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find ((*it).first);
864 double minSinr = (*itCqi).second.at (uldci.
m_rbStart);
871 double sinr = (*itCqi).second.at (i);
876 if ((*itCqi).second.at (i) < minSinr)
878 minSinr = (*itCqi).second.at (i);
883 double s = log2 ( 1 + (
884 std::pow (10, minSinr / 10 ) /
885 ( (-std::log (5.0 * 0.00005 )) / 1.5) ));
901 rbAllocated += rbPerFlow;
903 for (
int i = 0; i < rbPerFlow; i++)
905 rbgAllocationMap.push_back ((*it).first);
908 NS_LOG_DEBUG (
this <<
" UE " << (*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);
964 std::map <uint16_t,uint32_t>::iterator it;
966 for (
unsigned int i = 0; i < params.
m_macCeList.size (); i++)
978 uint8_t bsrId = params.
m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0);
980 m_ceBsrRxed.insert ( std::pair<uint16_t, uint32_t > (rnti, buffer));
1028 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
1029 std::map <uint16_t, std::vector <double> >::iterator itCqi;
1036 for (uint32_t i = 0; i < (*itMap).second.size (); i++)
1041 itCqi =
m_ueCqi.find ((*itMap).second.at (i));
1045 std::vector <double> newCqi;
1050 newCqi.push_back (sinr);
1059 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > ((*itMap).second.at (i), newCqi));
1066 (*itCqi).second.at (i) = sinr;
1068 std::map <uint16_t, uint32_t>::iterator itTimers;
1089 rnti = vsp->GetRnti ();
1092 std::map <uint16_t, std::vector <double> >::iterator itCqi;
1097 std::vector <double> newCqi;
1101 newCqi.push_back (sinr);
1102 NS_LOG_DEBUG (
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value " << sinr);
1105 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > (rnti, newCqi));
1115 (*itCqi).second.at (j) = sinr;
1116 NS_LOG_DEBUG (
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value " << sinr);
1119 std::map <uint16_t, uint32_t>::iterator itTimers;
1132 NS_FATAL_ERROR (
"TdTbfqFfMacScheduler supports only PUSCH and SRS UL-CQIs");
1145 std::map <uint16_t,uint32_t>::iterator itP10 =
m_p10CqiTimers.begin ();
1149 if ((*itP10).second == 0)
1152 std::map <uint16_t,uint8_t>::iterator itMap =
m_p10CqiRxed.find ((*itP10).first);
1154 NS_LOG_INFO (
this <<
" P10-CQI exired for user " << (*itP10).first);
1156 std::map <uint16_t,uint32_t>::iterator temp = itP10;
1168 std::map <uint16_t,uint32_t>::iterator itA30 =
m_a30CqiTimers.begin ();
1172 if ((*itA30).second == 0)
1175 std::map <uint16_t,SbMeasResult_s>::iterator itMap =
m_a30CqiRxed.find ((*itA30).first);
1177 NS_LOG_INFO (
this <<
" A30-CQI exired for user " << (*itA30).first);
1179 std::map <uint16_t,uint32_t>::iterator temp = itA30;
1198 std::map <uint16_t,uint32_t>::iterator itUl =
m_ueCqiTimers.begin ();
1202 if ((*itUl).second == 0)
1205 std::map <uint16_t, std::vector <double> >::iterator itMap =
m_ueCqi.find ((*itUl).first);
1206 NS_ASSERT_MSG (itMap !=
m_ueCqi.end (),
" Does not find CQI report for user " << (*itUl).first);
1207 NS_LOG_INFO (
this <<
" UL-CQI exired for user " << (*itUl).first);
1208 (*itMap).second.clear ();
1210 std::map <uint16_t,uint32_t>::iterator temp = itUl;
1228 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
1235 if ((*it).second.m_rlcStatusPduSize <= size)
1237 size -= (*it).second.m_rlcStatusPduSize;
1238 (*it).second.m_rlcStatusPduSize = 0;
1242 (*it).second.m_rlcStatusPduSize -= size;
1246 if ((*it).second.m_rlcRetransmissionQueueSize <= size)
1248 size -= (*it).second.m_rlcRetransmissionQueueSize;
1249 (*it).second.m_rlcRetransmissionQueueSize = 0;
1253 (*it).second.m_rlcRetransmissionQueueSize -= size;
1257 if ((*it).second.m_rlcTransmissionQueueSize <= size)
1259 size -= (*it).second.m_rlcTransmissionQueueSize;
1260 (*it).second.m_rlcTransmissionQueueSize = 0;
1264 (*it).second.m_rlcTransmissionQueueSize -= size;
1270 NS_LOG_ERROR (
this <<
" Does not find DL RLC Buffer Report of UE " << rnti);
1279 std::map <uint16_t,uint32_t>::iterator it =
m_ceBsrRxed.find (rnti);
1282 if ((*it).second >= size)
1284 (*it).second -= size;
1293 NS_LOG_ERROR (
this <<
" Does not find BSR report info of UE " << rnti);
1301 NS_LOG_FUNCTION (
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);