23 #include <ns3/pointer.h>
24 #include <ns3/integer.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>
140 : m_scheduler (scheduler)
215 : m_cschedSapUser (0),
221 m_amc = CreateObject <LteAmc> ();
242 static TypeId tid =
TypeId (
"ns3::FdTbfqFfMacScheduler")
244 .AddConstructor<FdTbfqFfMacScheduler> ()
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, fdtbfqsFlowPerf_t>::iterator it;
353 m_flowStatsDl.insert (std::pair<uint16_t, fdtbfqsFlowPerf_t> (params.
m_rnti, flowStatsDl));
364 m_flowStatsUl.insert (std::pair<uint16_t, fdtbfqsFlowPerf_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++)
447 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
451 if (((*it).first.m_rnti == rnti) && (((*it).second.m_rlcTransmissionQueueSize > 0)
452 || ((*it).second.m_rlcRetransmissionQueueSize > 0)
453 || ((*it).second.m_rlcStatusPduSize > 0) ))
457 if ((*it).first.m_rnti > rnti)
479 std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator itStats;
482 if ( (*itStats).second.tokenGenerationRate / 1000 + (*itStats).second.tokenPoolSize > (*itStats).second.maxTokenPoolSize )
484 (*itStats).second.counter += (*itStats).second.tokenGenerationRate / 1000 - ( (*itStats).second.maxTokenPoolSize - (*itStats).second.tokenPoolSize );
485 (*itStats).second.tokenPoolSize = (*itStats).second.maxTokenPoolSize;
486 bankSize += (*itStats).second.tokenGenerationRate / 1000 - ( (*itStats).second.maxTokenPoolSize - (*itStats).second.tokenPoolSize );
490 (*itStats).second.tokenPoolSize += (*itStats).second.tokenGenerationRate / 1000;
496 std::map <uint16_t, std::vector <uint16_t> > allocationMap;
497 std::set <uint16_t> allocatedRnti;
498 std::set <uint8_t> allocatedRbg;
501 while (totalRbg < rbgNum)
504 std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator it;
505 std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator itMax =
m_flowStatsDl.end ();
506 double metricMax = 0.0;
507 bool firstRnti =
true;
515 std::set <uint16_t>::iterator rnti;
516 rnti = allocatedRnti.find((*it).first);
517 if (rnti != allocatedRnti.end ())
522 double metric = ( ( (double)(*it).second.counter ) / ( (double)(*it).second.tokenGenerationRate ) );
524 if (firstRnti ==
true)
531 if (metric > metricMax)
545 allocatedRnti.insert((*itMax).first);
551 budget = (*itMax).second.counter - (*itMax).second.debtLimit;
552 if ( budget > (*itMax).second.burstCredit )
553 budget = (*itMax).second.burstCredit;
557 budget = budget + (*itMax).second.tokenPoolSize;
568 uint32_t rlcBufSize = 0;
570 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator itRlcBuf;
573 if ( (*itRlcBuf).first.m_rnti == (*itMax).first )
574 lcid = (*itRlcBuf).first.m_lcId;
579 rlcBufSize = (*itRlcBuf).second.m_rlcTransmissionQueueSize + (*itRlcBuf).second.m_rlcRetransmissionQueueSize + (*itRlcBuf).second.m_rlcStatusPduSize;
580 if ( budget > rlcBufSize )
585 uint32_t bytesTxed = 0;
586 uint32_t bytesTxedTmp = 0;
588 while ( bytesTxed <= budget )
592 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
594 std::map <uint16_t,uint8_t>::iterator itTxMode;
598 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
603 double achievableRateMax = 0.0;
605 for (
int k = 0; k < rbgNum; k++)
607 std::set <uint8_t>::iterator rbg;
608 rbg = allocatedRbg.find (k);
609 if (rbg != allocatedRbg.end ())
612 std::vector <uint8_t> sbCqi;
615 for (uint8_t k = 0; k < nLayer; k++)
622 sbCqi = (*itCqi).second.m_higherLayerSelected.at (k).m_sbCqi;
624 uint8_t cqi1 = sbCqi.at (0);
626 if (sbCqi.size () > 1)
631 if ((cqi1 > 0)||(cqi2 > 0))
636 double achievableRate = 0.0;
637 for (uint8_t j = 0; j < nLayer; j++)
640 if (sbCqi.size () > j)
652 if ( achievableRate > achievableRateMax )
654 achievableRateMax = achievableRate;
661 if ( rbgIndex == rbgNum)
670 allocatedRbg.insert (rbgIndex);
674 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
675 itMap = allocationMap.find ((*itMax).first);
677 if (itMap == allocationMap.end ())
680 std::vector <uint16_t> tempMap;
681 tempMap.push_back (rbgIndex);
682 allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax).first, tempMap));
683 itMap = allocationMap.find ((*itMax).first);
687 (*itMap).second.push_back (rbgIndex);
690 RbgPerRnti = (*itMap).second.size();
693 std::vector <uint8_t> worstCqi (2, 15);
696 for (uint16_t k = 0; k < (*itMap).second.size (); k++)
698 if ((*itCqi).second.m_higherLayerSelected.size () > (*itMap).second.at (k))
700 for (uint8_t j = 0; j < nLayer; j++)
702 if ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.size () > j)
704 if (((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j)) < worstCqi.at (j))
706 worstCqi.at (j) = ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j));
718 for (uint8_t j = 0; j < nLayer; j++)
727 for (uint8_t j = 0; j < nLayer; j++)
733 bytesTxedTmp = bytesTxed;
735 for (uint8_t j = 0; j < nLayer; j++)
744 if ( bytesTxed > budget )
746 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
747 itMap = allocationMap.find ((*itMax).first);
748 (*itMap).second.pop_back ();
749 allocatedRbg.erase (rbgIndex);
750 bytesTxed = bytesTxedTmp;
755 if ( bytesTxed <= (*itMax).second.tokenPoolSize )
757 (*itMax).second.tokenPoolSize -= bytesTxed;
761 (*itMax).second.counter = (*itMax).second.counter - ( bytesTxed - (*itMax).second.tokenPoolSize );
762 (*itMax).second.tokenPoolSize = 0;
763 if (
bankSize <= ( bytesTxed - (*itMax).second.tokenPoolSize ))
773 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap = allocationMap.begin ();
774 while (itMap != allocationMap.end ())
778 newEl.
m_rnti = (*itMap).first;
781 std::vector <struct RlcPduListElement_s> newRlcPduLe;
782 newDci.
m_rnti = (*itMap).first;
785 uint16_t RgbPerRnti = (*itMap).second.size ();
786 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
788 std::map <uint16_t,uint8_t>::iterator itTxMode;
792 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*itMap).first);
795 std::vector <uint8_t> worstCqi (2, 15);
798 for (uint16_t k = 0; k < (*itMap).second.size (); k++)
800 if ((*itCqi).second.m_higherLayerSelected.size () > (*itMap).second.at (k))
802 for (uint8_t j = 0; j < nLayer; j++)
804 if ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.size () > j)
806 if (((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j)) < worstCqi.at (j))
808 worstCqi.at (j) = ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j));
820 for (uint8_t j = 0; j < nLayer; j++)
829 for (uint8_t j = 0; j < nLayer; j++)
834 uint32_t bytesTxed = 0;
835 for (uint8_t j = 0; j < nLayer; j++)
845 uint32_t rbgMask = 0;
846 for (uint16_t k = 0; k < (*itMap).second.size (); k++)
848 rbgMask = rbgMask + (0x1 << (*itMap).second.at (k));
853 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator itBufReq;
856 if (((*itBufReq).first.m_rnti == (*itMap).first) &&
857 (((*itBufReq).second.m_rlcTransmissionQueueSize > 0)
858 || ((*itBufReq).second.m_rlcRetransmissionQueueSize > 0)
859 || ((*itBufReq).second.m_rlcStatusPduSize > 0) ))
861 for (uint8_t j = 0; j < nLayer; j++)
866 newRlcPduLe.push_back (newRlcEl);
870 if ((*itBufReq).first.m_rnti > (*itMap).first)
875 newDci.
m_ndi.push_back (1);
876 newDci.
m_rv.push_back (0);
878 newEl.
m_dci = newDci;
905 for (
unsigned int i = 0; i < params.
m_cqiList.size (); i++)
910 std::map <uint16_t,uint8_t>::iterator it;
911 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
916 m_p10CqiRxed.insert ( std::pair<uint16_t, uint8_t > (rnti, params.
m_cqiList.at (i).m_wbCqi.at (0)) );
923 (*it).second = params.
m_cqiList.at (i).m_wbCqi.at (0);
925 std::map <uint16_t,uint32_t>::iterator itTimers;
933 std::map <uint16_t,SbMeasResult_s>::iterator it;
934 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
939 m_a30CqiRxed.insert ( std::pair<uint16_t, SbMeasResult_s > (rnti, params.
m_cqiList.at (i).m_sbMeasResult) );
945 (*it).second = params.
m_cqiList.at (i).m_sbMeasResult;
946 std::map <uint16_t,uint32_t>::iterator itTimers;
964 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find (rnti);
978 double sinr = (*itCqi).second.at (i);
985 double estimatedSinr = sinrSum / (double)sinrNum;
987 (*itCqi).second.at (rb) = estimatedSinr;
988 return (estimatedSinr);
999 std::map <uint16_t,uint32_t>::iterator it;
1005 if ((*it).second > 0)
1023 int rbAllocated = 0;
1026 std::vector <uint16_t> rbgAllocationMap;
1055 uldci.
m_rnti = (*it).first;
1058 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find ((*it).first);
1068 double minSinr = (*itCqi).second.at (uldci.
m_rbStart);
1075 double sinr = (*itCqi).second.at (i);
1080 if ((*itCqi).second.at (i) < minSinr)
1082 minSinr = (*itCqi).second.at (i);
1087 double s = log2 ( 1 + (
1088 std::pow (10, minSinr / 10 ) /
1089 ( (-std::log (5.0 * 0.00005 )) / 1.5) ));
1105 rbAllocated += rbPerFlow;
1107 for (
int i = 0; i < rbPerFlow; i++)
1109 rbgAllocationMap.push_back ((*it).first);
1112 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);
1168 std::map <uint16_t,uint32_t>::iterator it;
1170 for (
unsigned int i = 0; i < params.
m_macCeList.size (); i++)
1182 uint8_t bsrId = params.
m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0);
1184 m_ceBsrRxed.insert ( std::pair<uint16_t, uint32_t > (rnti, buffer));
1232 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
1233 std::map <uint16_t, std::vector <double> >::iterator itCqi;
1240 for (uint32_t i = 0; i < (*itMap).second.size (); i++)
1245 itCqi =
m_ueCqi.find ((*itMap).second.at (i));
1249 std::vector <double> newCqi;
1254 newCqi.push_back (sinr);
1263 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > ((*itMap).second.at (i), newCqi));
1270 (*itCqi).second.at (i) = sinr;
1272 std::map <uint16_t, uint32_t>::iterator itTimers;
1293 rnti = vsp->GetRnti ();
1296 std::map <uint16_t, std::vector <double> >::iterator itCqi;
1301 std::vector <double> newCqi;
1305 newCqi.push_back (sinr);
1306 NS_LOG_DEBUG (
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value " << sinr);
1309 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > (rnti, newCqi));
1319 (*itCqi).second.at (j) = sinr;
1320 NS_LOG_DEBUG (
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value " << sinr);
1323 std::map <uint16_t, uint32_t>::iterator itTimers;
1336 NS_FATAL_ERROR (
"FdTbfqFfMacScheduler supports only PUSCH and SRS UL-CQIs");
1349 std::map <uint16_t,uint32_t>::iterator itP10 =
m_p10CqiTimers.begin ();
1353 if ((*itP10).second == 0)
1356 std::map <uint16_t,uint8_t>::iterator itMap =
m_p10CqiRxed.find ((*itP10).first);
1358 NS_LOG_INFO (
this <<
" P10-CQI exired for user " << (*itP10).first);
1360 std::map <uint16_t,uint32_t>::iterator temp = itP10;
1372 std::map <uint16_t,uint32_t>::iterator itA30 =
m_a30CqiTimers.begin ();
1376 if ((*itA30).second == 0)
1379 std::map <uint16_t,SbMeasResult_s>::iterator itMap =
m_a30CqiRxed.find ((*itA30).first);
1381 NS_LOG_INFO (
this <<
" A30-CQI exired for user " << (*itA30).first);
1383 std::map <uint16_t,uint32_t>::iterator temp = itA30;
1402 std::map <uint16_t,uint32_t>::iterator itUl =
m_ueCqiTimers.begin ();
1406 if ((*itUl).second == 0)
1409 std::map <uint16_t, std::vector <double> >::iterator itMap =
m_ueCqi.find ((*itUl).first);
1410 NS_ASSERT_MSG (itMap !=
m_ueCqi.end (),
" Does not find CQI report for user " << (*itUl).first);
1411 NS_LOG_INFO (
this <<
" UL-CQI exired for user " << (*itUl).first);
1412 (*itMap).second.clear ();
1414 std::map <uint16_t,uint32_t>::iterator temp = itUl;
1432 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
1439 if ((*it).second.m_rlcStatusPduSize <= size)
1441 size -= (*it).second.m_rlcStatusPduSize;
1442 (*it).second.m_rlcStatusPduSize = 0;
1446 (*it).second.m_rlcStatusPduSize -= size;
1450 if ((*it).second.m_rlcRetransmissionQueueSize <= size)
1452 size -= (*it).second.m_rlcRetransmissionQueueSize;
1453 (*it).second.m_rlcRetransmissionQueueSize = 0;
1457 (*it).second.m_rlcRetransmissionQueueSize -= size;
1461 if ((*it).second.m_rlcTransmissionQueueSize <= size)
1463 size -= (*it).second.m_rlcTransmissionQueueSize;
1464 (*it).second.m_rlcTransmissionQueueSize = 0;
1468 (*it).second.m_rlcTransmissionQueueSize -= size;
1474 NS_LOG_ERROR (
this <<
" Does not find DL RLC Buffer Report of UE " << rnti);
1483 std::map <uint16_t,uint32_t>::iterator it =
m_ceBsrRxed.find (rnti);
1486 if ((*it).second >= size)
1488 (*it).second -= size;
1497 NS_LOG_ERROR (
this <<
" Does not find BSR report info of UE " << rnti);
1505 NS_LOG_FUNCTION (
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);