23 #include "ns3/ff-mac-common.h" 
   24 #include "ns3/lte-common.h" 
   25 #include "ns3/lte-vendor-specific-parameters.h" 
   27 #include "ns3/boolean.h" 
   28 #include <ns3/double.h> 
   39   0.15, 0.23, 0.38, 0.6, 0.88, 1.18,
 
   41   2.73, 3.32, 3.9, 4.52, 5.12, 5.55
 
   62   { 2, 100, 32, 16, 16},
 
   84   { 2, 100, 32, 16, 16},
 
  121   static TypeId tid = 
TypeId (
"ns3::LteFfrEnhancedAlgorithm")
 
  125     .AddAttribute (
"UlSubBandOffset",
 
  126                    "Uplink SubBand Offset for this cell in number of Resource Block Groups",
 
  129                    MakeUintegerChecker<uint8_t> ())
 
  130     .AddAttribute (
"UlReuse3SubBandwidth",
 
  131                    "Uplink Reuse 3 SubBandwidth Configuration in number of Resource Block Groups",
 
  134                    MakeUintegerChecker<uint8_t> ())
 
  135     .AddAttribute (
"UlReuse1SubBandwidth",
 
  136                    "Uplink Reuse 1 SubBandwidth Configuration in number of Resource Block Groups",
 
  139                    MakeUintegerChecker<uint8_t> ())
 
  140     .AddAttribute (
"DlSubBandOffset",
 
  141                    "Downlink SubBand Offset for this cell in number of Resource Block Groups",
 
  144                    MakeUintegerChecker<uint8_t> ())
 
  145     .AddAttribute (
"DlReuse3SubBandwidth",
 
  146                    "Downlink Reuse 3 SubBandwidth Configuration in number of Resource Block Groups",
 
  149                    MakeUintegerChecker<uint8_t> ())
 
  150     .AddAttribute (
"DlReuse1SubBandwidth",
 
  151                    "Downlink Reuse 1 SubBandwidth Configuration in number of Resource Block Groups",
 
  154                    MakeUintegerChecker<uint8_t> ())
 
  155     .AddAttribute (
"RsrqThreshold",
 
  156                    "If the RSRQ of is worse than this threshold, UE should be served in Edge sub-band",
 
  159                    MakeUintegerChecker<uint8_t> ())
 
  160     .AddAttribute (
"CenterAreaPowerOffset",
 
  161                    "PdschConfigDedicated::Pa value for Center Sub-band, default value dB0",
 
  164                    MakeUintegerChecker<uint8_t> ())
 
  165     .AddAttribute (
"EdgeAreaPowerOffset",
 
  166                    "PdschConfigDedicated::Pa value for Edge Sub-band, default value dB0",
 
  169                    MakeUintegerChecker<uint8_t> ())
 
  170     .AddAttribute (
"DlCqiThreshold",
 
  171                    "If the DL-CQI for RBG of is higher than this threshold, transmission on RBG is possible",
 
  174                    MakeUintegerChecker<uint8_t> ())
 
  175     .AddAttribute (
"UlCqiThreshold",
 
  176                    "If the UL-CQI for RBG of is higher than this threshold, transmission on RBG is possible",
 
  179                    MakeUintegerChecker <uint8_t> ())
 
  180     .AddAttribute (
"CenterAreaTpc",
 
  181                    "TPC value which will be set in DL-DCI for UEs in center area" 
  182                    "Absolute mode is used, default value 1 is mapped to -1 according to" 
  183                    "TS36.213 Table 5.1.1.1-2",
 
  186                    MakeUintegerChecker<uint8_t> ())
 
  187     .AddAttribute (
"EdgeAreaTpc",
 
  188                    "TPC value which will be set in DL-DCI for UEs in edge area" 
  189                    "Absolute mode is used, default value 1 is mapped to -1 according to" 
  190                    "TS36.213 Table 5.1.1.1-2",
 
  193                    MakeUintegerChecker<uint8_t> ())
 
  245   NS_LOG_LOGIC (
this << 
" requesting Event A1 measurements" 
  246                      << 
" (threshold = 0" << 
")");
 
  306   NS_ASSERT_MSG (s >= 0.0, 
"negative spectral efficiency = " << s);
 
  308   while ((cqi < 15) && (SpectralEfficiencyForCqi[cqi + 1] < s))
 
  335                  "DlSubBandOffset + DlReuse3SubBandwidth + DlReuse1SubBandwidth  higher than DlBandwidth");
 
  340       uint8_t index = offset + i;
 
  349       uint8_t index = offset + i;
 
  360       uint8_t index = 0 * offset + i;
 
  363       index = 1 * offset + i;
 
  366       index = 2 * offset + i;
 
  396                  "UlSubBandOffset + UlReuse3SubBandwidth + UlReuse1SubBandwidth higher than UlBandwidth");
 
  402       uint8_t index = offset + i;
 
  411       uint8_t index = offset + i;
 
  422       uint8_t index = 0 * offset + i;
 
  425       index = 1 * offset + i;
 
  428       index = 2 * offset + i;
 
  451   std::map <uint16_t, std::vector<bool> >::iterator it;
 
  455       std::vector<bool> rbgAvailableMap = it->second;
 
  456       for (uint32_t i = 0; i < rbgMap.size (); i++)
 
  458           NS_LOG_INFO (
"\t rbgId: " << i << 
" available " << (
int)rbgAvailableMap.at (i));
 
  459           if ( rbgAvailableMap.at (i) == 
true)
 
  461               rbgMap.at (i) = 
false;
 
  479   std::map< uint16_t, uint8_t >::iterator it = 
m_ues.find (rnti);
 
  480   if (it == 
m_ues.end ())
 
  485   it = 
m_ues.find (rnti);
 
  494   bool isCenterUe = 
false;
 
  495   bool isEdgeUe   = 
false;
 
  506   if (isPrimarySegmentRbg)
 
  508       NS_LOG_INFO (
"PRIMARY SEGMENT RNTI: " << rnti  << 
"  rbgId: " << rbgId );
 
  509       return (isReuse1Rbg && isCenterUe) || (isReuse3Rbg && isEdgeUe);
 
  511   else if (isSecondarySegmentRbg && isCenterUe)
 
  514       NS_LOG_INFO (
"SECONDARY SEGMENT RNTI: " << rnti  << 
"  rbgId: " << rbgId );
 
  518           NS_LOG_INFO (
"RNTI: " << rnti  << 
"  rbgId: " << rbgId << 
"  available: " << it->second.at (rbgId));
 
  519           if (it->second.at (rbgId) == 
true)
 
  547   std::map <uint16_t, std::vector<bool> >::iterator it;
 
  551       std::vector<bool> rbAvailableMap = it->second;
 
  552       for (uint32_t i = 0; i < rbgMap.size (); i++)
 
  554           NS_LOG_INFO (
"\t rbgId: " << i << 
" available " << (
int)rbAvailableMap.at (i));
 
  555           if ( rbAvailableMap.at (i) == 
true)
 
  557               rbgMap.at (i) = 
false;
 
  580   std::map< uint16_t, uint8_t >::iterator it = 
m_ues.find (rnti);
 
  581   if (it == 
m_ues.end ())
 
  586   it = 
m_ues.find (rnti);
 
  594   bool isCenterUe = 
false;
 
  595   bool isEdgeUe   = 
false;
 
  606   if (isPrimarySegmentRbg)
 
  608       return (isReuse1Rbg && isCenterUe) || (isReuse3Rbg && isEdgeUe);
 
  610   else if (isSecondarySegmentRbg && isCenterUe)
 
  613       NS_LOG_INFO (
"UL SECONDARY SEGMENT RNTI: " << rnti  << 
"  rbgId: " << rbgId );
 
  617           NS_LOG_INFO (
"RNTI: " << rnti  << 
"  rbgId: " << rbgId << 
"  available: " << it->second.at (rbgId));
 
  618           if (it->second.at (rbgId) == 
true)
 
  635   for (
unsigned int i = 0; i < params.
m_cqiList.size (); i++)
 
  639           NS_LOG_INFO (
"subband CQI reporting high layer configured");
 
  641           std::map <uint16_t,SbMeasResult_s>::iterator it;
 
  642           uint16_t rnti = params.
m_cqiList.at (i).m_rnti;
 
  644           std::map< uint16_t, uint8_t >::iterator ueIt = 
m_ues.find (rnti);
 
  645           if (ueIt != 
m_ues.end ())
 
  661               m_dlCqi.insert ( std::pair<uint16_t, SbMeasResult_s > (rnti, params.
m_cqiList.at (i).m_sbMeasResult) );
 
  666               (*it).second = params.
m_cqiList.at (i).m_sbMeasResult;
 
  677   std::map <uint16_t,SbMeasResult_s>::iterator it;
 
  680       uint16_t rnti = it->first;
 
  681       std::vector<bool> rbgAvailableMap;
 
  683       for (uint32_t i = 0; i < (*it).second.m_higherLayerSelected.size (); i++)
 
  685           uint8_t rbgCqi = (*it).second.m_higherLayerSelected.at (i).m_sbCqi.at (0);
 
  691           NS_LOG_INFO (
this << 
" RNTI " << rnti << 
" RBG  " << i << 
" DL-CQI: " << (
int)rbgCqi);
 
  695           bool isSecondarySegmentRbg = 
false;
 
  701           rbgAvailable = (isSecondarySegmentRbg == 
true) ? rbgAvailable : 
false;
 
  703           rbgAvailableMap.push_back (rbgAvailable);
 
  713       uint16_t rnti = it->first;
 
  714       std::vector<bool> dlRbgAvailableMap = it->second;
 
  715       std::vector<bool> ulRbAvailableMap;
 
  718       for (uint32_t j = 0; j < dlRbgAvailableMap.size (); j++)
 
  720           uint32_t index = rbgSize * j;
 
  721           for (uint32_t i = 0; i < rbgSize; i++)
 
  724               ulRbAvailableMap[index] = dlRbgAvailableMap[j];
 
  728       m_ulRbAvailableforUe.insert ( std::pair<uint16_t, std::vector<bool> > (rnti, ulRbAvailableMap ) );
 
  745           double s = log2 ( 1 + (
 
  746                               std::pow (10, sinr / 10 )  /
 
  747                               ( (-std::log (5.0 * 0.00005 )) / 1.5) ));
 
  749           NS_LOG_INFO (
this << 
" RNTI " << rnti << 
" new SRS-CQI for RB  " << j << 
" value " << sinr << 
" UL-CQI: " << cqi);
 
  758   NS_LOG_WARN (
"Method should not be called, because it is empty");
 
  764   std::map <uint16_t, std::vector <double> >::iterator itCqi = ulCqiMap.find (rnti);
 
  765   if (itCqi == ulCqiMap.end ())
 
  777           double sinr = (*itCqi).second.at (i);
 
  784       double estimatedSinr = (sinrNum > 0) ? (sinrSum / sinrNum) : DBL_MAX;
 
  786       (*itCqi).second.at (rb) = estimatedSinr;
 
  787       return (estimatedSinr);
 
  811   std::map< uint16_t, uint8_t >::iterator it = 
m_ues.find (rnti);
 
  812   if (it == 
m_ues.end ())
 
  838       return minContinuousUlBandwidth;
 
  841   minContinuousUlBandwidth =
 
  844   minContinuousUlBandwidth =
 
  847   NS_LOG_INFO (
"minContinuousUlBandwidth: " << (
int)minContinuousUlBandwidth);
 
  849   return minContinuousUlBandwidth;
 
  859                         << 
" RSRP: " << (uint16_t)measResults.
rsrpResult 
  860                         << 
" RSRQ: " << (uint16_t)measResults.
rsrqResult);
 
  868       std::map< uint16_t, uint8_t >::iterator it = 
m_ues.find (rnti);
 
  869       if (it == 
m_ues.end ())
 
  874       it = 
m_ues.find (rnti);
 
  879               NS_LOG_INFO (
"UE RNTI: " << rnti << 
" will be served in Edge sub-band");
 
  891               NS_LOG_INFO (
"UE RNTI: " << rnti << 
" will be served in Center sub-band");
 
  905   NS_LOG_WARN (
"Method should not be called, because it is empty");
 
Service Access Point (SAP) offered by the Frequency Reuse algorithm instance to the eNodeB RRC instan...
 
virtual uint8_t DoGetMinContinuousUlBandwidth()
DoGetMinContinuousUlBandwidth in number of RB. 
 
virtual void DoInitialize(void)
Initialize() implementation. 
 
uint8_t m_ulReuse1SubBandwidth
 
Template for the implementation of the LteFfrRrcSapProvider as a member of an owner class of type C t...
 
virtual LteFfrRrcSapProvider * GetLteFfrRrcSapProvider()
Export the "provider" part of the LteFfrRrcSap interface. 
 
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, std::vector< bool > > m_dlRbgAvailableforUe
 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
 
enum ns3::LteRrcSap::ReportConfigEutra::@70 eventId
Choice of E-UTRA event triggered reporting criteria. 
 
virtual std::vector< bool > DoGetAvailableUlRbg()
Implementation of LteFfrSapProvider::GetAvailableUlRbg. 
 
std::vector< bool > m_ulSecondarySegmentRbgMap
 
enum ns3::UlCqi_s::Type_e m_type
 
ThresholdEutra threshold1
Threshold for event A1, A2, A4, and A5. 
 
Specifies criteria for triggering of an E-UTRA measurement reporting event. 
 
LteFfrRrcSapProvider * m_ffrRrcSapProvider
 
std::vector< uint16_t > m_sinr
 
uint8_t m_ulBandwidth
uplink bandwidth in RBs 
 
std::vector< bool > m_ulReuse3RbgMap
 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
 
LteFfrEnhancedAlgorithm()
Creates a trivial ffr algorithm instance. 
 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
 
virtual bool DoIsDlRbgAvailableForUe(int i, uint16_t rnti)
Implementation of LteFfrSapProvider::IsDlRbgAvailableForUe. 
 
std::vector< bool > m_ulReuse1RbgMap
 
virtual void SetLteFfrSapUser(LteFfrSapUser *s)
Set the "user" part of the LteFfrSap interface that this frequency reuse algorithm instance will inte...
 
virtual uint8_t AddUeMeasReportConfigForFfr(LteRrcSap::ReportConfigEutra reportConfig)=0
Request a certain reporting configuration to be fulfilled by the UEs attached to the eNodeB entity...
 
virtual void DoReportDlCqiInfo(const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters ¶ms)
DoReportDlCqiInfo. 
 
virtual void DoDispose()
Destructor implementation. 
 
static const struct ns3::FfrEnhancedUplinkDefaultConfiguration g_ffrEnhancedUplinkDefaultConfiguration[]
 
virtual void SetPdschConfigDedicated(uint16_t rnti, LteRrcSap::PdschConfigDedicated pdschConfigDedicated)=0
Instruct the eNodeB RRC entity to perform RrcConnectionReconfiguration to inform UE about new PdschCo...
 
Template for the implementation of the LteFfrSapProvider as a member of an owner class of type C to w...
 
virtual uint8_t DoGetTpc(uint16_t rnti)
DoGetTpc for UE. 
 
std::map< uint16_t, SbMeasResult_s > m_dlCqi
 
Reference Signal Received Quality. 
 
Event A1: Serving becomes better than absolute threshold. 
 
uint8_t m_dlReuse1SubBandwidth
 
Service Access Point (SAP) offered by the Frequency Reuse algorithm instance to the MAC Scheduler ins...
 
Hold an unsigned integer type. 
 
LteFfrSapUser * m_ffrSapUser
 
uint8_t m_dlReuse3SubBandwidth
 
bool m_enabledInUplink
If true FR algorithm will also work in Uplink. 
 
bool m_needReconfiguration
If true FR algorithm will be reconfigured. 
 
virtual void DoReportUeMeas(uint16_t rnti, LteRrcSap::MeasResults measResults)
Implementation of LteFfrRrcSapProvider::ReportUeMeas. 
 
uint8_t m_dlBandwidth
downlink bandwidth in RBs 
 
std::vector< bool > m_dlPrimarySegmentRbgMap
 
double EstimateUlSinr(uint16_t rnti, uint16_t rb, std::map< uint16_t, std::vector< double > > ulCqiMap)
 
std::vector< bool > m_dlReuse1RbgMap
 
virtual void DoReportUlCqiInfo(const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ¶ms)
DoReportUlCqiInfo. 
 
LteFfrSapProvider * m_ffrSapProvider
 
virtual void DoInitialize()
Initialize() implementation. 
 
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC. 
 
std::vector< struct CqiListElement_s > m_cqiList
 
static const struct ns3::FfrEnhancedDownlinkDefaultConfiguration g_ffrEnhancedDownlinkDefaultConfiguration[]
 
virtual std::vector< bool > DoGetAvailableDlRbg()
Implementation of LteFfrSapProvider::GetAvailableDlRbg. 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
The abstract base class of a Frequency Reuse algorithm. 
 
uint8_t m_dlSubBandOffset
 
std::vector< bool > m_dlSecondarySegmentRbgMap
 
uint8_t dlReuse1SubBandwidth
 
uint8_t m_edgeAreaPowerOffset
 
uint8_t range
Value range used in RSRP/RSRQ threshold. 
 
uint8_t m_ulReuse3SubBandwidth
 
void InitializeDownlinkRbgMaps()
 
Enhanced Fractional Frequency Reuse algorithm implementation. 
 
uint8_t ulReuse3SubBandwidth
 
Service Access Point (SAP) offered by the eNodeB RRC instance to the Frequency Reuse algorithm instan...
 
uint8_t dlReuse3SubBandwidth
 
virtual void DoRecvLoadInformation(EpcX2Sap::LoadInformationParams params)
DoRecvLoadInformation. 
 
enum ns3::LteRrcSap::ReportConfigEutra::@72 triggerQuantity
The quantities used to evaluate the triggering condition for the event, see 3GPP TS 36...
 
uint8_t m_ulSubBandOffset
 
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
 
Parameters of the SCHED_DL_CQI_INFO_REQ primitive. 
 
uint8_t m_frCellTypeId
FFR cell type ID for automatic configuration. 
 
static double fpS11dot3toDouble(uint16_t val)
 
int GetCqiFromSpectralEfficiency(double s)
 
virtual void SetLteFfrRrcSapUser(LteFfrRrcSapUser *s)
Set the "user" part of the LteFfrRrcSap interface that this frequency reuse algorithm instance will i...
 
void SetUplinkConfiguration(uint16_t cellId, uint8_t bandwidth)
 
static TypeId GetTypeId()
 
Parameters of the SCHED_UL_CQI_INFO_REQ primitive. 
 
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN. 
 
enum ns3::LteRrcSap::ThresholdEutra::@68 choice
 
std::map< uint16_t, uint8_t > m_ues
 
virtual LteFfrSapProvider * GetLteFfrSapProvider()
Export the "provider" part of the LteFfrSap interface. 
 
virtual bool DoIsUlRbgAvailableForUe(int i, uint16_t rnti)
Implementation of LteFfrSapProvider::IsUlRbgAvailableForUe. 
 
int GetRbgSize(int dlbandwidth)
Get RBG size for DL Bandwidth according to table 7.1.6.1-1 of 36.213. 
 
enum ns3::LteRrcSap::ReportConfigEutra::@74 reportInterval
Indicates the interval between periodical reports. 
 
void SetDownlinkConfiguration(uint16_t cellId, uint8_t bandwidth)
 
std::vector< bool > m_ulPrimarySegmentRbgMap
 
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR. 
 
static const double SpectralEfficiencyForCqi[16]
Table of CQI index and its spectral efficiency. 
 
const uint16_t NUM_DOWNLINK_CONFS(sizeof(g_ffrEnhancedDownlinkDefaultConfiguration)/sizeof(FfrEnhancedDownlinkDefaultConfiguration))
 
LteFfrRrcSapUser * m_ffrRrcSapUser
 
RSRQ is used for the threshold. 
 
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 ulReuse1SubBandwidth
 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
 
std::vector< bool > m_dlRbgMap
 
const uint16_t NUM_UPLINK_CONFS(sizeof(g_ffrEnhancedUplinkDefaultConfiguration)/sizeof(FfrEnhancedUplinkDefaultConfiguration))
 
std::vector< bool > m_ulRbgMap
 
std::vector< bool > m_dlReuse3RbgMap
 
virtual void Reconfigure()
Automatic FR reconfiguration. 
 
std::map< uint16_t, std::vector< bool > > m_ulRbAvailableforUe
 
virtual ~LteFfrEnhancedAlgorithm()
 
uint8_t m_centerAreaPowerOffset
 
void InitializeUplinkRbgMaps()