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 ())
774 unsigned int sinrNum = 0;
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.
virtual std::vector< bool > DoGetAvailableUlRbg()
Implementation of LteFfrSapProvider::GetAvailableUlRbg.
std::vector< bool > m_ulSecondarySegmentRbgMap
enum ns3::UlCqi_s::Type_e m_type
enum ns3::LteRrcSap::ReportConfigEutra::@73 triggerQuantity
The quantities used to evaluate the triggering condition for the event, see 3GPP TS 36...
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.
enum ns3::LteRrcSap::ReportConfigEutra::@71 eventId
Choice of E-UTRA event triggered reporting criteria.
#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...
enum ns3::LteRrcSap::ThresholdEutra::@69 choice
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
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
enum ns3::LteRrcSap::ReportConfigEutra::@75 reportInterval
Indicates the interval between periodical reports.
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.
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.
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.
void SetDownlinkConfiguration(uint16_t cellId, uint8_t bandwidth)
RSRQ is used for the threshold.
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
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
Event A1: Serving becomes better than absolute threshold.
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
Reference Signal Received Quality.
virtual ~LteFfrEnhancedAlgorithm()
uint8_t m_centerAreaPowerOffset
void InitializeUplinkRbgMaps()