23 #include <ns3/pointer.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> 
   30 #include <ns3/boolean.h> 
   31 #include <ns3/integer.h> 
   53   :   m_cschedSapUser (0),
 
   58   m_amc = CreateObject <LteAmc> ();
 
   93     .AddAttribute (
"CqiTimerThreshold",
 
   94                    "The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
 
   97                    MakeUintegerChecker<uint32_t> ())
 
   98     .AddAttribute (
"DebtLimit",
 
   99                    "Flow debt limit (default -625000 bytes)",
 
  102                    MakeIntegerChecker<int> ())
 
  103     .AddAttribute (
"CreditLimit",
 
  104                    "Flow credit limit (default 625000 bytes)",
 
  107                    MakeUintegerChecker<uint32_t> ())
 
  108     .AddAttribute (
"TokenPoolSize",
 
  109                    "The maximum value of flow token pool (default 1 bytes)",
 
  112                    MakeUintegerChecker<uint32_t> ())
 
  113     .AddAttribute (
"CreditableThreshold",
 
  114                    "Threshold of flow credit (default 0 bytes)",
 
  117                    MakeUintegerChecker<uint32_t> ())
 
  119     .AddAttribute (
"HarqEnabled",
 
  120                    "Activate/Deactivate the HARQ [by default is active].",
 
  124     .AddAttribute (
"UlGrantMcs",
 
  125                    "The MCS of the UL grant, must be [0..15] (default 0)",
 
  128                    MakeUintegerChecker<uint8_t> ())
 
  195       dlHarqPrcStatus.resize (8,0);
 
  198       dlHarqProcessesTimer.resize (8,0);
 
  201       dlHarqdci.resize (8);
 
  204       dlHarqRlcPdu.resize (2);
 
  205       dlHarqRlcPdu.at (0).resize (8);
 
  206       dlHarqRlcPdu.at (1).resize (8);
 
  210       ulHarqPrcStatus.resize (8,0);
 
  213       ulHarqdci.resize (8);
 
  228   std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator it;
 
  248           m_flowStatsDl.insert (std::pair<uint16_t, fdtbfqsFlowPerf_t> (params.
m_rnti, flowStatsDl));
 
  259           m_flowStatsUl.insert (std::pair<uint16_t, fdtbfqsFlowPerf_t> (params.
m_rnti, flowStatsUl));
 
  266           m_flowStatsDl[(*it).first].tokenGenerationRate =  mbrDlInBytes;
 
  267           m_flowStatsUl[(*it).first].tokenGenerationRate =  mbrUlInBytes;
 
  281       std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it = 
m_rlcBufferReq.begin ();
 
  282       std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
 
  317   std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it = 
m_rlcBufferReq.begin ();
 
  318   std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator temp;
 
  321       if ((*it).first.m_rnti == params.
m_rnti)
 
  347   std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
 
  355       m_rlcBufferReq.insert (std::pair <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters> (flow, params));
 
  359       (*it).second = params;
 
  384   for (
int i = 0; i < 4; i++)
 
  386       if (dlbandwidth < FdTbfqType0AllocationRbg[i])
 
  399   std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
 
  400   unsigned int lcActive = 0;
 
  403       if (((*it).first.m_rnti == rnti) && (((*it).second.m_rlcTransmissionQueueSize > 0)
 
  404                                            || ((*it).second.m_rlcRetransmissionQueueSize > 0)
 
  405                                            || ((*it).second.m_rlcStatusPduSize > 0) ))
 
  409       if ((*it).first.m_rnti > rnti)
 
  432       NS_FATAL_ERROR (
"No Process Id Statusfound for this RNTI " << rnti);
 
  434   uint8_t i = (*it).second;
 
  439   while ( ((*itStat).second.at (i) != 0)&&(i != (*it).second));
 
  440   if ((*itStat).second.at (i) == 0)
 
  471       NS_FATAL_ERROR (
"No Process Id Statusfound for this RNTI " << rnti);
 
  473   uint8_t i = (*it).second;
 
  478   while ( ((*itStat).second.at (i) != 0)&&(i != (*it).second));
 
  479   if ((*itStat).second.at (i) == 0)
 
  482       (*itStat).second.at (i) = 1;
 
  486       NS_FATAL_ERROR (
"No HARQ process available for RNTI " << rnti << 
" check before update with HarqProcessAvailability");
 
  489   return ((*it).second);
 
  498   std::map <uint16_t, DlHarqProcessesTimer_t>::iterator itTimers;
 
  507               NS_LOG_DEBUG (
this << 
" Reset HARQ proc " << i << 
" for RNTI " << (*itTimers).first);
 
  508               std::map <uint16_t, DlHarqProcessesStatus_t>::iterator itStat = 
m_dlHarqProcessesStatus.find ((*itTimers).first);
 
  511                   NS_FATAL_ERROR (
"No Process Id Status found for this RNTI " << (*itTimers).first);
 
  513               (*itStat).second.at (i) = 0;
 
  514               (*itTimers).second.at (i) = 0;
 
  518               (*itTimers).second.at (i)++;
 
  541   std::map <uint16_t, std::vector <uint16_t> > allocationMap; 
 
  542   std::vector <bool> rbgMap;  
 
  543   uint16_t rbgAllocatedNum = 0;
 
  544   std::set <uint16_t> rntiAllocated;
 
  548   for (std::vector<bool>::iterator it = rbgMap.begin (); it != rbgMap.end (); it++)
 
  559   std::map <uint16_t, uint8_t>::iterator itProcId;
 
  562       (*itProcId).second = ((*itProcId).second + 1) % 
HARQ_PROC_NUM;
 
  566   uint16_t rbAllocatedNum = 0;
 
  567   std::vector <bool> ulRbMap;
 
  570   uint8_t maxContinuousUlBandwidth = 0;
 
  571   uint8_t tmpMinBandwidth = 0;
 
  572   uint16_t ffrRbStartOffset = 0;
 
  573   uint16_t tmpFfrRbStartOffset = 0;
 
  576   for (std::vector<bool>::iterator it = ulRbMap.begin (); it != ulRbMap.end (); it++)
 
  581           if (tmpMinBandwidth > maxContinuousUlBandwidth)
 
  583               maxContinuousUlBandwidth = tmpMinBandwidth;
 
  584               ffrRbStartOffset = tmpFfrRbStartOffset;
 
  590           if (tmpMinBandwidth == 0)
 
  592               tmpFfrRbStartOffset = index;
 
  599   if (tmpMinBandwidth > maxContinuousUlBandwidth)
 
  601       maxContinuousUlBandwidth = tmpMinBandwidth;
 
  602       ffrRbStartOffset = tmpFfrRbStartOffset;
 
  606   uint16_t rbStart = 0;
 
  607   rbStart = ffrRbStartOffset;
 
  608   std::vector <struct RachListElement_s>::iterator itRach;
 
  613       newRar.
m_rnti = (*itRach).m_rnti;
 
  617       newRar.m_grant.m_rnti = newRar.m_rnti;
 
  620       uint16_t tbSizeBits = 0;
 
  622       while ((tbSizeBits < (*itRach).m_estimatedSize) && (rbStart + rbLen < (ffrRbStartOffset + maxContinuousUlBandwidth)))
 
  627       if (tbSizeBits < (*itRach).m_estimatedSize)
 
  632       newRar.m_grant.m_rbStart = rbStart;
 
  633       newRar.m_grant.m_rbLen = rbLen;
 
  634       newRar.m_grant.m_tbSize = tbSizeBits / 8;
 
  635       newRar.m_grant.m_hopping = 
false;
 
  636       newRar.m_grant.m_tpc = 0;
 
  637       newRar.m_grant.m_cqiRequest = 
false;
 
  638       newRar.m_grant.m_ulDelay = 
false;
 
  639       NS_LOG_INFO (
this << 
" UL grant allocated to RNTI " << (*itRach).m_rnti << 
" rbStart " << rbStart << 
" rbLen " << rbLen << 
" MCS " << 
m_ulGrantMcs << 
" tbSize " << newRar.m_grant.m_tbSize);
 
  640       for (uint16_t i = rbStart; i < rbStart + rbLen; i++)
 
  649           uldci.
m_rnti = newRar.m_rnti;
 
  668           std::map <uint16_t, uint8_t>::iterator itProcId;
 
  674           harqId = (*itProcId).second;
 
  680           (*itDci).second.at (harqId) = uldci;
 
  683       rbStart = rbStart + rbLen;
 
  696           NS_LOG_INFO (
this << 
" Received DL-HARQ feedback");
 
  712   std::vector <struct DlInfoListElement_s> dlInfoListUntxed;
 
  716       if (itRnti != rntiAllocated.end ())
 
  722       std::vector <bool> retx;
 
  723       NS_LOG_INFO (
this << 
" Processing DLHARQ feedback");
 
  727           retx.push_back (
false);
 
  734       if (retx.at (0) || retx.at (1))
 
  739           NS_LOG_INFO (
this << 
" HARQ retx RNTI " << rnti << 
" harqId " << (uint16_t)harqId);
 
  748           if (dci.
m_rv.size () == 1)
 
  750               rv = dci.
m_rv.at (0);
 
  754               rv = (dci.
m_rv.at (0) > dci.
m_rv.at (1) ? dci.
m_rv.at (0) : dci.
m_rv.at (1));
 
  760               NS_LOG_INFO (
"Maximum number of retransmissions reached -> drop process");
 
  766               (*it).second.at (harqId) = 0;
 
  772               for (uint16_t k = 0; k < (*itRlcPdu).second.size (); k++)
 
  774                   (*itRlcPdu).second.at (k).at (harqId).clear ();
 
  780           std::vector <int> dciRbg;
 
  783           for (
int j = 0; j < 32; j++)
 
  787                   dciRbg.push_back (j);
 
  793           for (uint8_t j = 0; j < dciRbg.size (); j++)
 
  795               if (rbgMap.at (dciRbg.at (j)) == 
true)
 
  805               for (uint8_t j = 0; j < dciRbg.size (); j++)
 
  807                   rbgMap.at (dciRbg.at (j)) = 
true;
 
  808                   NS_LOG_INFO (
"RBG " << dciRbg.at (j) << 
" assigned");
 
  812               NS_LOG_INFO (
this << 
" Send retx in the same RBGs");
 
  818               uint8_t rbgId = (dciRbg.at (dciRbg.size () - 1) + 1) % rbgNum;
 
  819               uint8_t startRbg = dciRbg.at (dciRbg.size () - 1);
 
  820               std::vector <bool> rbgMapCopy = rbgMap;
 
  821               while ((j < dciRbg.size ())&&(startRbg != rbgId))
 
  823                   if (rbgMapCopy.at (rbgId) == 
false)
 
  825                       rbgMapCopy.at (rbgId) = 
true;
 
  826                       dciRbg.at (j) = rbgId;
 
  829                   rbgId = (rbgId + 1) % rbgNum;
 
  831               if (j == dciRbg.size ())
 
  834                   uint32_t rbgMask = 0;
 
  835                   for (uint16_t k = 0; k < dciRbg.size (); k++)
 
  837                       rbgMask = rbgMask + (0x1 << dciRbg.at (k));
 
  842                   NS_LOG_INFO (
this << 
" Move retx in RBGs " << dciRbg.size ());
 
  848                   NS_LOG_INFO (
this << 
" No resource for this retx -> buffer it");
 
  856               NS_FATAL_ERROR (
"Unable to find RlcPdcList in HARQ buffer for RNTI " << rnti);
 
  858           for (uint8_t j = 0; j < nLayers; j++)
 
  862                   if (j >= dci.
m_ndi.size ())
 
  865                       dci.
m_ndi.push_back (0);
 
  866                       dci.
m_rv.push_back (0);
 
  867                       dci.
m_mcs.push_back (0);
 
  869                       NS_LOG_INFO (
this << 
" layer " << (uint16_t)j << 
" no txed (MIMO transition)");
 
  873                       dci.
m_ndi.at (j) = 0;
 
  875                       (*itHarq).second.at (harqId).m_rv.at (j)++;
 
  876                       NS_LOG_INFO (
this << 
" layer " << (uint16_t)j << 
" RV " << (uint16_t)dci.
m_rv.at (j));
 
  882                   dci.
m_ndi.at (j) = 0;
 
  884                   dci.
m_mcs.at (j) = 0;
 
  886                   NS_LOG_INFO (
this << 
" layer " << (uint16_t)j << 
" no retx");
 
  889           for (uint16_t k = 0; k < (*itRlcPdu).second.at (0).at (dci.
m_harqProcess).size (); k++)
 
  891               std::vector <struct RlcPduListElement_s> rlcPduListPerLc;
 
  892               for (uint8_t j = 0; j < nLayers; j++)
 
  896                       if (j < dci.
m_ndi.size ())
 
  899                           rlcPduListPerLc.push_back ((*itRlcPdu).second.at (j).at (dci.
m_harqProcess).at (k));
 
  907                       emptyElement.m_size = 0;
 
  908                       rlcPduListPerLc.push_back (emptyElement);
 
  912               if (rlcPduListPerLc.size () > 0)
 
  919           (*itHarq).second.at (harqId).
m_rv = dci.
m_rv;
 
  924               NS_FATAL_ERROR (
"Unable to find HARQ timer for RNTI " << (uint16_t)rnti);
 
  926           (*itHarqTimer).second.at (harqId) = 0;
 
  928           rntiAllocated.insert (rnti);
 
  945           for (uint16_t k = 0; k < (*itRlcPdu).second.size (); k++)
 
  954   if (rbgAllocatedNum == rbgNum)
 
  965   std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator itStats;
 
  968       if ( (*itStats).second.tokenGenerationRate / 1000 +  (*itStats).second.tokenPoolSize > (*itStats).second.maxTokenPoolSize )     
 
  970           (*itStats).second.counter +=  (*itStats).second.tokenGenerationRate / 1000 - ( (*itStats).second.maxTokenPoolSize -  (*itStats).second.tokenPoolSize );
 
  971           (*itStats).second.tokenPoolSize = (*itStats).second.maxTokenPoolSize;
 
  972           bankSize += (*itStats).second.tokenGenerationRate / 1000 - ( (*itStats).second.maxTokenPoolSize -  (*itStats).second.tokenPoolSize );
 
  976           (*itStats).second.tokenPoolSize += (*itStats).second.tokenGenerationRate / 1000;
 
  980   std::set <uint16_t> allocatedRnti;   
 
  981   std::set <uint8_t> allocatedRbg;  
 
  984   while (totalRbg < rbgNum)
 
  987       std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator it;
 
  988       std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator itMax = 
m_flowStatsDl.end ();
 
  989       double metricMax = 0.0;
 
  990       bool firstRnti = 
true;
 
  993           std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
 
  997               if (itRnti != rntiAllocated.end ())
 
  999                   NS_LOG_DEBUG (
this << 
" RNTI discared for HARQ tx" << (uint16_t)(*it).first);
 
 1003                   NS_LOG_DEBUG (
this << 
" RNTI discared for HARQ id" << (uint16_t)(*it).first);
 
 1008           std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
 
 1010           std::map <uint16_t,uint8_t>::iterator itTxMode;
 
 1014               NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
 
 1019           for (
int k = 0; k < rbgNum; k++)
 
 1021               for (uint8_t j = 0; j < nLayer; j++)
 
 1029                       cqiSum += (*itCqi).second.m_higherLayerSelected.at (k).m_sbCqi.at(j);
 
 1036               NS_LOG_INFO (
"Skip this flow, CQI==0, rnti:"<<(*it).first);
 
 1045           std::set <uint16_t>::iterator rnti;
 
 1046           rnti = allocatedRnti.find((*it).first);
 
 1047           if (rnti != allocatedRnti.end ())  
 
 1052           double metric = ( ( (double)(*it).second.counter ) / ( (double)(*it).second.tokenGenerationRate ) );
 
 1054           if (firstRnti == 
true)
 
 1061          if (metric > metricMax)
 
 1075       allocatedRnti.insert((*itMax).first);
 
 1078       uint32_t budget = 0;
 
 1081           budget = (*itMax).second.counter - (*itMax).second.debtLimit;
 
 1082           if ( budget > (*itMax).second.burstCredit )
 
 1083             budget = (*itMax).second.burstCredit;
 
 1087       budget = budget + (*itMax).second.tokenPoolSize;
 
 1098           uint32_t rlcBufSize = 0;
 
 1100           std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator itRlcBuf;
 
 1103               if ( (*itRlcBuf).first.m_rnti == (*itMax).first )
 
 1104                 lcid = (*itRlcBuf).first.m_lcId;
 
 1109             rlcBufSize = (*itRlcBuf).second.m_rlcTransmissionQueueSize + (*itRlcBuf).second.m_rlcRetransmissionQueueSize + (*itRlcBuf).second.m_rlcStatusPduSize;
 
 1110           if ( budget > rlcBufSize )
 
 1111             budget = rlcBufSize;
 
 1115       uint32_t bytesTxed = 0;
 
 1116       uint32_t bytesTxedTmp = 0;
 
 1118       while ( bytesTxed <= budget )
 
 1122           std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
 
 1124           std::map <uint16_t,uint8_t>::iterator itTxMode;
 
 1128               NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*it).first);
 
 1133           double achievableRateMax = 0.0;
 
 1135           for (
int k = 0; k < rbgNum; k++)
 
 1137               std::set <uint8_t>::iterator rbg;
 
 1138               rbg = allocatedRbg.find (k);
 
 1139               if (rbg != allocatedRbg.end ())  
 
 1142               if ( rbgMap.at (k) == 
true) 
 
 1148               std::vector <uint8_t> sbCqi;
 
 1151                   for (uint8_t k = 0; k < nLayer; k++)
 
 1153                       sbCqi.push_back (1);  
 
 1158                   sbCqi = (*itCqi).second.m_higherLayerSelected.at (k).m_sbCqi;
 
 1160               uint8_t cqi1 = sbCqi.at (0);
 
 1162               if (sbCqi.size () > 1)
 
 1164                   cqi2 = sbCqi.at (1);
 
 1167               if ((cqi1 > 0)||(cqi2 > 0)) 
 
 1172                   double achievableRate = 0.0;
 
 1173                       for (uint8_t j = 0; j < nLayer; j++) 
 
 1176                           if (sbCqi.size () > j)
 
 1178                               mcs = 
m_amc->GetMcsFromCqi (sbCqi.at (j));
 
 1185                           achievableRate += ((
m_amc->GetDlTbSizeFromMcs (mcs, rbgSize) / 8) / 0.001); 
 
 1188                       if ( achievableRate > achievableRateMax )
 
 1190                           achievableRateMax = achievableRate;
 
 1197           if ( rbgIndex == rbgNum)  
 
 1206               allocatedRbg.insert (rbgIndex);
 
 1210           std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
 
 1211           itMap = allocationMap.find ((*itMax).first);
 
 1212           uint16_t RbgPerRnti;
 
 1213           if (itMap == allocationMap.end ())
 
 1216               std::vector <uint16_t> tempMap;
 
 1217               tempMap.push_back (rbgIndex);
 
 1218               allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax).first, tempMap));
 
 1219               itMap = allocationMap.find ((*itMax).first);  
 
 1223               (*itMap).second.push_back (rbgIndex);
 
 1225           rbgMap.at (rbgIndex) = 
true;  
 
 1227           RbgPerRnti = (*itMap).second.size();
 
 1230           std::vector <uint8_t> worstCqi (2, 15);
 
 1233               for (uint16_t k = 0; k < (*itMap).second.size (); k++)
 
 1235                   if ((*itCqi).second.m_higherLayerSelected.size () > (*itMap).second.at (k))
 
 1237                       for (uint8_t j = 0; j < nLayer; j++) 
 
 1239                           if ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.size () > j)
 
 1241                               if (((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j)) < worstCqi.at (j))
 
 1243                                   worstCqi.at (j) = ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j));
 
 1249                               worstCqi.at (j) = 1;
 
 1255                       for (uint8_t j = 0; j < nLayer; j++)
 
 1257                           worstCqi.at (j) = 1; 
 
 1264               for (uint8_t j = 0; j < nLayer; j++)
 
 1266                   worstCqi.at (j) = 1; 
 
 1270           bytesTxedTmp = bytesTxed;
 
 1272           for (uint8_t j = 0; j < nLayer; j++)
 
 1274               int tbSize = (
m_amc->GetDlTbSizeFromMcs (
m_amc->GetMcsFromCqi (worstCqi.at (j)), RbgPerRnti * rbgSize) / 8); 
 
 1275               bytesTxed += tbSize;
 
 1281       if ( bytesTxed > budget )
 
 1283           std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
 
 1284           itMap = allocationMap.find ((*itMax).first);
 
 1285           (*itMap).second.pop_back ();
 
 1286           allocatedRbg.erase (rbgIndex);
 
 1287           bytesTxed = bytesTxedTmp;  
 
 1289           rbgMap.at (rbgIndex) = 
false;  
 
 1293       if ( bytesTxed <= (*itMax).second.tokenPoolSize )
 
 1295           (*itMax).second.tokenPoolSize -= bytesTxed;
 
 1299           (*itMax).second.counter = (*itMax).second.counter - ( bytesTxed -  (*itMax).second.tokenPoolSize );
 
 1300           (*itMax).second.tokenPoolSize = 0;
 
 1301           if (
bankSize <= ( bytesTxed -  (*itMax).second.tokenPoolSize ))
 
 1310   std::map <uint16_t, std::vector <uint16_t> >::iterator itMap = allocationMap.begin ();
 
 1311   while (itMap != allocationMap.end ())
 
 1315       newEl.
m_rnti = (*itMap).first;
 
 1318       newDci.
m_rnti = (*itMap).first;
 
 1326           lcActives = (uint16_t)65535; 
 
 1328       uint16_t RgbPerRnti = (*itMap).second.size ();
 
 1329       std::map <uint16_t,SbMeasResult_s>::iterator itCqi;
 
 1331       std::map <uint16_t,uint8_t>::iterator itTxMode;
 
 1335           NS_FATAL_ERROR (
"No Transmission Mode info on user " << (*itMap).first);
 
 1338       std::vector <uint8_t> worstCqi (2, 15);
 
 1341           for (uint16_t k = 0; k < (*itMap).second.size (); k++)
 
 1343               if ((*itCqi).second.m_higherLayerSelected.size () > (*itMap).second.at (k))
 
 1345                   NS_LOG_INFO (
this << 
" RBG " << (*itMap).second.at (k) << 
" CQI " << (uint16_t)((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (0)) );
 
 1346                   for (uint8_t j = 0; j < nLayer; j++)
 
 1348                       if ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.size () > j)
 
 1350                           if (((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j)) < worstCqi.at (j))
 
 1352                               worstCqi.at (j) = ((*itCqi).second.m_higherLayerSelected.at ((*itMap).second.at (k)).m_sbCqi.at (j));
 
 1358                           worstCqi.at (j) = 1;
 
 1364                   for (uint8_t j = 0; j < nLayer; j++)
 
 1366                       worstCqi.at (j) = 1; 
 
 1373           for (uint8_t j = 0; j < nLayer; j++)
 
 1375               worstCqi.at (j) = 1; 
 
 1378       for (uint8_t j = 0; j < nLayer; j++)
 
 1380           NS_LOG_INFO (
this << 
" Layer " << (uint16_t)j << 
" CQI selected " << (uint16_t)worstCqi.at (j));
 
 1382       uint32_t bytesTxed = 0;
 
 1383       for (uint8_t j = 0; j < nLayer; j++)
 
 1385           newDci.
m_mcs.push_back (
m_amc->GetMcsFromCqi (worstCqi.at (j)));
 
 1386           int tbSize = (
m_amc->GetDlTbSizeFromMcs (newDci.
m_mcs.at (j), RgbPerRnti * rbgSize) / 8); 
 
 1388           NS_LOG_INFO (
this << 
" Layer " << (uint16_t)j << 
" MCS selected" << 
m_amc->GetMcsFromCqi (worstCqi.at (j)));
 
 1389           bytesTxed += tbSize;
 
 1394       uint32_t rbgMask = 0;
 
 1395       for (uint16_t k = 0; k < (*itMap).second.size (); k++)
 
 1397           rbgMask = rbgMask + (0x1 << (*itMap).second.at (k));
 
 1398           NS_LOG_INFO (
this << 
" Allocated RBG " << (*itMap).second.at (k));
 
 1403       std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator itBufReq;
 
 1406           if (((*itBufReq).first.m_rnti == (*itMap).first)
 
 1407               && (((*itBufReq).second.m_rlcTransmissionQueueSize > 0)
 
 1408                   || ((*itBufReq).second.m_rlcRetransmissionQueueSize > 0)
 
 1409                   || ((*itBufReq).second.m_rlcStatusPduSize > 0) ))
 
 1411               std::vector <struct RlcPduListElement_s> newRlcPduLe;
 
 1412               for (uint8_t j = 0; j < nLayer; j++)
 
 1418                   newRlcPduLe.push_back (newRlcEl);
 
 1426                           NS_FATAL_ERROR (
"Unable to find RlcPdcList in HARQ buffer for RNTI " << (*itMap).first);
 
 1428                       (*itRlcPdu).second.at (j).at (newDci.
m_harqProcess).push_back (newRlcEl);
 
 1433           if ((*itBufReq).first.m_rnti > (*itMap).first)
 
 1438       for (uint8_t j = 0; j < nLayer; j++)
 
 1440           newDci.
m_ndi.push_back (1);
 
 1441           newDci.
m_rv.push_back (0);
 
 1446       newEl.
m_dci = newDci;
 
 1496   for (
unsigned int i = 0; i < params.
m_cqiList.size (); i++)
 
 1501           std::map <uint16_t,uint8_t>::iterator it;
 
 1502           uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
 
 1507               m_p10CqiRxed.insert ( std::pair<uint16_t, uint8_t > (rnti, params.
m_cqiList.at (i).m_wbCqi.at (0)) ); 
 
 1514               (*it).second = params.
m_cqiList.at (i).m_wbCqi.at (0);
 
 1516               std::map <uint16_t,uint32_t>::iterator itTimers;
 
 1524           std::map <uint16_t,SbMeasResult_s>::iterator it;
 
 1525           uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
 
 1530               m_a30CqiRxed.insert ( std::pair<uint16_t, SbMeasResult_s > (rnti, params.
m_cqiList.at (i).m_sbMeasResult) );
 
 1536               (*it).second = params.
m_cqiList.at (i).m_sbMeasResult;
 
 1537               std::map <uint16_t,uint32_t>::iterator itTimers;
 
 1555   std::map <uint16_t, std::vector <double> >::iterator itCqi = 
m_ueCqi.find (rnti);
 
 1566       unsigned int sinrNum = 0;
 
 1569           double sinr = (*itCqi).second.at (i);
 
 1576       double estimatedSinr = (sinrNum > 0) ? (sinrSum / sinrNum) : DBL_MAX;
 
 1578       (*itCqi).second.at (rb) = estimatedSinr;
 
 1579       return (estimatedSinr);
 
 1593   std::vector <bool> rbMap;
 
 1594   uint16_t rbAllocatedNum = 0;
 
 1595   std::set <uint16_t> rntiAllocated;
 
 1596   std::vector <uint16_t> rbgAllocationMap;
 
 1607   for (std::vector<bool>::iterator it = rbMap.begin (); it != rbMap.end (); it++)
 
 1621       if (rbgAllocationMap.at (i) != 0)
 
 1623           rbMap.at (i) = 
true;
 
 1632       for (uint16_t i = 0; i < params.
m_ulInfoList.size (); i++)
 
 1641                   NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
 
 1644               NS_LOG_INFO (
this << 
" UL-HARQ retx RNTI " << rnti << 
" harqId " << (uint16_t)harqId << 
" i " << i << 
" size "  << params.
m_ulInfoList.size ());
 
 1648                   NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
 
 1655                   NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << rnti);
 
 1657               if ((*itStat).second.at (harqId) >= 3)
 
 1659                   NS_LOG_INFO (
"Max number of retransmissions reached (UL)-> drop process");
 
 1665                   if (rbMap.at (j) == 
true)
 
 1676                       rbMap.at (j) = 
true;
 
 1677                       rbgAllocationMap.at (j) = dci.
m_rnti;
 
 1685                   NS_LOG_INFO (
"Cannot allocate retx due to RACH allocations for UE " << rnti);
 
 1690               (*itStat).second.at ((*itProcId).second) = (*itStat).second.at (harqId) + 1;
 
 1691               (*itStat).second.at (harqId) = 0;
 
 1692               (*itHarq).second.at ((*itProcId).second) = dci;
 
 1694               rntiAllocated.insert (dci.
m_rnti);
 
 1703   std::map <uint16_t,uint32_t>::iterator it;
 
 1708       std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
 
 1710       if (((*it).second > 0)&&(itRnti == rntiAllocated.end ()))
 
 1729   uint16_t tempRbPerFlow = (ffrUlBandwidth) / (nflows + rntiAllocated.size ());
 
 1730   uint16_t rbPerFlow = (minContinuousUlBandwidth < tempRbPerFlow) ? minContinuousUlBandwidth : tempRbPerFlow;
 
 1736   int rbAllocated = 0;
 
 1738   std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator itStats;
 
 1760       std::set <uint16_t>::iterator itRnti = rntiAllocated.find ((*it).first);
 
 1761       if ((itRnti != rntiAllocated.end ())||((*it).second == 0))
 
 1764           NS_LOG_DEBUG (
this << 
" UE already allocated in HARQ -> discared, RNTI " << (*it).first);
 
 1787       uldci.
m_rnti = (*it).first;
 
 1789       bool allocated = 
false;
 
 1790       NS_LOG_INFO (
this << 
" RB Allocated " << rbAllocated << 
" rbPerFlow " << rbPerFlow << 
" flows " << nflows);
 
 1795           for (uint16_t j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
 
 1797               if (rbMap.at (j) == 
true)
 
 1810               NS_LOG_INFO (
this << 
"RNTI: "<< (*it).first<< 
" RB Allocated " << rbAllocated << 
" rbPerFlow " << rbPerFlow << 
" flows " << nflows);
 
 1813               for (uint16_t j = rbAllocated; j < rbAllocated + rbPerFlow; j++)
 
 1815                   rbMap.at (j) = 
true;
 
 1817                   rbgAllocationMap.at (j) = (*it).first;
 
 1819               rbAllocated += rbPerFlow;
 
 1851       std::map <uint16_t, std::vector <double> >::iterator itCqi = 
m_ueCqi.find ((*it).first);
 
 1861           double minSinr = (*itCqi).second.at (uldci.
m_rbStart);
 
 1868               double sinr = (*itCqi).second.at (i);
 
 1880           double s = log2 ( 1 + (
 
 1881                                  std::pow (10, minSinr / 10 )  /
 
 1882                                  ( (-std::log (5.0 * 0.00005 )) / 1.5) ));
 
 1883           cqi = 
m_amc->GetCqiFromSpectralEfficiency (s);
 
 1896                   rbgAllocationMap.at (i) = 0;
 
 1922           std::map <uint16_t, uint8_t>::iterator itProcId;
 
 1928           harqId = (*itProcId).second;
 
 1934           (*itDci).second.at (harqId) = uldci;
 
 1939               NS_LOG_ERROR (
"No info find in HARQ buffer for UE (might change eNB) " << uldci.
m_rnti);
 
 1941           (*itStat).second.at (harqId) = 0;
 
 1944       NS_LOG_INFO (
this << 
" UE Allocation RNTI " << (*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 << 
" harqId " << (uint16_t)harqId);
 
 1987   std::map <uint16_t,uint32_t>::iterator it;
 
 1989   for (
unsigned int i = 0; i < params.
m_macCeList.size (); i++)
 
 2000           uint32_t buffer = 0;
 
 2001           for (uint8_t lcg = 0; lcg < 4; ++lcg)
 
 2003               uint8_t bsrId = params.
m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (lcg);
 
 2008           NS_LOG_LOGIC (
this << 
"RNTI=" << rnti << 
" buffer=" << buffer);
 
 2013               m_ceBsrRxed.insert ( std::pair<uint16_t, uint32_t > (rnti, buffer));
 
 2018               (*it).second = buffer;
 
 2061         std::map <uint16_t, std::vector <uint16_t> >::iterator itMap;
 
 2062         std::map <uint16_t, std::vector <double> >::iterator itCqi;
 
 2063         NS_LOG_DEBUG (
this << 
" Collect PUSCH CQIs of Frame no. " << (params.
m_sfnSf >> 4) << 
" subframe no. " << (0xF & params.
m_sfnSf));
 
 2069         for (uint32_t i = 0; i < (*itMap).second.size (); i++)
 
 2073             itCqi = 
m_ueCqi.find ((*itMap).second.at (i));
 
 2077                 std::vector <double> newCqi;
 
 2082                         newCqi.push_back (sinr);
 
 2091                 m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > ((*itMap).second.at (i), newCqi));
 
 2098                 (*itCqi).second.at (i) = sinr;
 
 2099                 NS_LOG_DEBUG (
this << 
" RNTI " << (*itMap).second.at (i) << 
" RB " << i << 
" SINR " << sinr);
 
 2101                 std::map <uint16_t, uint32_t>::iterator itTimers;
 
 2122                 rnti = vsp->GetRnti ();
 
 2125         std::map <uint16_t, std::vector <double> >::iterator itCqi;
 
 2130             std::vector <double> newCqi;
 
 2134                 newCqi.push_back (sinr);
 
 2135                 NS_LOG_INFO (
this << 
" RNTI " << rnti << 
" new SRS-CQI for RB  " << j << 
" value " << sinr);
 
 2138             m_ueCqi.insert (std::pair <uint16_t, std::vector <double> > (rnti, newCqi));
 
 2148                 (*itCqi).second.at (j) = sinr;
 
 2149                 NS_LOG_INFO (
this << 
" RNTI " << rnti << 
" update SRS-CQI for RB  " << j << 
" value " << sinr);
 
 2152             std::map <uint16_t, uint32_t>::iterator itTimers;
 
 2165         NS_FATAL_ERROR (
"FdTbfqFfMacScheduler supports only PUSCH and SRS UL-CQIs");
 
 2178   std::map <uint16_t,uint32_t>::iterator itP10 = 
m_p10CqiTimers.begin ();
 
 2182       if ((*itP10).second == 0)
 
 2185           std::map <uint16_t,uint8_t>::iterator itMap = 
m_p10CqiRxed.find ((*itP10).first);
 
 2187           NS_LOG_INFO (
this << 
" P10-CQI expired for user " << (*itP10).first);
 
 2189           std::map <uint16_t,uint32_t>::iterator temp = itP10;
 
 2201   std::map <uint16_t,uint32_t>::iterator itA30 = 
m_a30CqiTimers.begin ();
 
 2205       if ((*itA30).second == 0)
 
 2208           std::map <uint16_t,SbMeasResult_s>::iterator itMap = 
m_a30CqiRxed.find ((*itA30).first);
 
 2210           NS_LOG_INFO (
this << 
" A30-CQI expired for user " << (*itA30).first);
 
 2212           std::map <uint16_t,uint32_t>::iterator temp = itA30;
 
 2231   std::map <uint16_t,uint32_t>::iterator itUl = 
m_ueCqiTimers.begin ();
 
 2235       if ((*itUl).second == 0)
 
 2238           std::map <uint16_t, std::vector <double> >::iterator itMap = 
m_ueCqi.find ((*itUl).first);
 
 2239           NS_ASSERT_MSG (itMap != 
m_ueCqi.end (), 
" Does not find CQI report for user " << (*itUl).first);
 
 2240           NS_LOG_INFO (
this << 
" UL-CQI exired for user " << (*itUl).first);
 
 2241           (*itMap).second.clear ();
 
 2243           std::map <uint16_t,uint32_t>::iterator temp = itUl;
 
 2260   std::map<LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
 
 2265       NS_LOG_INFO (
this << 
" UE " << rnti << 
" LC " << (uint16_t)lcid << 
" txqueue " << (*it).second.m_rlcTransmissionQueueSize << 
" retxqueue " << (*it).second.m_rlcRetransmissionQueueSize << 
" status " << (*it).second.m_rlcStatusPduSize << 
" decrease " << size);
 
 2268       if (((*it).second.m_rlcStatusPduSize > 0) && (size >= (*it).second.m_rlcStatusPduSize))
 
 2270            (*it).second.m_rlcStatusPduSize = 0;
 
 2272       else if (((*it).second.m_rlcRetransmissionQueueSize > 0) && (size >= (*it).second.m_rlcRetransmissionQueueSize))
 
 2274           (*it).second.m_rlcRetransmissionQueueSize = 0;
 
 2276       else if ((*it).second.m_rlcTransmissionQueueSize > 0)
 
 2278           uint32_t rlcOverhead;
 
 2293           if ((*it).second.m_rlcTransmissionQueueSize <= size - rlcOverhead)
 
 2295               (*it).second.m_rlcTransmissionQueueSize = 0;
 
 2299               (*it).second.m_rlcTransmissionQueueSize -= size - rlcOverhead;
 
 2305       NS_LOG_ERROR (
this << 
" Does not find DL RLC Buffer Report of UE " << rnti);
 
 2314   std::map <uint16_t,uint32_t>::iterator it = 
m_ceBsrRxed.find (rnti);
 
 2317       NS_LOG_INFO (
this << 
" UE " << rnti << 
" size " << size << 
" BSR " << (*it).second);
 
 2318       if ((*it).second >= size)
 
 2320           (*it).second -= size;
 
 2329       NS_LOG_ERROR (
this << 
" Does not find BSR report info of UE " << rnti);
 
 2337   NS_LOG_FUNCTION (
this << 
" RNTI " << rnti << 
" txMode " << (uint16_t)txMode);
 
std::vector< struct UlInfoListElement_s > m_ulInfoList
UL info list. 
 
See section 4.3.1 dlDciListElement. 
 
std::map< uint16_t, uint32_t > m_a30CqiTimers
Map of UE's timers on DL CQI A30 received. 
 
virtual void SetFfMacCschedSapUser(FfMacCschedSapUser *s)
Set FF MAC Csched SAP user function. 
 
void DoCschedCellConfigReq(const struct FfMacCschedSapProvider::CschedCellConfigReqParameters ¶ms)
Csched cell config request function. 
 
uint32_t creditableThreshold
the flow cannot borrow token from bank until the number of token it has deposited to bank reaches thi...
 
Smart pointer class similar to boost::intrusive_ptr. 
 
Service Access Point (SAP) offered by the eNodeB RRC instance to the Frequency Reuse algorithm instan...
 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
 
std::map< uint16_t, uint8_t > m_uesTxMode
txMode of the UEs 
 
std::map< uint16_t, std::vector< double > > m_ueCqi
Map of UEs' UL-CQI per RBG. 
 
Time flowStart
flow start time 
 
AttributeValue implementation for Boolean. 
 
std::map< LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters > m_rlcBufferReq
Vectors of UE's LC info. 
 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
 
virtual void ReportUlCqiInfo(const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ¶ms)=0
ReportUlCqiInfo. 
 
std::map< uint16_t, SbMeasResult_s > m_a30CqiRxed
Map of UE's DL CQI A30 received. 
 
Parameters of the CSCHED_UE_CONFIG_CNF primitive. 
 
Parameters of the CSCHED_UE_RELEASE_REQ primitive. 
 
void DoSchedUlNoiseInterferenceReq(const struct FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters ¶ms)
Sched UL noise interference request function. 
 
void DoCschedLcConfigReq(const struct FfMacCschedSapProvider::CschedLcConfigReqParameters ¶ms)
CSched LC config request function. 
 
virtual bool IsDlRbgAvailableForUe(int i, uint16_t rnti)=0
Check if UE can be served on i-th RB in DL. 
 
virtual bool IsUlRbgAvailableForUe(int i, uint16_t rnti)=0
Check if UE can be served on i-th RB in UL. 
 
std::map< uint16_t, UlHarqProcessesDciBuffer_t > m_ulHarqProcessesDciBuffer
UL HARQ process DCI buffer. 
 
enum ns3::UlCqi_s::Type_e m_type
type 
 
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
void DoSchedUlSrInfoReq(const struct FfMacSchedSapProvider::SchedUlSrInfoReqParameters ¶ms)
Sched UL SR info request function. 
 
std::vector< UlDciListElement_s > UlHarqProcessesDciBuffer_t
UL HARQ process DCI buffer vector. 
 
std::vector< struct LogicalChannelConfigListElement_s > m_logicalChannelConfigList
logicalChannelConfigList 
 
std::vector< uint16_t > m_sinr
SINR. 
 
void DoSchedDlPagingBufferReq(const struct FfMacSchedSapProvider::SchedDlPagingBufferReqParameters ¶ms)
Sched DL paging buffer request function. 
 
std::vector< uint8_t > DlHarqProcessesTimer_t
DL HARQ process timer vector typedef. 
 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
 
Hold a signed integer type. 
 
int debtLimit
counter threshold that the flow cannot further borrow tokens from bank 
 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
 
std::vector< uint8_t > m_mcs
mcs 
 
void DoSchedDlCqiInfoReq(const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)
Sched DL CQI info request function. 
 
See section 4.3.2 ulDciListElement. 
 
bool m_harqOn
m_harqOn when false inhibit the HARQ mechanisms (by default active) 
 
uint32_t tokenPoolSize
current size of token pool (byte) 
 
std::vector< struct UlDciListElement_s > m_dciList
DCI list. 
 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
 
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate. 
 
See section 4.3.10 buildRARListElement. 
 
Parameters of the CSCHED_UE_CONFIG_UPDATE_IND primitive. 
 
uint8_t m_ulBandwidth
UL bandwidth. 
 
std::map< uint16_t, fdtbfqsFlowPerf_t > m_flowStatsUl
Map of UE statistics (per RNTI basis) 
 
void DoSchedDlRachInfoReq(const struct FfMacSchedSapProvider::SchedDlRachInfoReqParameters ¶ms)
Sched DL RACH info request function. 
 
Parameters of the CSCHED_LC_RELEASE_REQ primitive. 
 
uint16_t m_nextRntiUl
RNTI of the next user to be served next scheduling in UL. 
 
virtual uint8_t GetTpc(uint16_t rnti)=0
GetTpc. 
 
virtual void SetLteFfrSapProvider(LteFfrSapProvider *s)
Set FFR SAP provider function. 
 
std::vector< std::vector< struct RlcPduListElement_s > > m_rlcPduList
RLC PDU list. 
 
uint8_t m_transmissionMode
transmission mode 
 
uint32_t m_cqiTimersThreshold
of TTIs for which a CQI can be considered valid
 
Parameters of the SCHED_DL_TRIGGER_REQ primitive. 
 
uint8_t m_logicalChannelIdentity
logical channel identity 
 
virtual ~FdTbfqFfMacScheduler()
Destructor. 
 
uint8_t m_harqProcess
HARQ process. 
 
Ptr< const AttributeAccessor > MakeIntegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
std::vector< RlcPduList_t > DlHarqRlcPduListBuffer_t
vector of the 8 HARQ processes per UE 
 
Parameters of the SCHED_DL_MAC_BUFFER_REQ primitive. 
 
uint8_t m_dlBandwidth
DL badnwidth. 
 
Parameters of the SCHED_DL_PAGING_BUFFER_REQ primitive. 
 
virtual void CschedUeConfigUpdateInd(const struct CschedUeConfigUpdateIndParameters ¶ms)=0
CSCHED_UE_UPDATE_IND. 
 
virtual void SetFfMacSchedSapUser(FfMacSchedSapUser *s)
Set FF MAC sched SAP user function. 
 
NS_ASSERT_MSG(false,"Ipv4AddressGenerator::MaskToIndex(): Impossible")
 
std::vector< struct RachListElement_s > m_rachList
RACH list. 
 
std::vector< struct VendorSpecificListElement_s > m_vendorSpecificList
vendor specific list 
 
uint8_t m_aggrLevel
aggr level 
 
FfMacSchedSapUser * m_schedSapUser
sched SAP user 
 
std::map< uint16_t, std::vector< uint16_t > > m_allocationMaps
Map of previous allocated UE per RBG (used to retrieve info from UL-CQI) 
 
std::map< uint16_t, DlHarqProcessesDciBuffer_t > m_dlHarqProcessesDciBuffer
DL HARQ process DCI buffer. 
 
uint8_t HarqProcessAvailability(uint16_t rnti)
Return the availability of free process for the RNTI specified. 
 
static TypeId GetTypeId(void)
Get the type ID. 
 
std::map< uint16_t, DlHarqProcessesTimer_t > m_dlHarqProcessesTimer
DL HARQ process timer. 
 
uint64_t packetArrivalRate
packet arrival rate( byte/s) 
 
void DoCschedLcReleaseReq(const struct FfMacCschedSapProvider::CschedLcReleaseReqParameters ¶ms)
CSched LC release request function. 
 
std::map< uint16_t, fdtbfqsFlowPerf_t > m_flowStatsDl
Map of UE statistics (per RNTI basis) in downlink. 
 
Service Access Point (SAP) offered by the Frequency Reuse algorithm instance to the MAC Scheduler ins...
 
Parameters of the SCHED_UL_TRIGGER_REQ primitive. 
 
uint32_t m_rbBitmap
rb bitmap 
 
Hold an unsigned integer type. 
 
static uint8_t TxMode2LayerNum(uint8_t txMode)
Transmit mode 2 layer number. 
 
bool m_cqiRequest
CQI request. 
 
uint64_t bankSize
the number of bytes in token bank 
 
std::vector< uint8_t > m_ndi
ndi 
 
uint8_t m_cceIndex
CCE index. 
 
FfMacCschedSapProvider::CschedCellConfigReqParameters m_cschedCellConfig
Csched cell config. 
 
LteFfrSapProvider * m_ffrSapProvider
FFR SAP provider. 
 
virtual FfMacCschedSapProvider * GetFfMacCschedSapProvider()
Get FF MAC CSched SAP provider function. 
 
virtual void CschedUeConfigCnf(const struct CschedUeConfigCnfParameters ¶ms)=0
CSCHED_UE_CONFIG_CNF. 
 
struct UlCqi_s m_ulCqi
UL CQI. 
 
std::vector< uint16_t > m_rachAllocationMap
RACH allocation map. 
 
uint32_t m_tokenPoolSize
maximum size of token pool (byte) 
 
std::map< uint16_t, uint32_t > m_p10CqiTimers
Map of UE's timers on DL CQI P01 received. 
 
std::vector< uint8_t > m_logicalChannelIdentity
logical channel identity 
 
Parameters of the SCHED_UL_NOISE_INTERFERENCE_REQ primitive. 
 
uint8_t m_logicalChannelIdentity
logical channel indentity 
 
std::vector< struct CqiListElement_s > m_cqiList
CQI list. 
 
uint8_t m_ulGrantMcs
MCS for UL grant (default 0) 
 
std::vector< struct DlInfoListElement_s > m_dlInfoList
DL info list. 
 
void DoSchedDlRlcBufferReq(const struct FfMacSchedSapProvider::SchedDlRlcBufferReqParameters ¶ms)
Sched DL RLC buffer request function. 
 
std::map< uint16_t, uint32_t > m_ueCqiTimers
Map of UEs' timers on UL-CQI per RBG. 
 
virtual void ReportDlCqiInfo(const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)=0
ReportDlCqiInfo. 
 
Implements the SCHED SAP and CSCHED SAP for a Frequency Domain Token Bank Fair Queue scheduler...
 
virtual void SchedDlConfigInd(const struct SchedDlConfigIndParameters ¶ms)=0
SCHED_DL_CONFIG_IND. 
 
Parameters of the API primitives. 
 
int8_t m_pdcchPowerOffset
CCH power offset. 
 
std::vector< uint16_t > m_tbsSize
tbs size 
 
uint32_t m_creditableThreshold
threshold of flow credit 
 
See section 4.3.9 rlcPDU_ListElement. 
 
void DoSchedUlMacCtrlInfoReq(const struct FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters ¶ms)
Sched UL MAC control info request function. 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
Ptr< const AttributeChecker > MakeBooleanChecker(void)
 
LteFfrSapUser * m_ffrSapUser
FFR SAP user. 
 
uint8_t m_freqHopping
freq hopping 
 
std::vector< DlDciListElement_s > DlHarqProcessesDciBuffer_t
DL HARQ process DCI buffer vector typedef. 
 
Parameters of the CSCHED_LC_CONFIG_REQ primitive. 
 
std::vector< uint8_t > m_rv
rv 
 
FdTbfqFfMacScheduler()
Constructor. 
 
unsigned int LcActivePerFlow(uint16_t rnti)
LC Active per flow function. 
 
void RefreshHarqProcesses()
Refresh HARQ processes according to the timers. 
 
std::map< uint16_t, uint8_t > m_dlHarqCurrentProcessId
DL HARQ current process ID. 
 
MemberCschedSapProvider class. 
 
virtual std::vector< bool > GetAvailableUlRbg()=0
Get vector of available RB in UL for this Cell. 
 
FfMacCschedSapProvider * m_cschedSapProvider
CSched SAP provider. 
 
virtual uint8_t GetMinContinuousUlBandwidth()=0
Get the minimum continuous Ul bandwidth. 
 
uint64_t tokenGenerationRate
token generation rate ( byte/s ) 
 
virtual void SchedUlConfigInd(const struct SchedUlConfigIndParameters ¶ms)=0
SCHED_UL_CONFIG_IND. 
 
uint8_t m_ulIndex
UL index. 
 
static Time Now(void)
Return the current simulation virtual time. 
 
double EstimateUlSinr(uint16_t rnti, uint16_t rb)
Estimate UL SNR function. 
 
std::map< uint16_t, DlHarqRlcPduListBuffer_t > m_dlHarqProcessesRlcPduListBuffer
DL HARQ process RLC PDU list buffer. 
 
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
 
UlCqiFilter_t m_ulCqiFilter
UL CQI filter. 
 
int GetRbgSize(int dlbandwidth)
Get RBG size function. 
 
This abstract base class identifies the interface by means of which the helper object can plug on the...
 
FfMacCschedSapUser class. 
 
enum Result_e m_result
result 
 
uint8_t m_nrOfPdcchOfdmSymbols
number of PDCCH OFDM symbols 
 
Parameters of the SCHED_DL_CQI_INFO_REQ primitive. 
 
std::vector< struct MacCeListElement_s > m_macCeList
MAC CE list. 
 
Parameters of the API primitives. 
 
uint32_t burstCredit
the maximum number of tokens connection i can borrow from the bank each time 
 
virtual LteFfrSapUser * GetLteFfrSapUser()
Get FFR SAP user function. 
 
std::vector< struct RachListElement_s > m_rachList
RACH list. 
 
static double fpS11dot3toDouble(uint16_t val)
Convert from fixed point S11.3 notation to double. 
 
int counter
the number of token borrow or given to token bank 
 
std::vector< uint8_t > UlHarqProcessesStatus_t
UL HARQ process status vector. 
 
void DoSchedUlCqiInfoReq(const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ¶ms)
Sched UL CQI info request function. 
 
std::vector< uint8_t > DlHarqProcessesStatus_t
DL HARQ process status vector typedef. 
 
Parameters of the SCHED_UL_CQI_INFO_REQ primitive. 
 
virtual void DoDispose(void)
Destructor implementation. 
 
static uint32_t BsrId2BufferSize(uint8_t val)
Convert BSR ID to buffer size. 
 
uint8_t m_transmissionMode
transmission mode 
 
Template for the implementation of the LteFfrSapUser as a member of an owner class of type C to which...
 
void DoSchedDlTriggerReq(const struct FfMacSchedSapProvider::SchedDlTriggerReqParameters ¶ms)
Sched DL trigger request function. 
 
FfMacSchedSapProvider * m_schedSapProvider
sched SAP provider 
 
void RefreshDlCqiMaps(void)
Refresh DL CQI maps function. 
 
Parameters of the API primitives. 
 
Parameters of the SCHED_UL_MAC_CTRL_INFO_REQ primitive. 
 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG. 
 
std::map< uint16_t, UlHarqProcessesStatus_t > m_ulHarqProcessesStatus
UL HARQ process status. 
 
virtual std::vector< bool > GetAvailableDlRbg()=0
Get vector of available RBG in DL for this Cell. 
 
void DoSchedDlMacBufferReq(const struct FfMacSchedSapProvider::SchedDlMacBufferReqParameters ¶ms)
Sched DL MAC buffer request function. 
 
FfMacCschedSapUser * m_cschedSapUser
Csched SAP user. 
 
void DoSchedUlTriggerReq(const struct FfMacSchedSapProvider::SchedUlTriggerReqParameters ¶ms)
Sched UL trigger request function. 
 
std::vector< DlInfoListElement_s > m_dlInfoListBuffered
HARQ retx buffered. 
 
Parameters of the SCHED_UL_SR_INFO_REQ primitive. 
 
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR. 
 
Parameters of the SCHED_DL_RACH_INFO_REQ primitive. 
 
Parameters of the SCHED_UL_CONFIG_IND primitive. 
 
std::map< uint16_t, DlHarqProcessesStatus_t > m_dlHarqProcessesStatus
DL HARQ process status. 
 
uint32_t m_creditLimit
flow credit limit (byte) 
 
MemberSchedSapProvider class. 
 
Parameters of the CSCHED_UE_CONFIG_REQ primitive. 
 
std::map< uint16_t, uint8_t > m_ulHarqCurrentProcessId
UL HARQ current process ID. 
 
virtual FfMacSchedSapProvider * GetFfMacSchedSapProvider()
Get FF MAC sched SAP provider function. 
 
uint32_t maxTokenPoolSize
maximum size of token pool (byte) 
 
struct DlDciListElement_s m_dci
DCI. 
 
std::vector< struct BuildRarListElement_s > m_buildRarList
build rar list 
 
std::map< uint16_t, uint8_t > m_p10CqiRxed
Map of UE's DL CQI P01 received. 
 
void RefreshUlCqiMaps(void)
Refresh UL CQI maps function. 
 
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
a unique identifier for an interface. 
 
uint8_t m_resAlloc
res allocate 
 
static const int FdTbfqType0AllocationRbg[4]
FdTbfqType0AllocationRbg value array. 
 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
 
void DoCschedUeReleaseReq(const struct FfMacCschedSapProvider::CschedUeReleaseReqParameters ¶ms)
CSched UE release request function. 
 
void UpdateUlRlcBufferInfo(uint16_t rnti, uint16_t size)
Update UL RLC buffer info function. 
 
void DoCschedUeConfigReq(const struct FfMacCschedSapProvider::CschedUeConfigReqParameters ¶ms)
CSched UE config request function. 
 
uint8_t UpdateHarqProcessId(uint16_t rnti)
Update and return a new process Id for the RNTI specified. 
 
int m_debtLimit
flow debt limit (byte) 
 
std::map< uint16_t, uint32_t > m_ceBsrRxed
Map of UE's buffer status reports received. 
 
void UpdateDlRlcBufferInfo(uint16_t rnti, uint8_t lcid, uint16_t size)
Update DL RLC buffer info function. 
 
void TransmissionModeConfigurationUpdate(uint16_t rnti, uint8_t txMode)
Transmisson mode config update function. 
 
std::vector< struct BuildDataListElement_s > m_buildDataList
build data list 
 
uint8_t m_ueTxAntennaSelection
UE antenna selection. 
 
See section 4.3.8 builDataListElement.