22 #define log2(x) (log(x) / M_LN2)
26 #include <ns3/pointer.h>
28 #include <ns3/lte-amc.h>
29 #include <ns3/rr-ff-mac-scheduler.h>
30 #include <ns3/simulator.h>
31 #include <ns3/lte-common.h>
142 : m_scheduler (scheduler)
217 : m_cschedSapUser (0),
222 m_amc = CreateObject <LteAmc> ();
245 .AddConstructor<RrFfMacScheduler> ()
246 .AddAttribute (
"CqiTimerThreshold",
247 "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
250 MakeUintegerChecker<uint32_t> ())
339 std::list<FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it =
m_rlcBufferReq.begin ();
386 for (
int i = 0; i < 4; i++)
413 std::list<FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
417 std::map <uint16_t,uint8_t> lcActivesPerRnti;
418 std::map <uint16_t,uint8_t>::iterator itLcRnti;
423 if ( ((*it).m_rlcTransmissionQueueSize > 0)
424 || ((*it).m_rlcRetransmissionQueueSize > 0)
425 || ((*it).m_rlcStatusPduSize > 0) )
427 std::map <uint16_t,uint8_t>::iterator itCqi =
m_p10CqiRxed.find ((*it).m_rnti);
431 cqi = (*itCqi).second;
441 itLcRnti = lcActivesPerRnti.find ((*it).m_rnti);
442 if (itLcRnti != lcActivesPerRnti.end ())
444 (*itLcRnti).second++;
448 lcActivesPerRnti.insert (std::pair<uint16_t, uint8_t > ((*it).m_rnti, 1));
464 int rbgPerTb = rbgNum / nTbs;
469 int rbgAllocated = 0;
495 std::map <uint16_t,uint8_t>::iterator itTxMode;
498 itLcRnti = lcActivesPerRnti.find ((*it).m_rnti);
499 if (itLcRnti == lcActivesPerRnti.end ())
513 NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).m_rnti);
516 int lcNum = (*itLcRnti).second;
519 newEl.
m_rnti = (*it).m_rnti;
522 newDci.
m_rnti = (*it).m_rnti;
526 for (uint8_t i = 0; i < nLayer; i++)
530 newDci.
m_mcs.push_back (0);
538 std::vector <struct RlcPduListElement_s> newRlcPduLe;
542 NS_LOG_DEBUG (
this <<
"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);
543 uint16_t rlcPduSize = tbSize / lcNum;
544 for (
int i = 0; i < lcNum ; i++)
546 for (uint8_t j = 0; j < nLayer; j++)
551 newRlcEl.
m_size = rlcPduSize;
553 newRlcPduLe.push_back (newRlcEl);
562 uint32_t rbgMask = 0;
563 for (
int i = 0; i < rbgPerTb; i++)
565 rbgMask = rbgMask + (0x1 << rbgAllocated);
570 for (
int i = 0; i < nLayer; i++)
573 newDci.
m_ndi.push_back (1);
574 newDci.
m_rv.push_back (0);
576 newEl.
m_dci = newDci;
584 if (rbgAllocated == rbgNum)
612 std::map <uint16_t,uint8_t>::iterator it;
613 for (
unsigned int i = 0; i < params.
m_cqiList.size (); i++)
618 std::map <uint16_t,uint8_t>::iterator it;
619 uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
624 m_p10CqiRxed.insert ( std::pair<uint16_t, uint8_t > (rnti, params.
m_cqiList.at (i).m_wbCqi.at (0)) );
631 (*it).second = params.
m_cqiList.at (i).m_wbCqi.at (0);
633 std::map <uint16_t,uint32_t>::iterator itTimers;
660 std::map <uint16_t,uint32_t>::iterator it;
666 if ((*it).second > 0)
687 std::vector <uint16_t> rbgAllocationMap;
716 uldci.
m_rnti = (*it).first;
719 std::map <uint16_t, std::vector <double> >::iterator itCqi =
m_ueCqi.find ((*it).first);
725 NS_LOG_DEBUG (
this <<
" UE does not have ULCQI " << (*it).first );
730 double minSinr = (*itCqi).second.at (uldci.
m_rbStart);
733 if ((*itCqi).second.at (i) < minSinr)
735 minSinr = (*itCqi).second.at (i);
739 double s = log2 ( 1 + (
740 pow (10, minSinr / 10 ) /
741 ( (-log (5.0 * 0.00005 )) / 1.5) ));
760 rbAllocated += rbPerFlow;
762 for (
int i = 0; i < rbPerFlow; i++)
764 rbgAllocationMap.push_back ((*it).first);
768 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);
823 std::map <uint16_t,uint32_t>::iterator it;
825 for (
unsigned int i = 0; i < params.
m_macCeList.size (); i++)
837 uint8_t bsrId = params.
m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0);
839 m_ceBsrRxed.insert ( std::pair<uint16_t, uint32_t > (rnti, buffer));
859 std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
860 std::map <uint16_t, std::vector <double> >::iterator itCqi;
864 NS_LOG_DEBUG (
this <<
" Does not find info on allocation");
867 for (uint32_t i = 0; i < (*itMap).second.size (); i++)
872 itCqi =
m_ueCqi.find ((*itMap).second.at (i));
876 std::vector <double> newCqi;
881 newCqi.push_back (sinr);
886 newCqi.push_back (30.0);
890 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > ((*itMap).second.at (i), newCqi));
897 (*itCqi).second.at (i) = sinr;
899 std::map <uint16_t, uint32_t>::iterator itTimers;
917 std::map <uint16_t,uint32_t>::iterator itP10 =
m_p10CqiTimers.begin ();
921 if ((*itP10).second == 0)
924 std::map <uint16_t,uint8_t>::iterator itMap =
m_p10CqiRxed.find ((*itP10).first);
926 NS_LOG_INFO (
this <<
" P10-CQI exired for user " << (*itP10).first);
928 std::map <uint16_t,uint32_t>::iterator temp = itP10;
947 std::map <uint16_t,uint32_t>::iterator itUl =
m_ueCqiTimers.begin ();
951 if ((*itUl).second == 0)
954 std::map <uint16_t, std::vector <double> >::iterator itMap =
m_ueCqi.find ((*itUl).first);
955 NS_ASSERT_MSG (itMap !=
m_ueCqi.end (),
" Does not find CQI report for user " << (*itUl).first);
956 NS_LOG_INFO (
this <<
" UL-CQI exired for user " << (*itUl).first);
957 (*itMap).second.clear ();
959 std::map <uint16_t,uint32_t>::iterator temp = itUl;
977 std::list<FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
980 if (((*it).m_rnti == rnti) && ((*it).m_logicalChannelIdentity))
985 if ((*it).m_rlcStatusPduSize <= size)
987 size -= (*it).m_rlcStatusPduSize;
988 (*it).m_rlcStatusPduSize = 0;
992 (*it).m_rlcStatusPduSize -= size;
996 if ((*it).m_rlcRetransmissionQueueSize <= size)
998 size -= (*it).m_rlcRetransmissionQueueSize;
999 (*it).m_rlcRetransmissionQueueSize = 0;
1003 (*it).m_rlcRetransmissionQueueSize -= size;
1007 if ((*it).m_rlcTransmissionQueueSize <= size)
1009 size -= (*it).m_rlcTransmissionQueueSize;
1010 (*it).m_rlcTransmissionQueueSize = 0;
1014 (*it).m_rlcTransmissionQueueSize -= size;
1027 std::map <uint16_t,uint32_t>::iterator it =
m_ceBsrRxed.find (rnti);
1031 if ((*it).second >= size)
1033 (*it).second -= size;
1042 NS_LOG_ERROR (
this <<
" Does not find BSR report info of UE " << rnti);
1051 NS_LOG_FUNCTION (
this <<
" RNTI " << rnti <<
" txMode " << (uint16_t)txMode);