22 #include <ns3/pointer.h>
25 #include <ns3/lte-amc.h>
26 #include <ns3/rr-ff-mac-scheduler.h>
27 #include <ns3/simulator.h>
28 #include <ns3/lte-common.h>
29 #include <ns3/lte-vendor-specific-parameters.h>
140 : m_scheduler (scheduler)
215 : m_cschedSapUser (0),
220 m_amc = CreateObject <LteAmc> ();
243 .AddConstructor<RrFfMacScheduler> ()
244 .AddAttribute (
"CqiTimerThreshold",
245 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
248 MakeUintegerChecker<uint32_t> ())
337 std::list<FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
m_rlcBufferReq.begin ();
384 for (
int i = 0; i < 4; i++)
411 std::list<FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
415 std::map <uint16_t,uint8_t> lcActivesPerRnti;
416 std::map <uint16_t,uint8_t>::iterator itLcRnti;
421 if ( ((*it).m_rlcTransmissionQueueSize > 0)
422 || ((*it).m_rlcRetransmissionQueueSize > 0)
423 || ((*it).m_rlcStatusPduSize > 0) )
425 std::map <uint16_t,uint8_t>::iterator itCqi =
m_p10CqiRxed.find ((*it).m_rnti);
429 cqi = (*itCqi).second;
439 itLcRnti = lcActivesPerRnti.find ((*it).m_rnti);
440 if (itLcRnti != lcActivesPerRnti.end ())
442 (*itLcRnti).second++;
446 lcActivesPerRnti.insert (std::pair<uint16_t, uint8_t > ((*it).m_rnti, 1));
462 int rbgPerTb = rbgNum / nTbs;
467 int rbgAllocated = 0;
493 std::map <uint16_t,uint8_t>::iterator itTxMode;
496 itLcRnti = lcActivesPerRnti.find ((*it).m_rnti);
497 if (itLcRnti == lcActivesPerRnti.end ())
511 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).m_rnti);
514 int lcNum = (*itLcRnti).second;
517 newEl.
m_rnti = (*it).m_rnti;
520 newDci.
m_rnti = (*it).m_rnti;
524 for (uint8_t i = 0; i < nLayer; i++)
528 newDci.
m_mcs.push_back (0);
536 std::vector <struct RlcPduListElement_s> newRlcPduLe;
540 NS_LOG_DEBUG (
this <<
" DL - Allocate user " << newEl.
m_rnti <<
" LCs " << (uint16_t)(*itLcRnti).second <<
" bytes " << tbSize <<
" PRBs " << rbgAllocated * rbgSize <<
"..." << (rbgAllocated* rbgSize) + (rbgPerTb * rbgSize) - 1 <<
" mcs " << (uint16_t) newDci.
m_mcs.at (0) <<
" layers " << nLayer);
541 uint16_t rlcPduSize = tbSize / lcNum;
542 for (
int i = 0; i < lcNum ; i++)
544 for (uint8_t j = 0; j < nLayer; j++)
549 newRlcEl.
m_size = rlcPduSize;
551 newRlcPduLe.push_back (newRlcEl);
560 uint32_t rbgMask = 0;
561 for (
int i = 0; i < rbgPerTb; i++)
563 rbgMask = rbgMask + (0x1 << rbgAllocated);
568 for (
int i = 0; i < nLayer; i++)
571 newDci.
m_ndi.push_back (1);
572 newDci.
m_rv.push_back (0);
574 newEl.
m_dci = newDci;
582 if (rbgAllocated == rbgNum)
610 std::map <uint16_t,uint8_t>::iterator it;
611 for (
unsigned int i = 0; i < params.
m_cqiList.size (); i++)
616 std::map <uint16_t,uint8_t>::iterator it;
617 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
622 m_p10CqiRxed.insert ( std::pair<uint16_t, uint8_t > (rnti, params.
m_cqiList.at (i).m_wbCqi.at (0)) );
629 (*it).second = params.
m_cqiList.at (i).m_wbCqi.at (0);
631 std::map <uint16_t,uint32_t>::iterator itTimers;
658 std::map <uint16_t,uint32_t>::iterator it;
664 if ((*it).second > 0)
685 std::vector <uint16_t> rbgAllocationMap;
714 uldci.
m_rnti = (*it).first;
717 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find ((*it).first);
723 NS_LOG_DEBUG (
this <<
" UE does not have ULCQI " << (*it).first );
728 double minSinr = (*itCqi).second.at (uldci.
m_rbStart);
731 if ((*itCqi).second.at (i) < minSinr)
733 minSinr = (*itCqi).second.at (i);
737 double s = log2 ( 1 + (
738 std::pow (10, minSinr / 10 ) /
739 ( (-std::log (5.0 * 0.00005 )) / 1.5) ));
758 rbAllocated += rbPerFlow;
760 for (
int i = 0; i < rbPerFlow; i++)
762 rbgAllocationMap.push_back ((*it).first);
766 NS_LOG_DEBUG (
this <<
" UL - 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);
821 std::map <uint16_t,uint32_t>::iterator it;
823 for (
unsigned int i = 0; i < params.
m_macCeList.size (); i++)
835 uint8_t bsrId = params.
m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0);
837 m_ceBsrRxed.insert ( std::pair<uint16_t, uint32_t > (rnti, buffer));
885 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
886 std::map <uint16_t, std::vector <double> >::iterator itCqi;
893 for (uint32_t i = 0; i < (*itMap).second.size (); i++)
899 itCqi =
m_ueCqi.find ((*itMap).second.at (i));
903 std::vector <double> newCqi;
908 newCqi.push_back (sinr);
913 newCqi.push_back (30.0);
917 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > ((*itMap).second.at (i), newCqi));
924 (*itCqi).second.at (i) = sinr;
926 std::map <uint16_t, uint32_t>::iterator itTimers;
947 rnti = vsp->GetRnti ();
950 std::map <uint16_t, std::vector <double> >::iterator itCqi;
955 std::vector <double> newCqi;
959 newCqi.push_back (sinr);
960 NS_LOG_DEBUG (
this <<
" RNTI " << rnti <<
" new SRS-CQI for RB " << j <<
" value " << sinr);
963 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > (rnti, newCqi));
973 (*itCqi).second.at (j) = sinr;
974 NS_LOG_DEBUG (
this <<
" RNTI " << rnti <<
" update SRS-CQI for RB " << j <<
" value " << sinr);
977 std::map <uint16_t, uint32_t>::iterator itTimers;
990 NS_FATAL_ERROR (
"PfFfMacScheduler supports only PUSCH and SRS UL-CQIs");
1005 std::map <uint16_t,uint32_t>::iterator itP10 =
m_p10CqiTimers.begin ();
1009 if ((*itP10).second == 0)
1012 std::map <uint16_t,uint8_t>::iterator itMap =
m_p10CqiRxed.find ((*itP10).first);
1014 NS_LOG_INFO (
this <<
" P10-CQI exired for user " << (*itP10).first);
1016 std::map <uint16_t,uint32_t>::iterator temp = itP10;
1035 std::map <uint16_t,uint32_t>::iterator itUl =
m_ueCqiTimers.begin ();
1039 if ((*itUl).second == 0)
1042 std::map <uint16_t, std::vector <double> >::iterator itMap =
m_ueCqi.find ((*itUl).first);
1043 NS_ASSERT_MSG (itMap !=
m_ueCqi.end (),
" Does not find CQI report for user " << (*itUl).first);
1044 NS_LOG_INFO (
this <<
" UL-CQI exired for user " << (*itUl).first);
1045 (*itMap).second.clear ();
1047 std::map <uint16_t,uint32_t>::iterator temp = itUl;
1065 std::list<FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
1068 if (((*it).m_rnti == rnti) && ((*it).m_logicalChannelIdentity))
1073 if ((*it).m_rlcStatusPduSize <= size)
1075 size -= (*it).m_rlcStatusPduSize;
1076 (*it).m_rlcStatusPduSize = 0;
1080 (*it).m_rlcStatusPduSize -= size;
1084 if ((*it).m_rlcRetransmissionQueueSize <= size)
1086 size -= (*it).m_rlcRetransmissionQueueSize;
1087 (*it).m_rlcRetransmissionQueueSize = 0;
1091 (*it).m_rlcRetransmissionQueueSize -= size;
1095 if ((*it).m_rlcTransmissionQueueSize <= size)
1097 size -= (*it).m_rlcTransmissionQueueSize;
1098 (*it).m_rlcTransmissionQueueSize = 0;
1102 (*it).m_rlcTransmissionQueueSize -= size;
1115 std::map <uint16_t,uint32_t>::iterator it =
m_ceBsrRxed.find (rnti);
1119 if ((*it).second >= size)
1121 (*it).second -= size;
1130 NS_LOG_ERROR (
this <<
" Does not find BSR report info of UE " << rnti);
1139 NS_LOG_FUNCTION (
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);