A Discrete-Event Network Simulator
API
lte-fr-soft-algorithm.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2014 Piotr Gawlowicz
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Piotr Gawlowicz <gawlowicz.p@gmail.com>
19  *
20  */
21 
22 #include "lte-fr-soft-algorithm.h"
23 #include <ns3/log.h>
24 #include "ns3/boolean.h"
25 
26 namespace ns3 {
27 
28 NS_LOG_COMPONENT_DEFINE ("LteFrSoftAlgorithm");
29 
30 NS_OBJECT_ENSURE_REGISTERED (LteFrSoftAlgorithm);
31 
33 {
34  uint8_t cellId;
35  uint8_t dlBandwidth;
39  { 1, 15, 0, 4},
40  { 2, 15, 4, 4},
41  { 3, 15, 8, 6},
42  { 1, 25, 0, 8},
43  { 2, 25, 8, 8},
44  { 3, 25, 16, 9},
45  { 1, 50, 0, 16},
46  { 2, 50, 16, 16},
47  { 3, 50, 32, 18},
48  { 1, 75, 0, 24},
49  { 2, 75, 24, 24},
50  { 3, 75, 48, 27},
51  { 1, 100, 0, 32},
52  { 2, 100, 32, 32},
53  { 3, 100, 64, 36}
54 };
55 
57 {
58  uint8_t cellId;
59  uint8_t ulBandwidth;
63  { 1, 15, 0, 5},
64  { 2, 15, 5, 5},
65  { 3, 15, 10, 5},
66  { 1, 25, 0, 8},
67  { 2, 25, 8, 8},
68  { 3, 25, 16, 9},
69  { 1, 50, 0, 16},
70  { 2, 50, 16, 16},
71  { 3, 50, 32, 18},
72  { 1, 75, 0, 24},
73  { 2, 75, 24, 24},
74  { 3, 75, 48, 27},
75  { 1, 100, 0, 32},
76  { 2, 100, 32, 32},
77  { 3, 100, 64, 36}
78 };
79 
80 const uint16_t NUM_DOWNLINK_CONFS (sizeof (g_frSoftDownlinkDefaultConfiguration) / sizeof (FrSoftDownlinkDefaultConfiguration));
81 const uint16_t NUM_UPLINK_CONFS (sizeof (g_frSoftUplinkDefaultConfiguration) / sizeof (FrSoftUplinkDefaultConfiguration));
82 
83 
85  : m_ffrSapUser (0),
86  m_ffrRrcSapUser (0),
87  m_dlEgdeSubBandOffset (0),
88  m_dlEdgeSubBandwidth (0),
89  m_ulEgdeSubBandOffset (0),
90  m_ulEdgeSubBandwidth (0),
91  m_measId (0)
92 {
93  NS_LOG_FUNCTION (this);
96 }
97 
98 
100 {
101  NS_LOG_FUNCTION (this);
102 }
103 
104 
105 void
107 {
108  NS_LOG_FUNCTION (this);
109  delete m_ffrSapProvider;
110  delete m_ffrRrcSapProvider;
111 }
112 
113 
114 TypeId
116 {
117  static TypeId tid = TypeId ("ns3::LteFrSoftAlgorithm")
119  .SetGroupName("Lte")
120  .AddConstructor<LteFrSoftAlgorithm> ()
121  .AddAttribute ("UlEdgeSubBandOffset",
122  "Uplink Edge SubBand Offset in number of Resource Block Groups",
123  UintegerValue (0),
125  MakeUintegerChecker<uint8_t> ())
126  .AddAttribute ("UlEdgeSubBandwidth",
127  "Uplink Edge SubBandwidth Configuration in number of Resource Block Groups",
128  UintegerValue (0),
130  MakeUintegerChecker<uint8_t> ())
131  .AddAttribute ("DlEdgeSubBandOffset",
132  "Downlink Edge SubBand Offset in number of Resource Block Groups",
133  UintegerValue (0),
135  MakeUintegerChecker<uint8_t> ())
136  .AddAttribute ("DlEdgeSubBandwidth",
137  "Downlink Edge SubBandwidth Configuration in number of Resource Block Groups",
138  UintegerValue (0),
140  MakeUintegerChecker<uint8_t> ())
141  .AddAttribute ("AllowCenterUeUseEdgeSubBand",
142  "If true center UEs can receive on Edge SubBand RBGs",
143  BooleanValue (true),
146  .AddAttribute ("RsrqThreshold",
147  "If the RSRQ of is worse than this threshold, UE should be served in Edge sub-band",
148  UintegerValue (20),
150  MakeUintegerChecker<uint8_t> ())
151  .AddAttribute ("CenterPowerOffset",
152  "PdschConfigDedicated::Pa value for Edge Sub-band, default value dB0",
153  UintegerValue (5),
155  MakeUintegerChecker<uint8_t> ())
156  .AddAttribute ("EdgePowerOffset",
157  "PdschConfigDedicated::Pa value for Edge Sub-band, default value dB0",
158  UintegerValue (5),
160  MakeUintegerChecker<uint8_t> ())
161  .AddAttribute ("CenterAreaTpc",
162  "TPC value which will be set in DL-DCI for UEs in center area"
163  "Absolute mode is used, default value 1 is mapped to -1 according to"
164  "TS36.213 Table 5.1.1.1-2",
165  UintegerValue (1),
167  MakeUintegerChecker<uint8_t> ())
168  .AddAttribute ("EdgeAreaTpc",
169  "TPC value which will be set in DL-DCI for UEs in edge area"
170  "Absolute mode is used, default value 1 is mapped to -1 according to"
171  "TS36.213 Table 5.1.1.1-2",
172  UintegerValue (1),
174  MakeUintegerChecker<uint8_t> ())
175  ;
176  return tid;
177 }
178 
179 
180 void
182 {
183  NS_LOG_FUNCTION (this << s);
184  m_ffrSapUser = s;
185 }
186 
187 
190 {
191  NS_LOG_FUNCTION (this);
192  return m_ffrSapProvider;
193 }
194 
195 void
197 {
198  NS_LOG_FUNCTION (this << s);
199  m_ffrRrcSapUser = s;
200 }
201 
202 
205 {
206  NS_LOG_FUNCTION (this);
207  return m_ffrRrcSapProvider;
208 }
209 
210 
211 void
213 {
214  NS_LOG_FUNCTION (this);
216 
217  NS_ASSERT_MSG (m_dlBandwidth > 14,"DlBandwidth must be at least 15 to use FFR algorithms");
218  NS_ASSERT_MSG (m_ulBandwidth > 14,"UlBandwidth must be at least 15 to use FFR algorithms");
219 
220  if (m_frCellTypeId != 0)
221  {
224  }
225 
226  NS_LOG_LOGIC (this << " requesting Event A1 measurements"
227  << " (threshold = 0" << ")");
228  LteRrcSap::ReportConfigEutra reportConfig;
231  reportConfig.threshold1.range = 0;
235 }
236 
237 void
239 {
240  NS_LOG_FUNCTION (this);
241  if (m_frCellTypeId != 0)
242  {
245  }
248  m_needReconfiguration = false;
249 }
250 
251 void
252 LteFrSoftAlgorithm::SetDownlinkConfiguration (uint16_t cellId, uint8_t bandwidth)
253 {
254  NS_LOG_FUNCTION (this);
255  for (uint16_t i = 0; i < NUM_DOWNLINK_CONFS; ++i)
256  {
257  if ((g_frSoftDownlinkDefaultConfiguration[i].cellId == cellId)
259  {
262  }
263  }
264 }
265 
266 void
267 LteFrSoftAlgorithm::SetUplinkConfiguration (uint16_t cellId, uint8_t bandwidth)
268 {
269  NS_LOG_FUNCTION (this);
270  for (uint16_t i = 0; i < NUM_UPLINK_CONFS; ++i)
271  {
272  if ((g_frSoftUplinkDefaultConfiguration[i].cellId == cellId)
274  {
277  }
278  }
279 }
280 
281 void
283 {
284  m_dlRbgMap.clear ();
285  m_dlEdgeRbgMap.clear ();
286 
287  int rbgSize = GetRbgSize (m_dlBandwidth);
288  m_dlRbgMap.resize (m_dlBandwidth / rbgSize, false);
289  m_dlEdgeRbgMap.resize (m_dlBandwidth / rbgSize, false);
290 
291  NS_ASSERT_MSG (m_dlEgdeSubBandOffset <= m_dlBandwidth,"DlEgdeSubBandOffset higher than DlBandwidth");
292  NS_ASSERT_MSG (m_dlEdgeSubBandwidth <= m_dlBandwidth,"DlEdgeSubBandwidth higher than DlBandwidth");
294  "(DlEgdeSubBandOffset+DlEdgeSubBandwidth) higher than DlBandwidth");
295 
296  for (uint8_t i = m_dlEgdeSubBandOffset / rbgSize;
297  i < (m_dlEgdeSubBandOffset + m_dlEdgeSubBandwidth) / rbgSize; i++)
298  {
299  m_dlEdgeRbgMap[i] = true;
300  }
301 }
302 
303 void
305 {
306  m_ulRbgMap.clear ();
307  m_ulEdgeRbgMap.clear ();
308 
309  m_ulRbgMap.resize (m_ulBandwidth, false);
310  m_ulEdgeRbgMap.resize (m_ulBandwidth, false);
311 
312  NS_ASSERT_MSG (m_ulEgdeSubBandOffset <= m_dlBandwidth,"UlEgdeSubBandOffset higher than DlBandwidth");
313  NS_ASSERT_MSG (m_ulEdgeSubBandwidth <= m_dlBandwidth,"UlEdgeSubBandwidth higher than DlBandwidth");
315  "(UlEgdeSubBandOffset+UlEdgeSubBandwidth) higher than DlBandwidth");
316 
318  {
319  m_ulEdgeRbgMap[i] = true;
320  }
321 }
322 
323 std::vector <bool>
325 {
326  NS_LOG_FUNCTION (this);
327 
329  {
330  Reconfigure ();
331  }
332 
333  if (m_dlRbgMap.empty ())
334  {
336  }
337 
338  return m_dlRbgMap;
339 }
340 
341 bool
343 {
344  NS_LOG_FUNCTION (this);
345 
346  bool edgeRbg = m_dlEdgeRbgMap[rbgId];
347 
348  std::map< uint16_t, uint8_t >::iterator it = m_ues.find (rnti);
349  if (it == m_ues.end ())
350  {
351  m_ues.insert (std::pair< uint16_t, uint8_t > (rnti, AreaUnset));
352  return !edgeRbg;
353  }
354 
355  bool edgeUe = false;
356  if (it->second == CellEdge )
357  {
358  edgeUe = true;
359  }
360 
361  if (!edgeUe && m_isEdgeSubBandForCenterUe)
362  {
363  return true;
364  }
365 
366  return (edgeRbg && edgeUe) || (!edgeRbg && !edgeUe);
367 }
368 
369 std::vector <bool>
371 {
372  NS_LOG_FUNCTION (this);
373 
374  if (m_ulRbgMap.empty ())
375  {
377  }
378 
379  return m_ulRbgMap;
380 }
381 
382 bool
384 {
385  NS_LOG_FUNCTION (this);
386 
387  if (!m_enabledInUplink)
388  {
389  return true;
390  }
391 
392  bool edgeRbg = m_ulEdgeRbgMap[rbgId];
393 
394  std::map< uint16_t, uint8_t >::iterator it = m_ues.find (rnti);
395  if (it == m_ues.end ())
396  {
397  m_ues.insert (std::pair< uint16_t, uint8_t > (rnti, AreaUnset));
398  return !edgeRbg;
399  }
400 
401  bool edgeUe = false;
402  if (it->second == CellEdge )
403  {
404  edgeUe = true;
405  }
406 
407  if (!edgeUe && m_isEdgeSubBandForCenterUe)
408  {
409  return true;
410  }
411 
412  return (edgeRbg && edgeUe) || (!edgeRbg && !edgeUe);
413 }
414 
415 void
417 {
418  NS_LOG_FUNCTION (this);
419  NS_LOG_WARN ("Method should not be called, because it is empty");
420 }
421 
422 void
424 {
425  NS_LOG_FUNCTION (this);
426  NS_LOG_WARN ("Method should not be called, because it is empty");
427 }
428 
429 void
430 LteFrSoftAlgorithm::DoReportUlCqiInfo (std::map <uint16_t, std::vector <double> > ulCqiMap)
431 {
432  NS_LOG_FUNCTION (this);
433  NS_LOG_WARN ("Method should not be called, because it is empty");
434 }
435 
436 uint8_t
438 {
439  NS_LOG_FUNCTION (this);
440 
441  if (!m_enabledInUplink)
442  {
443  return 1; // 1 is mapped to 0 for Accumulated mode, and to -1 in Absolute mode TS36.213 Table 5.1.1.1-2
444  }
445 
446  //TS36.213 Table 5.1.1.1-2
447  // TPC | Accumulated Mode | Absolute Mode
448  //------------------------------------------------
449  // 0 | -1 | -4
450  // 1 | 0 | -1
451  // 2 | 1 | 1
452  // 3 | 3 | 4
453  //------------------------------------------------
454  // here Absolute mode is used
455 
456  std::map< uint16_t, uint8_t >::iterator it = m_ues.find (rnti);
457  if (it == m_ues.end ())
458  {
459  return 1;
460  }
461 
462  if (it->second == CellEdge )
463  {
464  return m_edgeAreaTpc;
465  }
466  else if (it->second == CellCenter )
467  {
468  return m_centerAreaTpc;
469  }
470 
471  return 1;
472 }
473 
474 uint8_t
476 {
477  NS_LOG_FUNCTION (this);
478 
479  uint8_t minContinuousUlBandwidth = m_ulBandwidth;
480 
481  if (!m_enabledInUplink)
482  {
483  return minContinuousUlBandwidth;
484  }
485 
486  uint8_t leftBandwidth = m_ulEgdeSubBandOffset;
487  uint8_t centerBandwidth = m_ulEdgeSubBandwidth;
488  uint8_t rightBandwidth = m_ulBandwidth - m_ulEdgeSubBandwidth - m_ulEgdeSubBandOffset;
489 
490  minContinuousUlBandwidth =
491  ((leftBandwidth > 0 ) && (leftBandwidth < minContinuousUlBandwidth)) ? leftBandwidth : minContinuousUlBandwidth;
492 
493  minContinuousUlBandwidth =
494  ((centerBandwidth > 0 ) && (centerBandwidth < minContinuousUlBandwidth)) ? centerBandwidth : minContinuousUlBandwidth;
495 
496  minContinuousUlBandwidth =
497  ((rightBandwidth > 0 ) && (rightBandwidth < minContinuousUlBandwidth)) ? rightBandwidth : minContinuousUlBandwidth;
498 
499  NS_LOG_INFO ("minContinuousUlBandwidth: " << (int)minContinuousUlBandwidth);
500 
501  return minContinuousUlBandwidth;
502 }
503 
504 void
506  LteRrcSap::MeasResults measResults)
507 {
508  NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
509  NS_LOG_INFO ("RNTI :" << rnti << " MeasId: " << (uint16_t) measResults.measId
510  << " RSRP: " << (uint16_t)measResults.rsrpResult
511  << " RSRQ: " << (uint16_t)measResults.rsrqResult);
512 
513  if (measResults.measId != m_measId)
514  {
515  NS_LOG_WARN ("Ignoring measId " << (uint16_t) measResults.measId);
516  }
517  else
518  {
519  std::map< uint16_t, uint8_t >::iterator it = m_ues.find (rnti);
520  if (it == m_ues.end ())
521  {
522  m_ues.insert (std::pair< uint16_t, uint8_t > (rnti, AreaUnset));
523  }
524  it = m_ues.find (rnti);
525 
526  if (measResults.rsrqResult < m_egdeSubBandThreshold)
527  {
528  if (it->second != CellEdge)
529  {
530  NS_LOG_INFO ("UE RNTI: " << rnti << " will be served in Edge sub-band");
531  it->second = CellEdge;
532 
533  LteRrcSap::PdschConfigDedicated pdschConfigDedicated;
534  pdschConfigDedicated.pa = m_edgePowerOffset;
535  m_ffrRrcSapUser->SetPdschConfigDedicated (rnti, pdschConfigDedicated);
536  }
537  }
538  else
539  {
540  if (it->second != CellCenter)
541  {
542  NS_LOG_INFO ("UE RNTI: " << rnti << " will be served in Center sub-band");
543  it->second = CellCenter;
544 
545  LteRrcSap::PdschConfigDedicated pdschConfigDedicated;
546  pdschConfigDedicated.pa = m_centerPowerOffset;
547  m_ffrRrcSapUser->SetPdschConfigDedicated (rnti, pdschConfigDedicated);
548  }
549  }
550  }
551 }
552 
553 void
555 {
556  NS_LOG_FUNCTION (this);
557  NS_LOG_WARN ("Method should not be called, because it is empty");
558 }
559 
560 } // end of namespace ns3
virtual void SetLteFfrRrcSapUser(LteFfrRrcSapUser *s)
Set the "user" part of the LteFfrRrcSap interface that this frequency reuse algorithm instance will i...
Service Access Point (SAP) offered by the Frequency Reuse algorithm instance to the eNodeB RRC instan...
virtual void DoInitialize(void)
Initialize() implementation.
Definition: object.cc:353
Template for the implementation of the LteFfrRrcSapProvider as a member of an owner class of type C t...
Service Access Point (SAP) offered by the eNodeB RRC instance to the Frequency Reuse algorithm instan...
Definition: lte-ffr-sap.h:132
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
static const struct ns3::FrSoftUplinkDefaultConfiguration g_frSoftUplinkDefaultConfiguration[]
virtual void SetLteFfrSapUser(LteFfrSapUser *s)
Set the "user" part of the LteFfrSap interface that this frequency reuse algorithm instance will inte...
AttributeValue implementation for Boolean.
Definition: boolean.h:34
void SetUplinkConfiguration(uint16_t cellId, uint8_t bandwidth)
virtual void DoReportDlCqiInfo(const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters &params)
DoReportDlCqiInfo.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:44
void SetDownlinkConfiguration(uint16_t cellId, uint8_t bandwidth)
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: boolean.h:81
enum ns3::LteRrcSap::ReportConfigEutra::@73 triggerQuantity
The quantities used to evaluate the triggering condition for the event, see 3GPP TS 36...
virtual LteFfrRrcSapProvider * GetLteFfrRrcSapProvider()
Export the "provider" part of the LteFfrRrcSap interface.
ThresholdEutra threshold1
Threshold for event A1, A2, A4, and A5.
Definition: lte-rrc-sap.h:339
Specifies criteria for triggering of an E-UTRA measurement reporting event.
Definition: lte-rrc-sap.h:321
LteFrSoftAlgorithm()
Creates a trivial ffr algorithm instance.
uint8_t m_ulBandwidth
uplink bandwidth in RBs
virtual uint8_t DoGetTpc(uint16_t rnti)
DoGetTpc for UE.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
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.
Definition: log.h:244
enum ns3::LteRrcSap::ThresholdEutra::@69 choice
LteFfrRrcSapProvider * m_ffrRrcSapProvider
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 SetPdschConfigDedicated(uint16_t rnti, LteRrcSap::PdschConfigDedicated pdschConfigDedicated)=0
Instruct the eNodeB RRC entity to perform RrcConnectionReconfiguration to inform UE about new PdschCo...
std::vector< bool > m_dlRbgMap
virtual std::vector< bool > DoGetAvailableUlRbg()
Implementation of LteFfrSapProvider::GetAvailableUlRbg.
Template for the implementation of the LteFfrSapProvider as a member of an owner class of type C to w...
Definition: lte-ffr-sap.h:146
LteFfrSapProvider * m_ffrSapProvider
LteFfrRrcSapUser * m_ffrRrcSapUser
Service Access Point (SAP) offered by the Frequency Reuse algorithm instance to the MAC Scheduler ins...
Definition: lte-ffr-sap.h:39
Hold an unsigned integer type.
Definition: uinteger.h:44
bool m_enabledInUplink
If true FR algorithm will also work in Uplink.
bool m_needReconfiguration
If true FR algorithm will be reconfigured.
virtual void Reconfigure()
Automatic FR reconfiguration.
virtual LteFfrSapProvider * GetLteFfrSapProvider()
Export the "provider" part of the LteFfrSap interface.
uint8_t m_dlBandwidth
downlink bandwidth in RBs
std::vector< bool > m_dlEdgeRbgMap
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:252
Every class exported by the ns3 library is enclosed in the ns3 namespace.
The abstract base class of a Frequency Reuse algorithm.
Ptr< const AttributeChecker > MakeBooleanChecker(void)
Definition: boolean.cc:121
static const struct ns3::FrSoftDownlinkDefaultConfiguration g_frSoftDownlinkDefaultConfiguration[]
enum ns3::LteRrcSap::ReportConfigEutra::@75 reportInterval
Indicates the interval between periodical reports.
std::map< uint16_t, uint8_t > m_ues
uint8_t range
Value range used in RSRP/RSRQ threshold.
Definition: lte-rrc-sap.h:317
virtual bool DoIsUlRbgAvailableForUe(int i, uint16_t rnti)
Implementation of LteFfrSapProvider::IsUlRbgAvailableForUe.
Service Access Point (SAP) offered by the eNodeB RRC instance to the Frequency Reuse algorithm instan...
virtual void DoReportUeMeas(uint16_t rnti, LteRrcSap::MeasResults measResults)
Implementation of LteFfrRrcSapProvider::ReportUeMeas.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:90
Parameters of the SCHED_DL_CQI_INFO_REQ primitive.
uint8_t m_frCellTypeId
FFR cell type ID for automatic configuration.
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.
Definition: log.h:228
std::vector< bool > m_ulEdgeRbgMap
virtual void DoInitialize()
Initialize() implementation.
int GetRbgSize(int dlbandwidth)
Get RBG size for DL Bandwidth according to table 7.1.6.1-1 of 36.213.
Parameters of the LOAD INFORMATION message.
Definition: epc-x2-sap.h:300
virtual std::vector< bool > DoGetAvailableDlRbg()
Implementation of LteFfrSapProvider::GetAvailableDlRbg.
RSRQ is used for the threshold.
Definition: lte-rrc-sap.h:315
virtual void DoDispose()
Destructor implementation.
const uint16_t NUM_DOWNLINK_CONFS(sizeof(g_ffrEnhancedDownlinkDefaultConfiguration)/sizeof(FfrEnhancedDownlinkDefaultConfiguration))
virtual uint8_t DoGetMinContinuousUlBandwidth()
DoGetMinContinuousUlBandwidth in number of RB.
Soft Frequency Reuse algorithm implementation.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: uinteger.h:45
a unique identifier for an interface.
Definition: type-id.h:58
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:904
Event A1: Serving becomes better than absolute threshold.
Definition: lte-rrc-sap.h:331
virtual void DoReportUlCqiInfo(const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters &params)
DoReportUlCqiInfo.
const uint16_t NUM_UPLINK_CONFS(sizeof(g_ffrEnhancedUplinkDefaultConfiguration)/sizeof(FfrEnhancedUplinkDefaultConfiguration))
std::vector< bool > m_ulRbgMap
Reference Signal Received Quality.
Definition: lte-rrc-sap.h:363
virtual void DoRecvLoadInformation(EpcX2Sap::LoadInformationParams params)
DoRecvLoadInformation.
virtual bool DoIsDlRbgAvailableForUe(int i, uint16_t rnti)
Implementation of LteFfrSapProvider::IsDlRbgAvailableForUe.