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);
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
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.
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
Reference Signal Received Quality.
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
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
RSRQ is used for the threshold.
Event A1: Serving becomes better than absolute threshold.
void InitializeUplinkRbgMaps()