22 #include <ns3/pointer.h> 
   25 #include <ns3/simulator.h> 
   26 #include <ns3/lte-amc.h> 
   27 #include <ns3/pf-ff-mac-scheduler.h> 
   28 #include <ns3/lte-vendor-specific-parameters.h> 
  138   : m_scheduler (scheduler)
 
  213   :   m_cschedSapUser (0),
 
  218   m_amc = CreateObject <LteAmc> ();
 
  241     .AddConstructor<PfFfMacScheduler> ()
 
  242     .AddAttribute (
"CqiTimerThreshold",
 
  243                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
 
  246                    MakeUintegerChecker<uint32_t> ())
 
  310   std::map <uint16_t, pfsFlowPerf_t>::iterator it;
 
  362   std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
 
  370       m_rlcBufferReq.insert (std::pair <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters> (flow, params));
 
  374       (*it).second = params;
 
  399   for (
int i = 0; i < 4; i++)
 
  414   std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
 
  418       if (((*it).first.m_rnti == rnti) && (((*it).second.m_rlcTransmissionQueueSize > 0)
 
  419                                            || ((*it).second.m_rlcRetransmissionQueueSize > 0)
 
  420                                            || ((*it).second.m_rlcStatusPduSize > 0) ))
 
  424       if ((*it).first.m_rnti > rnti)
 
  449   std::map <uint16_t, std::vector <uint16_t> > allocationMap;
 
  450   for (
int i = 0; i < rbgNum; i++)
 
  453       std::map <uint16_t, pfsFlowPerf_t>::iterator it;
 
  454       std::map <uint16_t, pfsFlowPerf_t>::iterator itMax = 
m_flowStatsDl.end ();
 
  455       double rcqiMax = 0.0;
 
  458           std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
 
  460           std::map <uint16_t,uint8_t>::iterator itTxMode;
 
  464               NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
 
  467           std::vector <uint8_t> sbCqi;
 
  471               for (uint8_t k = 0; k < nLayer; k++)
 
  478               sbCqi = (*itCqi).second.m_higherLayerSelected.at (i).m_sbCqi;
 
  481           uint8_t cqi1 = sbCqi.at(0);
 
  483           if (sbCqi.size () > 1)
 
  488           if ((cqi1 > 0)||(cqi2 > 0)) 
 
  494                   double achievableRate = 0.0;
 
  495                   for (uint8_t k = 0; k < nLayer; k++) 
 
  498                       if (sbCqi.size () > k)
 
  510                   double rcqi = achievableRate / (*it).second.lastAveragedThroughput;
 
  529           std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
 
  530           itMap = allocationMap.find ((*itMax).first);
 
  531           if (itMap == allocationMap.end ())
 
  534               std::vector <uint16_t> tempMap;
 
  535               tempMap.push_back (i);
 
  536               allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax).first, tempMap));
 
  540               (*itMap).second.push_back (i);
 
  547   std::map <uint16_t, pfsFlowPerf_t>::iterator itStats;
 
  550       (*itStats).second.lastTtiBytesTrasmitted = 0;
 
  556   std::map <uint16_t, std::vector <uint16_t> >::iterator itMap = allocationMap.begin ();
 
  557   while (itMap != allocationMap.end ())
 
  561       newEl.
m_rnti = (*itMap).first;
 
  564       std::vector <struct RlcPduListElement_s> newRlcPduLe;
 
  565       newDci.
m_rnti = (*itMap).first;
 
  569       uint16_t RgbPerRnti = (*itMap).second.size ();
 
  570       std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
 
  572       std::map <uint16_t,uint8_t>::iterator itTxMode;
 
  576           NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*itMap).first);
 
  579       std::vector <uint8_t> worstCqi (2, 15);
 
  582           for (uint16_t k = 0; k < (*itMap).second.size (); k++)
 
  584               if ((*itCqi).second.m_higherLayerSelected.size () > (*itMap).second.at (k))
 
  587                   for (uint8_t j = 0; j < nLayer; j++) 
 
  589                       if ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.size ()> j)
 
  591                           if (((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j)) < worstCqi.at (j))
 
  593                               worstCqi.at (j) = ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j));
 
  605                   for (uint8_t j = 0; j < nLayer; j++)
 
  614           for (uint8_t j = 0; j < nLayer; j++)
 
  620       uint32_t bytesTxed = 0;
 
  621       for (uint8_t j = 0; j < nLayer; j++)
 
  632       uint32_t rbgMask = 0;
 
  633       for (uint16_t k = 0; k < (*itMap).second.size (); k++)
 
  635           rbgMask = rbgMask + (0x1 << (*itMap).second.at (k));
 
  641       std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator itBufReq;
 
  644           if (((*itBufReq).first.m_rnti == (*itMap).first) &&
 
  645             (((*itBufReq).second.m_rlcTransmissionQueueSize > 0)
 
  646               || ((*itBufReq).second.m_rlcRetransmissionQueueSize > 0)
 
  647               || ((*itBufReq).second.m_rlcStatusPduSize > 0) ))
 
  649               for (uint8_t j = 0; j < nLayer; j++)
 
  655                   newRlcPduLe.push_back (newRlcEl);
 
  659           if ((*itBufReq).first.m_rnti > (*itMap).first)
 
  664       newDci.
m_ndi.push_back (1); 
 
  665       newDci.
m_rv.push_back (0); 
 
  667       newEl.
m_dci = newDci;
 
  674       std::map <uint16_t, pfsFlowPerf_t>::iterator it;
 
  678           (*it).second.lastTtiBytesTrasmitted = bytesTxed;
 
  685           NS_LOG_DEBUG (
this << 
" No Stats for this allocated UE");
 
  696       (*itStats).second.totalBytesTransmitted += (*itStats).second.lastTtiBytesTrasmitted;
 
  698       (*itStats).second.lastAveragedThroughput = ((1.0 - (1.0 / 
m_timeWindow)) * (*itStats).second.lastAveragedThroughput) + ((1.0 / 
m_timeWindow) * (double)((*itStats).second.lastTtiBytesTrasmitted / 0.001));
 
  701       (*itStats).second.lastTtiBytesTrasmitted = 0;
 
  723   for (
unsigned int i = 0; i < params.
m_cqiList.size (); i++)
 
  728           std::map <uint16_t,uint8_t>::iterator it;
 
  729           uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
 
  734               m_p10CqiRxed.insert ( std::pair<uint16_t, uint8_t > (rnti, params.
m_cqiList.at (i).m_wbCqi.at (0)) ); 
 
  741               (*it).second = params.
m_cqiList.at (i).m_wbCqi.at (0);
 
  743               std::map <uint16_t,uint32_t>::iterator itTimers;
 
  751           std::map <uint16_t,SbMeasResult_s>::iterator it;
 
  752           uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
 
  757               m_a30CqiRxed.insert ( std::pair<uint16_t, SbMeasResult_s > (rnti, params.
m_cqiList.at (i).m_sbMeasResult) );
 
  763               (*it).second = params.
m_cqiList.at (i).m_sbMeasResult;
 
  764               std::map <uint16_t,uint32_t>::iterator itTimers;
 
  782   std::map <uint16_t, std::vector <double> >::iterator itCqi = 
m_ueCqi.find (rnti);
 
  796           double sinr = (*itCqi).second.at (i);
 
  803       double estimatedSinr = sinrSum / (double)sinrNum;
 
  805       (*itCqi).second.at (rb) = estimatedSinr;
 
  806       return (estimatedSinr);
 
  817   std::map <uint16_t,uint32_t>::iterator it; 
 
  823       if ((*it).second > 0)
 
  844   std::vector <uint16_t> rbgAllocationMap;
 
  845   std::map <uint16_t, pfsFlowPerf_t>::iterator itStats;
 
  874       uldci.
m_rnti = (*it).first;
 
  877       std::map <uint16_t, std::vector <double> >::iterator itCqi = 
m_ueCqi.find ((*it).first);
 
  888           double minSinr = (*itCqi).second.at (uldci.
m_rbStart);
 
  896               double sinr = (*itCqi).second.at (i);
 
  901               if ((*itCqi).second.at (i) < minSinr)
 
  903                   minSinr = (*itCqi).second.at (i);
 
  908           double s = log2 ( 1 + (
 
  909                                  std::pow (10, minSinr / 10 )  /
 
  910                                  ( (-std::log (5.0 * 0.00005 )) / 1.5) ));
 
  927       rbAllocated += rbPerFlow;
 
  929       for (
int i = 0; i < rbPerFlow; i++)
 
  931           rbgAllocationMap.push_back ((*it).first);
 
  934       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);
 
  954           (*itStats).second.lastTtiBytesTrasmitted =  uldci.
m_tbSize;
 
  961           NS_LOG_DEBUG (
this << 
" No Stats for this allocated UE");
 
  985       (*itStats).second.totalBytesTransmitted += (*itStats).second.lastTtiBytesTrasmitted;
 
  987       (*itStats).second.lastAveragedThroughput = ((1.0 - (1.0 / 
m_timeWindow)) * (*itStats).second.lastAveragedThroughput) + ((1.0 / 
m_timeWindow) * (double)((*itStats).second.lastTtiBytesTrasmitted / 0.001));
 
  990       (*itStats).second.lastTtiBytesTrasmitted = 0;
 
 1018   std::map <uint16_t,uint32_t>::iterator it;
 
 1020   for (
unsigned int i = 0; i < params.
m_macCeList.size (); i++)
 
 1032         uint8_t bsrId = params.
m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0);
 
 1034         m_ceBsrRxed.insert ( std::pair<uint16_t, uint32_t > (rnti, buffer)); 
 
 1083         std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
 
 1084         std::map <uint16_t, std::vector <double> >::iterator itCqi;
 
 1091         for (uint32_t i = 0; i < (*itMap).second.size (); i++)
 
 1097             itCqi = 
m_ueCqi.find ((*itMap).second.at (i));
 
 1101                 std::vector <double> newCqi;
 
 1106                         newCqi.push_back (sinr);
 
 1115                 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > ((*itMap).second.at (i), newCqi));
 
 1122                 (*itCqi).second.at (i) = sinr;
 
 1124                 std::map <uint16_t, uint32_t>::iterator itTimers;
 
 1145                 rnti = vsp->GetRnti ();
 
 1148         std::map <uint16_t, std::vector <double> >::iterator itCqi;
 
 1153             std::vector <double> newCqi;
 
 1157               newCqi.push_back (sinr);
 
 1158               NS_LOG_DEBUG (
this << 
" RNTI " << rnti << 
" new SRS-CQI for RB  " << j << 
" value " << sinr);
 
 1161             m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > (rnti, newCqi));
 
 1171               (*itCqi).second.at (j) = sinr;
 
 1172               NS_LOG_DEBUG (
this << 
" RNTI " << rnti << 
" update SRS-CQI for RB  " << j << 
" value " << sinr);
 
 1175           std::map <uint16_t, uint32_t>::iterator itTimers;
 
 1188         NS_FATAL_ERROR (
"PfFfMacScheduler supports only PUSCH and SRS UL-CQIs");
 
 1201   std::map <uint16_t,uint32_t>::iterator itP10 = 
m_p10CqiTimers.begin ();
 
 1205       if ((*itP10).second == 0)
 
 1208           std::map <uint16_t,uint8_t>::iterator itMap = 
m_p10CqiRxed.find ((*itP10).first);
 
 1210           NS_LOG_INFO (
this << 
" P10-CQI exired for user " << (*itP10).first);
 
 1212           std::map <uint16_t,uint32_t>::iterator temp = itP10;
 
 1224   std::map <uint16_t,uint32_t>::iterator itA30 = 
m_a30CqiTimers.begin ();
 
 1228       if ((*itA30).second == 0)
 
 1231           std::map <uint16_t,SbMeasResult_s>::iterator itMap = 
m_a30CqiRxed.find ((*itA30).first);
 
 1233           NS_LOG_INFO (
this << 
" A30-CQI exired for user " << (*itA30).first);
 
 1235           std::map <uint16_t,uint32_t>::iterator temp = itA30;
 
 1254   std::map <uint16_t,uint32_t>::iterator itUl = 
m_ueCqiTimers.begin ();
 
 1258       if ((*itUl).second == 0)
 
 1261           std::map <uint16_t, std::vector <double> >::iterator itMap = 
m_ueCqi.find ((*itUl).first);
 
 1262           NS_ASSERT_MSG (itMap != 
m_ueCqi.end (), 
" Does not find CQI report for user " << (*itUl).first);
 
 1263           NS_LOG_INFO (
this << 
" UL-CQI exired for user " << (*itUl).first);
 
 1264           (*itMap).second.clear ();
 
 1266           std::map <uint16_t,uint32_t>::iterator temp = itUl;
 
 1284   std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
 
 1292       if ((*it).second.m_rlcStatusPduSize <= size)
 
 1294           size -= (*it).second.m_rlcStatusPduSize;
 
 1295           (*it).second.m_rlcStatusPduSize = 0;
 
 1299           (*it).second.m_rlcStatusPduSize -= size;
 
 1303       if ((*it).second.m_rlcRetransmissionQueueSize <= size)
 
 1305           size -= (*it).second.m_rlcRetransmissionQueueSize;
 
 1306           (*it).second.m_rlcRetransmissionQueueSize = 0;
 
 1310           (*it).second.m_rlcRetransmissionQueueSize -= size;
 
 1314       if ((*it).second.m_rlcTransmissionQueueSize <= size)
 
 1316           size -= (*it).second.m_rlcTransmissionQueueSize;
 
 1317           (*it).second.m_rlcTransmissionQueueSize = 0;
 
 1321           (*it).second.m_rlcTransmissionQueueSize -= size;
 
 1327       NS_LOG_ERROR (
this << 
" Does not find DL RLC Buffer Report of UE " << rnti);
 
 1336   std::map <uint16_t,uint32_t>::iterator it = 
m_ceBsrRxed.find (rnti);
 
 1340       if ((*it).second >= size)
 
 1342           (*it).second -= size;
 
 1351       NS_LOG_ERROR (
this << 
" Does not find BSR report info of UE " << rnti);
 
 1359   NS_LOG_FUNCTION (
this << 
" RNTI " << rnti << 
" txMode " << (uint16_t)txMode);