A Discrete-Event Network Simulator
API
no-op-component-carrier-manager.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Danilo Abrignani
3  * Copyright (c) 2016 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
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  * Authors: Danilo Abrignani <danilo.abrignani@unibo.it>
19  * Biljana Bojovic <biljana.bojovic@cttc.es>
20  *
21  */
22 
24 
25 #include <ns3/log.h>
26 #include <ns3/random-variable-stream.h>
27 
28 namespace ns3
29 {
30 
31 NS_LOG_COMPONENT_DEFINE("NoOpComponentCarrierManager");
32 NS_OBJECT_ENSURE_REGISTERED(NoOpComponentCarrierManager);
33 
35 {
36  NS_LOG_FUNCTION(this);
40  m_ccmRrcSapUser = nullptr;
41 }
42 
44 {
45  NS_LOG_FUNCTION(this);
46 }
47 
48 void
50 {
51  NS_LOG_FUNCTION(this);
52  delete m_ccmRrcSapProvider;
53  delete m_ccmMacSapUser;
54  delete m_macSapProvider;
55 }
56 
57 TypeId
59 {
60  static TypeId tid = TypeId("ns3::NoOpComponentCarrierManager")
62  .SetGroupName("Lte")
63  .AddConstructor<NoOpComponentCarrierManager>();
64  return tid;
65 }
66 
67 void
69 {
70  NS_LOG_FUNCTION(this);
72 }
73 
75 // MAC SAP
77 
78 void
80 {
81  NS_LOG_FUNCTION(this);
82  std::map<uint8_t, LteMacSapProvider*>::iterator it =
83  m_macSapProvidersMap.find(params.componentCarrierId);
85  "could not find Sap for ComponentCarrier " << params.componentCarrierId);
86  // with this algorithm all traffic is on Primary Carrier
87  it->second->TransmitPdu(params);
88 }
89 
90 void
93 {
94  NS_LOG_FUNCTION(this);
95  auto ueManager = m_ccmRrcSapUser->GetUeManager(params.rnti);
96  std::map<uint8_t, LteMacSapProvider*>::iterator it =
97  m_macSapProvidersMap.find(ueManager->GetComponentCarrierId());
98  NS_ASSERT_MSG(it != m_macSapProvidersMap.end(), "could not find Sap for ComponentCarrier ");
99  it->second->ReportBufferStatus(params);
100 }
101 
102 void
105 {
106  NS_LOG_FUNCTION(this);
107  NS_LOG_DEBUG(this << " rnti= " << txOpParams.rnti << " lcid= " << +txOpParams.lcid << " layer= "
108  << +txOpParams.layer << " ccId=" << +txOpParams.componentCarrierId);
109  m_ueInfo.at(txOpParams.rnti).m_ueAttached.at(txOpParams.lcid)->NotifyTxOpportunity(txOpParams);
110 }
111 
112 void
114 {
115  NS_LOG_FUNCTION(this);
116  auto lcidIt = m_ueInfo.at(rxPduParams.rnti).m_ueAttached.find(rxPduParams.lcid);
117  if (lcidIt != m_ueInfo.at(rxPduParams.rnti).m_ueAttached.end())
118  {
119  lcidIt->second->ReceivePdu(rxPduParams);
120  }
121 }
122 
123 void
125 {
126  NS_LOG_FUNCTION(this);
127 }
128 
129 void
131 {
132  NS_LOG_FUNCTION(this << rnti << (uint16_t)measResults.measId);
133 }
134 
135 void
136 NoOpComponentCarrierManager::DoAddUe(uint16_t rnti, uint8_t state)
137 {
138  NS_LOG_FUNCTION(this << rnti << (uint16_t)state);
139  std::map<uint16_t, uint8_t>::iterator eccIt; // m_enabledComponentCarrier iterator
140  auto ueInfoIt = m_ueInfo.find(rnti);
141  if (ueInfoIt == m_ueInfo.end())
142  {
143  NS_LOG_DEBUG(this << " UE " << rnti << " was not found, now it is added in the map");
144  UeInfo info;
145  info.m_ueState = state;
146 
147  // the Primary carrier (PC) is enabled by default
148  // on the PC the SRB0 and SRB1 are enabled when the Ue is connected
149  // these are hard-coded and the configuration not pass through the
150  // Component Carrier Manager which is responsible of configure
151  // only DataRadioBearer on the different Component Carrier
152  info.m_enabledComponentCarrier = 1;
153  m_ueInfo.emplace(rnti, info);
154  }
155  else
156  {
157  NS_LOG_DEBUG(this << " UE " << rnti << "found, updating the state from "
158  << +ueInfoIt->second.m_ueState << " to " << +state);
159  ueInfoIt->second.m_ueState = state;
160  }
161 }
162 
163 void
165 {
166  NS_LOG_FUNCTION(this);
167  m_ueInfo.at(lcInfo.rnti).m_rlcLcInstantiated.emplace(lcInfo.lcId, lcInfo);
168 }
169 
170 void
172 {
173  NS_LOG_FUNCTION(this);
174  auto rntiIt = m_ueInfo.find(rnti);
175  NS_ASSERT_MSG(rntiIt != m_ueInfo.end(), "request to remove UE info with unknown RNTI " << rnti);
176  m_ueInfo.erase(rntiIt);
177 }
178 
179 std::vector<LteCcmRrcSapProvider::LcsConfig>
181  uint8_t bearerId,
182  uint16_t rnti,
183  uint8_t lcid,
184  uint8_t lcGroup,
185  LteMacSapUser* msu)
186 {
187  NS_LOG_FUNCTION(this << rnti);
188  auto rntiIt = m_ueInfo.find(rnti);
189  NS_ASSERT_MSG(rntiIt != m_ueInfo.end(), "SetupDataRadioBearer on unknown RNTI " << rnti);
190 
191  // enable by default all carriers
192  rntiIt->second.m_enabledComponentCarrier = m_noOfComponentCarriers;
193 
194  std::vector<LteCcmRrcSapProvider::LcsConfig> res;
197  // NS_LOG_DEBUG (this << " componentCarrierEnabled " << (uint16_t) eccIt->second);
198  for (uint16_t ncc = 0; ncc < m_noOfComponentCarriers; ncc++)
199  {
200  // NS_LOG_DEBUG (this << " res size " << (uint16_t) res.size ());
202  lci.rnti = rnti;
203  lci.lcId = lcid;
204  lci.lcGroup = lcGroup;
205  lci.qci = bearer.qci;
206  if (ncc == 0)
207  {
208  lci.isGbr = bearer.IsGbr();
209  lci.mbrUl = bearer.gbrQosInfo.mbrUl;
210  lci.mbrDl = bearer.gbrQosInfo.mbrDl;
211  lci.gbrUl = bearer.gbrQosInfo.gbrUl;
212  lci.gbrDl = bearer.gbrQosInfo.gbrDl;
213  }
214  else
215  {
216  lci.isGbr = 0;
217  lci.mbrUl = 0;
218  lci.mbrDl = 0;
219  lci.gbrUl = 0;
220  lci.gbrDl = 0;
221  } // data flows only on PC
222  NS_LOG_DEBUG(this << " RNTI " << lci.rnti << "Lcid " << (uint16_t)lci.lcId << " lcGroup "
223  << (uint16_t)lci.lcGroup);
224  entry.componentCarrierId = ncc;
225  entry.lc = lci;
226  entry.msu = m_ccmMacSapUser;
227  res.push_back(entry);
228  } // end for
229 
230  auto lcidIt = rntiIt->second.m_rlcLcInstantiated.find(lcid);
231  if (lcidIt == rntiIt->second.m_rlcLcInstantiated.end())
232  {
233  lcinfo.rnti = rnti;
234  lcinfo.lcId = lcid;
235  lcinfo.lcGroup = lcGroup;
236  lcinfo.qci = bearer.qci;
237  lcinfo.isGbr = bearer.IsGbr();
238  lcinfo.mbrUl = bearer.gbrQosInfo.mbrUl;
239  lcinfo.mbrDl = bearer.gbrQosInfo.mbrDl;
240  lcinfo.gbrUl = bearer.gbrQosInfo.gbrUl;
241  lcinfo.gbrDl = bearer.gbrQosInfo.gbrDl;
242  rntiIt->second.m_rlcLcInstantiated.emplace(lcinfo.lcId, lcinfo);
243  rntiIt->second.m_ueAttached.emplace(lcinfo.lcId, msu);
244  }
245  else
246  {
247  NS_LOG_ERROR("LC already exists");
248  }
249  return res;
250 }
251 
252 std::vector<uint8_t>
254 {
255  NS_LOG_FUNCTION(this << rnti << +lcid);
256 
257  // Here we receive directly the RNTI and the LCID, instead of only DRB ID
258  // DRB ID are mapped as DRBID = LCID + 2
259  auto rntiIt = m_ueInfo.find(rnti);
260  NS_ASSERT_MSG(rntiIt != m_ueInfo.end(),
261  "request to Release Data Radio Bearer on UE with unknown RNTI " << rnti);
262 
263  NS_LOG_DEBUG(this << " remove LCID " << +lcid << " for RNTI " << rnti);
264  std::vector<uint8_t> res;
265  for (uint16_t i = 0; i < rntiIt->second.m_enabledComponentCarrier; i++)
266  {
267  res.insert(res.end(), i);
268  }
269 
270  auto lcIt = rntiIt->second.m_ueAttached.find(lcid);
271  NS_ASSERT_MSG(lcIt != rntiIt->second.m_ueAttached.end(), "Logical Channel not found");
272  rntiIt->second.m_ueAttached.erase(lcIt);
273 
274  auto rlcInstancesIt = rntiIt->second.m_rlcLcInstantiated.find(rnti);
275  NS_ASSERT_MSG(rlcInstancesIt != rntiIt->second.m_rlcLcInstantiated.end(),
276  "Logical Channel not found");
277  rntiIt->second.m_rlcLcInstantiated.erase(rlcInstancesIt);
278 
279  return res;
280 }
281 
284  LteMacSapUser* msu)
285 {
286  NS_LOG_FUNCTION(this);
287 
288  auto rntiIt = m_ueInfo.find(lcinfo.rnti);
289  NS_ASSERT_MSG(rntiIt != m_ueInfo.end(),
290  "request to add a signal bearer to unknown RNTI " << lcinfo.rnti);
291 
292  auto lcidIt = rntiIt->second.m_ueAttached.find(lcinfo.lcId);
293  if (lcidIt == rntiIt->second.m_ueAttached.end())
294  {
295  rntiIt->second.m_ueAttached.emplace(lcinfo.lcId, msu);
296  }
297  else
298  {
299  NS_LOG_ERROR("LC already exists");
300  }
301 
302  return m_ccmMacSapUser;
303 }
304 
305 void
306 NoOpComponentCarrierManager::DoNotifyPrbOccupancy(double prbOccupancy, uint8_t componentCarrierId)
307 {
308  NS_LOG_FUNCTION(this);
309  NS_LOG_DEBUG("Update PRB occupancy:" << prbOccupancy
310  << " at carrier:" << (uint32_t)componentCarrierId);
311  m_ccPrbOccupancy.insert(std::pair<uint8_t, double>(componentCarrierId, prbOccupancy));
312 }
313 
314 void
316 {
317  NS_LOG_FUNCTION(this);
318  NS_ASSERT_MSG(bsr.m_macCeType == MacCeListElement_s::BSR,
319  "Received a Control Message not allowed " << bsr.m_macCeType);
320  if (bsr.m_macCeType == MacCeListElement_s::BSR)
321  {
322  MacCeListElement_s newBsr;
323  newBsr.m_rnti = bsr.m_rnti;
324  newBsr.m_macCeType = bsr.m_macCeType;
325  newBsr.m_macCeValue.m_phr = bsr.m_macCeValue.m_phr;
327  newBsr.m_macCeValue.m_bufferStatus.resize(4);
328  for (uint16_t i = 0; i < 4; i++)
329  {
330  uint8_t bsrId = bsr.m_macCeValue.m_bufferStatus.at(i);
331  uint32_t buffer = BufferSizeLevelBsr::BsrId2BufferSize(bsrId);
332  // here the buffer should be divide among the different sap
333  // since the buffer status report are compressed information
334  // it is needed to use BsrId2BufferSize to uncompress
335  // after the split over all component carriers is is needed to
336  // compress again the information to fit MacCeListEkement_s structure
337  // verify how many Component Carrier are enabled per UE
338  // in this simple code the BufferStatus will be notify only
339  // to the primary carrier component
341  }
342  auto sapIt = m_ccmMacSapProviderMap.find(componentCarrierId);
343  if (sapIt == m_ccmMacSapProviderMap.end())
344  {
345  NS_FATAL_ERROR("Sap not found in the CcmMacSapProviderMap");
346  }
347  else
348  {
349  // in the current implementation bsr in uplink is forwarded only to the primary carrier.
350  // above code demonstrates how to resize buffer status if more carriers are being used
351  // in future
352  sapIt->second->ReportMacCeToScheduler(newBsr);
353  }
354  }
355  else
356  {
357  NS_FATAL_ERROR("Expected BSR type of message.");
358  }
359 }
360 
361 void
362 NoOpComponentCarrierManager::DoUlReceiveSr(uint16_t rnti, uint8_t componentCarrierId)
363 {
364  NS_LOG_FUNCTION(this);
365 
366  auto sapIt = m_ccmMacSapProviderMap.find(componentCarrierId);
368  "Sap not found in the CcmMacSapProviderMap");
369 
370  sapIt->second->ReportSrToScheduler(rnti);
371 }
372 
374 
376 
378 {
379  NS_LOG_FUNCTION(this);
380 }
381 
383 {
384  NS_LOG_FUNCTION(this);
385 }
386 
387 TypeId
389 {
390  static TypeId tid = TypeId("ns3::RrComponentCarrierManager")
392  .SetGroupName("Lte")
393  .AddConstructor<RrComponentCarrierManager>();
394  return tid;
395 }
396 
397 void
400 {
401  NS_LOG_FUNCTION(this);
402 
403  uint32_t numberOfCarriersForUe = m_ueInfo.at(params.rnti).m_enabledComponentCarrier;
404  if (params.lcid == 0 || params.lcid == 1 || numberOfCarriersForUe == 1)
405  {
406  NS_LOG_INFO("Buffer status forwarded to the primary carrier.");
407  auto ueManager = m_ccmRrcSapUser->GetUeManager(params.rnti);
408  m_macSapProvidersMap.at(ueManager->GetComponentCarrierId())->ReportBufferStatus(params);
409  }
410  else
411  {
412  params.retxQueueSize /= numberOfCarriersForUe;
413  params.txQueueSize /= numberOfCarriersForUe;
414  for (uint32_t i = 0; i < numberOfCarriersForUe; i++)
415  {
417  "Mac sap provider does not exist.");
418  m_macSapProvidersMap.at(i)->ReportBufferStatus(params);
419  }
420  }
421 }
422 
423 void
425 {
426  NS_LOG_FUNCTION(this);
427  NS_ASSERT_MSG(componentCarrierId == 0,
428  "Received BSR from a ComponentCarrier not allowed, ComponentCarrierId = "
429  << componentCarrierId);
430  NS_ASSERT_MSG(bsr.m_macCeType == MacCeListElement_s::BSR,
431  "Received a Control Message not allowed " << bsr.m_macCeType);
432 
433  // split traffic in uplink equally among carriers
434  uint32_t numberOfCarriersForUe = m_ueInfo.at(bsr.m_rnti).m_enabledComponentCarrier;
435 
436  if (bsr.m_macCeType == MacCeListElement_s::BSR)
437  {
438  MacCeListElement_s newBsr;
439  newBsr.m_rnti = bsr.m_rnti;
440  // mac control element type, values can be BSR, PHR, CRNTI
441  newBsr.m_macCeType = bsr.m_macCeType;
442  // the power headroom, 64 means no valid phr is available
443  newBsr.m_macCeValue.m_phr = bsr.m_macCeValue.m_phr;
444  // indicates that the CRNTI MAC CE was received. The value is not used.
446  // and value 64 means that the buffer status should not be updated
447  newBsr.m_macCeValue.m_bufferStatus.resize(4);
448  // always all 4 LCGs are present see 6.1.3.1 of 3GPP TS 36.321.
449  for (uint16_t i = 0; i < 4; i++)
450  {
451  uint8_t bsrStatusId = bsr.m_macCeValue.m_bufferStatus.at(i);
452  uint32_t bufferSize = BufferSizeLevelBsr::BsrId2BufferSize(bsrStatusId);
453  // here the buffer should be divide among the different sap
454  // since the buffer status report are compressed information
455  // it is needed to use BsrId2BufferSize to uncompress
456  // after the split over all component carriers is is needed to
457  // compress again the information to fit MacCeListElement_s structure
458  // verify how many Component Carrier are enabled per UE
459  newBsr.m_macCeValue.m_bufferStatus.at(i) =
460  BufferSizeLevelBsr::BufferSize2BsrId(bufferSize / numberOfCarriersForUe);
461  }
462  // notify MAC of each component carrier that is enabled for this UE
463  for (uint32_t i = 0; i < numberOfCarriersForUe; i++)
464  {
466  "Mac sap provider does not exist.");
467  m_ccmMacSapProviderMap.find(i)->second->ReportMacCeToScheduler(newBsr);
468  }
469  }
470  else
471  {
472  auto ueManager = m_ccmRrcSapUser->GetUeManager(bsr.m_rnti);
473  m_ccmMacSapProviderMap.at(ueManager->GetComponentCarrierId())->ReportMacCeToScheduler(bsr);
474  }
475 }
476 
477 void
478 RrComponentCarrierManager::DoUlReceiveSr(uint16_t rnti, uint8_t /* componentCarrierId */)
479 {
480  NS_LOG_FUNCTION(this);
481  // split traffic in uplink equally among carriers
482  uint32_t numberOfCarriersForUe = m_ueInfo.at(rnti).m_enabledComponentCarrier;
483 
484  m_ccmMacSapProviderMap.find(m_lastCcIdForSr)->second->ReportSrToScheduler(rnti);
485 
486  m_lastCcIdForSr++;
487  if (m_lastCcIdForSr > numberOfCarriersForUe - 1)
488  {
489  m_lastCcIdForSr = 0;
490  }
491 }
492 
493 } // end of namespace ns3
static uint8_t BufferSize2BsrId(uint32_t val)
Convert Buffer size to BSR ID.
Definition: lte-common.cc:183
static uint32_t BsrId2BufferSize(uint8_t val)
Convert BSR ID to buffer size.
Definition: lte-common.cc:176
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:91
Qci qci
Qos class indicator.
Definition: eps-bearer.h:137
bool IsGbr() const
Definition: eps-bearer.cc:122
GbrQosInformation gbrQosInfo
GBR QOS information.
Definition: eps-bearer.h:139
virtual Ptr< UeManager > GetUeManager(uint16_t rnti)=0
Get UE manager by RNTI.
The class implements Component Carrier Manager (CCM) that operates using the Component Carrier Manage...
std::map< uint16_t, UeInfo > m_ueInfo
The map from RNTI to UE information.
LteCcmRrcSapProvider * m_ccmRrcSapProvider
A pointer to the SAP interface of the CCM instance to receive API calls from the eNodeB RRC instance.
LteMacSapProvider * m_macSapProvider
A pointer to main SAP interface of the MAC instance, which is in this case handled by CCM.
std::map< uint8_t, LteMacSapProvider * > m_macSapProvidersMap
A map of pointers to real SAP interfaces of MAC instances.
uint16_t m_noOfComponentCarriers
The number component of carriers that are supported by this eNb.
std::map< uint8_t, LteCcmMacSapProvider * > m_ccmMacSapProviderMap
A map of pointers to the SAP interfaces of CCM instance that provides the CCM specific functionalitie...
LteCcmMacSapUser * m_ccmMacSapUser
LteCcmMacSapUser is extended version of LteMacSapUser interface.
LteCcmRrcSapUser * m_ccmRrcSapUser
A pointer to SAP interface of RRC instance, i.e.
Service Access Point (SAP) offered by the MAC to the RLC See Femto Forum MAC Scheduler Interface Spec...
Definition: lte-mac-sap.h:96
The default component carrier manager that forwards all traffic, the uplink and the downlink,...
void DoDispose() override
Destructor implementation.
virtual LteMacSapUser * DoConfigureSignalBearer(LteEnbCmacSapProvider::LcInfo lcinfo, LteMacSapUser *msu)
Configure the signal bearer.
std::map< uint8_t, double > m_ccPrbOccupancy
The physical resource block occupancy per carrier.
virtual void DoNotifyPrbOccupancy(double prbOccupancy, uint8_t componentCarrierId)
Function implements the function of the SAP interface of CCM instance which is used by MAC to notify ...
friend class MemberLteCcmRrcSapProvider< NoOpComponentCarrierManager >
allow MemberLteCcmRrcSapProvider<NoOpComponentCarrierManager> class friend access
virtual void DoTransmitPdu(LteMacSapProvider::TransmitPduParameters params)
Transmit PDU.
void DoReportUeMeas(uint16_t rnti, LteRrcSap::MeasResults measResults) override
Implementation of ReportUeMeas.
virtual void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters params)
Report buffer status.
virtual void DoAddLc(LteEnbCmacSapProvider::LcInfo lcInfo, LteMacSapUser *msu)
Add LC.
virtual void DoRemoveUe(uint16_t rnti)
Remove UE.
virtual void DoAddUe(uint16_t rnti, uint8_t state)
Add UE.
virtual void DoNotifyTxOpportunity(LteMacSapUser::TxOpportunityParameters txOpParams)
Notify transmit opportunity.
virtual void DoUlReceiveSr(uint16_t rnti, uint8_t componentCarrierId)
Forward uplink SR to CCM, called by MAC through CCM SAP interface.
friend class MemberLteCcmMacSapUser< NoOpComponentCarrierManager >
allow MemberLteCcmMacSapUser<NoOpComponentCarrierManager> class friend access
virtual void DoUlReceiveMacCe(MacCeListElement_s bsr, uint8_t componentCarrierId)
Forwards uplink BSR to CCM, called by MAC through CCM SAP interface.
friend class EnbMacMemberLteMacSapProvider< NoOpComponentCarrierManager >
allow EnbMacMemberLteMacSapProvider<NoOpComponentCarrierManager> class friend access
virtual std::vector< uint8_t > DoReleaseDataRadioBearer(uint16_t rnti, uint8_t lcid)
Release data radio bearer.
virtual void DoReceivePdu(LteMacSapUser::ReceivePduParameters rxPduParams)
Receive PDU.
virtual std::vector< LteCcmRrcSapProvider::LcsConfig > DoSetupDataRadioBearer(EpsBearer bearer, uint8_t bearerId, uint16_t rnti, uint8_t lcid, uint8_t lcGroup, LteMacSapUser *msu)
Setup data radio bearer.
void DoInitialize() override
Initialize() implementation.
virtual void DoNotifyHarqDeliveryFailure()
Notify HARQ delivery failure.
virtual void DoInitialize()
Initialize() implementation.
Definition: object.cc:360
Component carrier manager implementation that splits traffic equally among carriers.
void DoUlReceiveMacCe(MacCeListElement_s bsr, uint8_t componentCarrierId) override
Forwards uplink BSR to CCM, called by MAC through CCM SAP interface.
static TypeId GetTypeId()
Get the type ID.
void DoUlReceiveSr(uint16_t rnti, uint8_t componentCarrierId) override
Forward uplink SR to CCM, called by MAC through CCM SAP interface.
uint8_t m_lastCcIdForSr
Last CCID to which a SR was routed.
void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters params) override
Report buffer status.
a unique identifier for an interface.
Definition: type-id.h:60
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:935
#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:86
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:179
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
Definition: log.h:254
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:268
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:275
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:46
Every class exported by the ns3 library is enclosed in the ns3 namespace.
params
Fit Fluctuating Two Ray model to the 3GPP TR 38.901 using the Anderson-Darling goodness-of-fit ##.
uint64_t gbrDl
Guaranteed Bit Rate (bit/s) in downlink.
Definition: eps-bearer.h:42
uint64_t gbrUl
Guaranteed Bit Rate (bit/s) in uplink.
Definition: eps-bearer.h:43
uint64_t mbrDl
Maximum Bit Rate (bit/s) in downlink.
Definition: eps-bearer.h:44
uint64_t mbrUl
Maximum Bit Rate (bit/s) in uplink.
Definition: eps-bearer.h:45
uint16_t componentCarrierId
component carrier ID
LteEnbCmacSapProvider::LcInfo lc
LC info.
Logical Channel information to be passed to CmacSapProvider::ConfigureLc.
uint64_t gbrUl
guaranteed bitrate in uplink
uint8_t qci
QoS Class Identifier.
uint64_t mbrDl
maximum bitrate in downlink
uint64_t mbrUl
maximum bitrate in uplink
uint8_t lcGroup
logical channel group
uint64_t gbrDl
guaranteed bitrate in downlink
uint8_t lcId
logical channel identifier
bool isGbr
true if the bearer is GBR, false if the bearer is NON-GBR
uint16_t rnti
C-RNTI identifying the UE.
uint8_t m_enabledComponentCarrier
The number of enabled component carriers.
Parameters for LteMacSapProvider::ReportBufferStatus.
Definition: lte-mac-sap.h:69
Parameters for LteMacSapProvider::TransmitPdu.
Definition: lte-mac-sap.h:45
Parameters for LteMacSapUser::ReceivePdu.
Definition: lte-mac-sap.h:166
uint8_t lcid
the logical channel id
Definition: lte-mac-sap.h:189
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-mac-sap.h:188
Parameters for LteMacSapUser::NotifyTxOpportunity.
Definition: lte-mac-sap.h:105
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-mac-sap.h:141
uint8_t componentCarrierId
the component carrier id
Definition: lte-mac-sap.h:140
uint8_t layer
the layer of transmission (MIMO)
Definition: lte-mac-sap.h:138
uint8_t lcid
the logical channel id
Definition: lte-mac-sap.h:142
MeasResults structure.
Definition: lte-rrc-sap.h:717
uint8_t measId
measure ID
Definition: lte-rrc-sap.h:718
See section 4.3.14 macCEListElement.
struct MacCeValue_u m_macCeValue
MAC CE value.
std::vector< uint8_t > m_bufferStatus
buffer status
uint8_t m_crnti
NRTI.