23 #include <ns3/pointer.h>
24 #include <ns3/integer.h>
26 #include <ns3/simulator.h>
27 #include <ns3/lte-amc.h>
28 #include <ns3/string.h>
29 #include <ns3/pss-ff-mac-scheduler.h>
30 #include <ns3/lte-vendor-specific-parameters.h>
141 : m_scheduler (scheduler)
216 : m_cschedSapUser (0),
221 m_amc = CreateObject <LteAmc> ();
244 .AddConstructor<PssFfMacScheduler> ()
245 .AddAttribute (
"CqiTimerThreshold",
246 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
249 MakeUintegerChecker<uint32_t> ())
250 .AddAttribute (
"PssFdSchedulerType",
251 "FD scheduler in PSS (default value is PFsch)",
254 MakeStringChecker ())
255 .AddAttribute (
"nMux",
256 "The number of UE selected by TD scheduler (default value is 0)",
259 MakeUintegerChecker<uint32_t> ())
323 std::map <uint16_t, pssFlowPerf_t>::iterator it;
381 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
389 m_rlcBufferReq.insert (std::pair <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters> (flow, params));
393 (*it).second = params;
416 for (
int i = 0; i < 4; i++)
431 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
435 if (((*it).first.m_rnti == rnti) && (((*it).second.m_rlcTransmissionQueueSize > 0)
436 || ((*it).second.m_rlcRetransmissionQueueSize > 0)
437 || ((*it).second.m_rlcStatusPduSize > 0) ))
441 if ((*it).first.m_rnti > rnti)
464 std::map <uint16_t, std::vector <uint16_t> > allocationMap;
465 std::map <uint16_t, pssFlowPerf_t>::iterator it;
468 std::map <uint16_t, pssFlowPerf_t> ueSet;
473 ueSet.insert(std::pair <uint16_t, pssFlowPerf_t> ((*it).first, (*it).second));
477 if (ueSet.size() == 0)
484 std::vector <std::pair<double, uint16_t> > ueSet1;
485 std::vector <std::pair<double,uint16_t> > ueSet2;
486 for (it = ueSet.begin (); it != ueSet.end (); it++)
489 if ((*it).second.lastAveragedThroughput < (*it).second.targetThroughput )
492 metric = 1 / (*it).second.lastAveragedThroughput;
493 ueSet1.push_back(std::pair<double, uint16_t> (metric, (*it).first));
498 std::map <uint16_t,uint8_t>::iterator itCqi;
500 std::map <uint16_t,uint8_t>::iterator itTxMode;
504 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
514 wbCqi = (*itCqi).second;
522 double achievableRate = 0.0;
523 for (uint8_t k = 0; k < nLayer; k++)
530 metric = achievableRate / (*it).second.lastAveragedThroughput;
534 ueSet2.push_back(std::pair<double, uint16_t> (metric, (*it).first));
539 std::sort (ueSet1.rbegin (), ueSet1.rend ());
540 std::sort (ueSet2.rbegin (), ueSet2.rend ());
542 std::map <uint16_t, pssFlowPerf_t> tdUeSet;
549 if (ueSet1.size() + ueSet2.size() <=2 )
552 nMux = (int)((ueSet1.size() + ueSet2.size()) / 2) ;
556 std::vector <std::pair<double, uint16_t> >::iterator itSet;
557 for (itSet = ueSet1.begin (); itSet != ueSet1.end () && nMux != 0; itSet++)
559 std::map <uint16_t, pssFlowPerf_t>::iterator itUe;
561 tdUeSet.insert(std::pair<uint16_t, pssFlowPerf_t> ( (*itUe).first, (*itUe).second ) );
568 for (itSet = ueSet2.begin (); itSet != ueSet2.end () && nMux != 0; itSet++)
570 std::map <uint16_t, pssFlowPerf_t>::iterator itUe;
572 tdUeSet.insert(std::pair<uint16_t, pssFlowPerf_t> ( (*itUe).first, (*itUe).second ) );
584 std::map < uint16_t, uint8_t > sbCqiSum;
585 for (it = tdUeSet.begin (); it != tdUeSet.end (); it++)
588 for (
int i = 0; i < rbgNum; i++)
590 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
592 std::map <uint16_t,uint8_t>::iterator itTxMode;
596 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
599 std::vector <uint8_t> sbCqis;
602 for (uint8_t k = 0; k < nLayer; k++)
604 sbCqis.push_back (1);
609 sbCqis = (*itCqi).second.m_higherLayerSelected.at (i).m_sbCqi;
612 uint8_t cqi1 = sbCqis.at (0);
614 if (sbCqis.size () > 1)
616 cqi2 = sbCqis.at (1);
620 if ((cqi1 > 0)||(cqi2 > 0))
622 for (uint8_t k = 0; k < nLayer; k++)
624 if (sbCqis.size () > k)
626 sbCqi = sbCqis.at(k);
638 sbCqiSum.insert (std::pair<uint16_t, uint8_t> ((*it).first, sum));
641 for (
int i = 0; i < rbgNum; i++)
643 std::map <uint16_t, pssFlowPerf_t>::iterator itMax = tdUeSet.end ();
644 double metricMax = 0.0;
645 for (it = tdUeSet.begin (); it != tdUeSet.end (); it++)
648 double weight = (*it).second.targetThroughput / (*it).second.lastAveragedThroughput;
652 std::map < uint16_t, uint8_t>::iterator itSbCqiSum;
653 itSbCqiSum = sbCqiSum.find((*it).first);
655 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
657 std::map <uint16_t,uint8_t>::iterator itTxMode;
661 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
664 std::vector <uint8_t> sbCqis;
667 for (uint8_t k = 0; k < nLayer; k++)
669 sbCqis.push_back (1);
674 sbCqis = (*itCqi).second.m_higherLayerSelected.at (i).m_sbCqi;
677 uint8_t cqi1 = sbCqis.at( 0);
679 if (sbCqis.size () > 1)
685 double colMetric = 0.0;
686 if ((cqi1 > 0)||(cqi2 > 0))
688 for (uint8_t k = 0; k < nLayer; k++)
690 if (sbCqis.size () > k)
692 sbCqi = sbCqis.at(k);
699 colMetric += (double)sbCqi / (
double)(*itSbCqiSum).second;
705 metric= weight * colMetric;
709 if (metric > metricMax )
724 std::vector <uint16_t> tempMap;
725 for (
int i = 0; i < rbgNum; i++)
727 tempMap.push_back (i);
729 allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax).first, tempMap));
738 for (
int i = 0; i < rbgNum; i++)
740 std::map <uint16_t, pssFlowPerf_t>::iterator itMax = tdUeSet.end ();
741 double metricMax = 0.0;
742 for (it = tdUeSet.begin (); it != tdUeSet.end (); it++)
745 double weight = (*it).second.targetThroughput / (*it).second.lastAveragedThroughput;
749 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
751 std::map <uint16_t,uint8_t>::iterator itTxMode;
755 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
758 std::vector <uint8_t> sbCqis;
761 for (uint8_t k = 0; k < nLayer; k++)
763 sbCqis.push_back (1);
768 sbCqis = (*itCqi).second.m_higherLayerSelected.at (i).m_sbCqi;
771 uint8_t cqi1 = sbCqis.at(0);
773 if (sbCqis.size () > 1)
778 double schMetric = 0.0;
779 if ((cqi1 > 0)||(cqi2 > 0))
781 double achievableRate = 0.0;
782 for (uint8_t k = 0; k < nLayer; k++)
785 if (sbCqis.size () > k)
796 schMetric = achievableRate / (*it).second.secondLastAveragedThroughput;
800 metric= weight * schMetric;
802 if (metric > metricMax )
817 std::vector <uint16_t> tempMap;
818 for (
int i = 0; i < rbgNum; i++)
820 tempMap.push_back (i);
822 allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax).first, tempMap));
831 std::map <uint16_t, pssFlowPerf_t>::iterator itStats;
834 (*itStats).second.lastTtiBytesTransmitted = 0;
840 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap = allocationMap.begin ();
841 while (itMap != allocationMap.end ())
845 newEl.
m_rnti = (*itMap).first;
848 std::vector <struct RlcPduListElement_s> newRlcPduLe;
849 newDci.
m_rnti = (*itMap).first;
852 uint16_t rbgPerRnti = (*itMap).second.size ();
853 std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
855 std::map <uint16_t,uint8_t>::iterator itTxMode;
859 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*itMap).first);
862 std::vector <uint8_t> worstCqi (2, 15);
865 for (uint16_t k = 0; k < (*itMap).second.size (); k++)
867 if ((*itCqi).second.m_higherLayerSelected.size () > (*itMap).second.at (k))
869 for (uint8_t j = 0; j < nLayer; j++)
871 if ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.size () > j)
873 if (((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j)) < worstCqi.at (j))
875 worstCqi.at (j) = ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j));
887 for (uint8_t j = 0; j < nLayer; j++)
896 for (uint8_t j = 0; j < nLayer; j++)
901 uint32_t bytesTxed = 0;
902 for (uint8_t j = 0; j < nLayer; j++)
912 uint32_t rbgMask = 0;
913 for (uint16_t k = 0; k < (*itMap).second.size (); k++)
915 rbgMask = rbgMask + (0x1 << (*itMap).second.at (k));
920 std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator itBufReq;
923 if (((*itBufReq).first.m_rnti == (*itMap).first) &&
924 (((*itBufReq).second.m_rlcTransmissionQueueSize > 0)
925 || ((*itBufReq).second.m_rlcRetransmissionQueueSize > 0)
926 || ((*itBufReq).second.m_rlcStatusPduSize > 0) ))
928 for (uint8_t j = 0; j < nLayer; j++)
933 newRlcPduLe.push_back (newRlcEl);
937 if ((*itBufReq).first.m_rnti > (*itMap).first)
942 newDci.
m_ndi.push_back (1);
943 newDci.
m_rv.push_back (0);
945 newEl.
m_dci = newDci;
952 std::map <uint16_t, pssFlowPerf_t>::iterator it;
956 (*it).second.lastTtiBytesTransmitted = bytesTxed;
960 NS_LOG_DEBUG (
this <<
" No Stats for this allocated UE");
971 std::map <uint16_t, pssFlowPerf_t>::iterator itUeScheduleted = tdUeSet.end();
972 itUeScheduleted = tdUeSet.find((*itStats).first);
973 if (itUeScheduleted != tdUeSet.end())
975 (*itStats).second.secondLastAveragedThroughput = ((1.0 - (1 /
m_timeWindow)) * (*itStats).second.secondLastAveragedThroughput) + ((1 /
m_timeWindow) * (double)((*itStats).second.lastTtiBytesTransmitted / 0.001));
978 (*itStats).second.totalBytesTransmitted += (*itStats).second.lastTtiBytesTransmitted;
980 (*itStats).second.lastAveragedThroughput = ((1.0 - (1.0 /
m_timeWindow)) * (*itStats).second.lastAveragedThroughput) + ((1.0 /
m_timeWindow) * (double)((*itStats).second.lastTtiBytesTransmitted / 0.001));
981 (*itStats).second.lastTtiBytesTransmitted = 0;
1002 for (
unsigned int i = 0; i < params.
m_cqiList.size (); i++)
1007 std::map <uint16_t,uint8_t>::iterator it;
1008 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
1013 m_p10CqiRxed.insert ( std::pair<uint16_t, uint8_t > (rnti, params.
m_cqiList.at (i).m_wbCqi.at (0)) );
1020 (*it).second = params.
m_cqiList.at (i).m_wbCqi.at (0);
1022 std::map <uint16_t,uint32_t>::iterator itTimers;
1030 std::map <uint16_t,SbMeasResult_s>::iterator it;
1031 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
1036 m_a30CqiRxed.insert ( std::pair<uint16_t, SbMeasResult_s > (rnti, params.
m_cqiList.at (i).m_sbMeasResult) );
1042 (*it).second = params.
m_cqiList.at (i).m_sbMeasResult;
1043 std::map <uint16_t,uint32_t>::iterator itTimers;
1061 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find (rnti);
1075 double sinr = (*itCqi).second.at (i);
1082 double estimatedSinr = sinrSum / (double)sinrNum;
1084 (*itCqi).second.at (rb) = estimatedSinr;
1085 return (estimatedSinr);
1096 std::map <uint16_t,uint32_t>::iterator it;
1102 if ((*it).second > 0)
1120 int rbAllocated = 0;
1123 std::vector <uint16_t> rbgAllocationMap;
1152 uldci.
m_rnti = (*it).first;
1155 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find ((*it).first);
1165 double minSinr = (*itCqi).second.at (uldci.
m_rbStart);
1172 double sinr = (*itCqi).second.at (i);
1177 if ((*itCqi).second.at (i) < minSinr)
1179 minSinr = (*itCqi).second.at (i);
1184 double s = log2 ( 1 + (
1185 std::pow (10, minSinr / 10 ) /
1186 ( (-std::log (5.0 * 0.00005 )) / 1.5) ));
1201 rbAllocated += rbPerFlow;
1203 for (
int i = 0; i < rbPerFlow; i++)
1205 rbgAllocationMap.push_back ((*it).first);
1208 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);
1264 std::map <uint16_t,uint32_t>::iterator it;
1266 for (
unsigned int i = 0; i < params.
m_macCeList.size (); i++)
1278 uint8_t bsrId = params.
m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0);
1280 m_ceBsrRxed.insert ( std::pair<uint16_t, uint32_t > (rnti, buffer));
1328 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
1329 std::map <uint16_t, std::vector <double> >::iterator itCqi;
1336 for (uint32_t i = 0; i < (*itMap).second.size (); i++)
1341 itCqi =
m_ueCqi.find ((*itMap).second.at (i));
1345 std::vector <double> newCqi;
1350 newCqi.push_back (sinr);
1359 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > ((*itMap).second.at (i), newCqi));
1366 (*itCqi).second.at (i) = sinr;
1368 std::map <uint16_t, uint32_t>::iterator itTimers;
1389 rnti = vsp->GetRnti ();
1392 std::map <uint16_t, std::vector <double> >::iterator itCqi;
1397 std::vector <double> newCqi;
1401 newCqi.push_back (sinr);
1402 NS_LOG_DEBUG (
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value " << sinr);
1405 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > (rnti, newCqi));
1415 (*itCqi).second.at (j) = sinr;
1416 NS_LOG_DEBUG (
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value " << sinr);
1419 std::map <uint16_t, uint32_t>::iterator itTimers;
1432 NS_FATAL_ERROR (
"PssFfMacScheduler supports only PUSCH and SRS UL-CQIs");
1445 std::map <uint16_t,uint32_t>::iterator itP10 =
m_p10CqiTimers.begin ();
1449 if ((*itP10).second == 0)
1452 std::map <uint16_t,uint8_t>::iterator itMap =
m_p10CqiRxed.find ((*itP10).first);
1454 NS_LOG_INFO (
this <<
" P10-CQI exired for user " << (*itP10).first);
1456 std::map <uint16_t,uint32_t>::iterator temp = itP10;
1468 std::map <uint16_t,uint32_t>::iterator itA30 =
m_a30CqiTimers.begin ();
1472 if ((*itA30).second == 0)
1475 std::map <uint16_t,SbMeasResult_s>::iterator itMap =
m_a30CqiRxed.find ((*itA30).first);
1477 NS_LOG_INFO (
this <<
" A30-CQI exired for user " << (*itA30).first);
1479 std::map <uint16_t,uint32_t>::iterator temp = itA30;
1498 std::map <uint16_t,uint32_t>::iterator itUl =
m_ueCqiTimers.begin ();
1502 if ((*itUl).second == 0)
1505 std::map <uint16_t, std::vector <double> >::iterator itMap =
m_ueCqi.find ((*itUl).first);
1506 NS_ASSERT_MSG (itMap !=
m_ueCqi.end (),
" Does not find CQI report for user " << (*itUl).first);
1507 NS_LOG_INFO (
this <<
" UL-CQI exired for user " << (*itUl).first);
1508 (*itMap).second.clear ();
1510 std::map <uint16_t,uint32_t>::iterator temp = itUl;
1528 std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
1535 if ((*it).second.m_rlcStatusPduSize <= size)
1537 size -= (*it).second.m_rlcStatusPduSize;
1538 (*it).second.m_rlcStatusPduSize = 0;
1542 (*it).second.m_rlcStatusPduSize -= size;
1546 if ((*it).second.m_rlcRetransmissionQueueSize <= size)
1548 size -= (*it).second.m_rlcRetransmissionQueueSize;
1549 (*it).second.m_rlcRetransmissionQueueSize = 0;
1553 (*it).second.m_rlcRetransmissionQueueSize -= size;
1557 if ((*it).second.m_rlcTransmissionQueueSize <= size)
1559 size -= (*it).second.m_rlcTransmissionQueueSize;
1560 (*it).second.m_rlcTransmissionQueueSize = 0;
1564 (*it).second.m_rlcTransmissionQueueSize -= size;
1570 NS_LOG_ERROR (
this <<
" Does not find DL RLC Buffer Report of UE " << rnti);
1579 std::map <uint16_t,uint32_t>::iterator it =
m_ceBsrRxed.find (rnti);
1582 if ((*it).second >= size)
1584 (*it).second -= size;
1593 NS_LOG_ERROR (
this <<
" Does not find BSR report info of UE " << rnti);
1601 NS_LOG_FUNCTION (
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);