A Discrete-Event Network Simulator
API
no-op-component-carrier-manager.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2015 Danilo Abrignani
4  * Copyright (c) 2016 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  * Authors: Danilo Abrignani <danilo.abrignani@unibo.it>
20  * Biljana Bojovic <biljana.bojovic@cttc.es>
21  *
22  */
23 
25 #include <ns3/log.h>
26 #include <ns3/random-variable-stream.h>
27 
28 namespace ns3 {
29 
30 NS_LOG_COMPONENT_DEFINE ("NoOpComponentCarrierManager");
31 NS_OBJECT_ENSURE_REGISTERED (NoOpComponentCarrierManager);
32 
34 {
35  NS_LOG_FUNCTION (this);
39  m_ccmRrcSapUser = 0;
40 }
41 
43 {
44  NS_LOG_FUNCTION (this);
45 }
46 
47 void
49 {
50  NS_LOG_FUNCTION (this);
51  delete m_ccmRrcSapProvider;
52  delete m_ccmMacSapUser;
53  delete m_macSapProvider;
54 }
55 
56 
57 TypeId
59 {
60  static TypeId tid = TypeId ("ns3::NoOpComponentCarrierManager")
62  .SetGroupName("Lte")
63  .AddConstructor<NoOpComponentCarrierManager> ()
64  ;
65  return tid;
66 }
67 
68 
69 void
71 {
72  NS_LOG_FUNCTION (this);
74 }
75 
77 // MAC SAP
79 
80 
81 void
83 {
84  NS_LOG_FUNCTION (this);
85  std::map <uint8_t, LteMacSapProvider*>::iterator it = m_macSapProvidersMap.find (params.componentCarrierId);
86  NS_ASSERT_MSG (it != m_macSapProvidersMap.end (), "could not find Sap for ComponentCarrier " << params.componentCarrierId);
87  // with this algorithm all traffic is on Primary Carrier
88  it->second->TransmitPdu (params);
89 }
90 
91 void
93 {
94  NS_LOG_FUNCTION (this);
95  auto ueManager = m_ccmRrcSapUser->GetUeManager (params.rnti);
96  std::map <uint8_t, LteMacSapProvider*>::iterator it = m_macSapProvidersMap.find (ueManager->GetComponentCarrierId ());
97  NS_ASSERT_MSG (it != m_macSapProvidersMap.end (), "could not find Sap for ComponentCarrier ");
98  it->second->ReportBufferStatus (params);
99 }
100 
101 void
103 {
104  NS_LOG_FUNCTION (this);
105  NS_LOG_DEBUG (this << " rnti= " << txOpParams.rnti << " lcid= " << +txOpParams.lcid << " layer= " << +txOpParams.layer << " ccId=" << +txOpParams.componentCarrierId);
106  m_ueInfo.at (txOpParams.rnti).m_ueAttached.at (txOpParams.lcid)->NotifyTxOpportunity (txOpParams);
107 }
108 
109 void
111 {
112  NS_LOG_FUNCTION (this);
113  auto lcidIt = m_ueInfo.at (rxPduParams.rnti).m_ueAttached.find (rxPduParams.lcid);
114  if (lcidIt != m_ueInfo.at (rxPduParams.rnti).m_ueAttached.end ())
115  {
116  lcidIt->second->ReceivePdu (rxPduParams);
117  }
118 }
119 
120 void
122 {
123  NS_LOG_FUNCTION (this);
124 }
125 
126 void
128  LteRrcSap::MeasResults measResults)
129 {
130  NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
131 }
132 
133 void
134 NoOpComponentCarrierManager::DoAddUe (uint16_t rnti, uint8_t state)
135 {
136  NS_LOG_FUNCTION (this << rnti << (uint16_t) state);
137  std::map<uint16_t, uint8_t>::iterator eccIt; // m_enabledComponentCarrier iterator
138  auto ueInfoIt = m_ueInfo.find (rnti);
139  if (ueInfoIt == m_ueInfo.end ())
140  {
141  NS_LOG_DEBUG (this << " UE " << rnti << " was not found, now it is added in the map");
142  UeInfo info;
143  info.m_ueState = state;
144 
145  // the Primary carrier (PC) is enabled by default
146  // on the PC the SRB0 and SRB1 are enabled when the Ue is connected
147  // these are hard-coded and the configuration not pass through the
148  // Component Carrier Manager which is responsible of configure
149  // only DataRadioBearer on the different Component Carrier
150  info.m_enabledComponentCarrier = 1;
151  m_ueInfo.emplace (rnti, info);
152  }
153  else
154  {
155  NS_LOG_DEBUG (this << " UE " << rnti << "found, updating the state from " << +ueInfoIt->second.m_ueState << " to " << +state);
156  ueInfoIt->second.m_ueState = state;
157  }
158 }
159 
160 void
162 {
163  NS_LOG_FUNCTION (this);
164  m_ueInfo.at (lcInfo.rnti).m_rlcLcInstantiated.emplace (lcInfo.lcId, lcInfo);
165 }
166 
167 
168 void
170 {
171  NS_LOG_FUNCTION (this);
172  auto rntiIt = m_ueInfo.find (rnti);
173  NS_ASSERT_MSG (rntiIt != m_ueInfo.end (), "request to remove UE info with unknown RNTI " << rnti);
174  m_ueInfo.erase (rntiIt);
175 }
176 
177 std::vector<LteCcmRrcSapProvider::LcsConfig>
178 NoOpComponentCarrierManager::DoSetupDataRadioBearer (EpsBearer bearer, uint8_t bearerId, uint16_t rnti, uint8_t lcid, uint8_t lcGroup, LteMacSapUser *msu)
179 {
180  NS_LOG_FUNCTION (this << rnti);
181  auto rntiIt = m_ueInfo.find (rnti);
182  NS_ASSERT_MSG (rntiIt != m_ueInfo.end (), "SetupDataRadioBearer on unknown RNTI " << rnti);
183 
184  // enable by default all carriers
185  rntiIt->second.m_enabledComponentCarrier = m_noOfComponentCarriers;
186 
187  std::vector<LteCcmRrcSapProvider::LcsConfig> res;
190  // NS_LOG_DEBUG (this << " componentCarrierEnabled " << (uint16_t) eccIt->second);
191  for (uint16_t ncc = 0; ncc < m_noOfComponentCarriers; ncc++)
192  {
193  // NS_LOG_DEBUG (this << " res size " << (uint16_t) res.size ());
195  lci.rnti = rnti;
196  lci.lcId = lcid;
197  lci.lcGroup = lcGroup;
198  lci.qci = bearer.qci;
199  if (ncc == 0)
200  {
201  lci.isGbr = bearer.IsGbr ();
202  lci.mbrUl = bearer.gbrQosInfo.mbrUl;
203  lci.mbrDl = bearer.gbrQosInfo.mbrDl;
204  lci.gbrUl = bearer.gbrQosInfo.gbrUl;
205  lci.gbrDl = bearer.gbrQosInfo.gbrDl;
206  }
207  else
208  {
209  lci.isGbr = 0;
210  lci.mbrUl = 0;
211  lci.mbrDl = 0;
212  lci.gbrUl = 0;
213  lci.gbrDl = 0;
214  } // data flows only on PC
215  NS_LOG_DEBUG (this << " RNTI " << lci.rnti << "Lcid " << (uint16_t) lci.lcId << " lcGroup " << (uint16_t) lci.lcGroup);
216  entry.componentCarrierId = ncc;
217  entry.lc = lci;
218  entry.msu = m_ccmMacSapUser;
219  res.push_back (entry);
220  } // end for
221 
222  auto lcidIt = rntiIt->second.m_rlcLcInstantiated.find (lcid);
223  if (lcidIt == rntiIt->second.m_rlcLcInstantiated.end ())
224  {
225  lcinfo.rnti = rnti;
226  lcinfo.lcId = lcid;
227  lcinfo.lcGroup = lcGroup;
228  lcinfo.qci = bearer.qci;
229  lcinfo.isGbr = bearer.IsGbr ();
230  lcinfo.mbrUl = bearer.gbrQosInfo.mbrUl;
231  lcinfo.mbrDl = bearer.gbrQosInfo.mbrDl;
232  lcinfo.gbrUl = bearer.gbrQosInfo.gbrUl;
233  lcinfo.gbrDl = bearer.gbrQosInfo.gbrDl;
234  rntiIt->second.m_rlcLcInstantiated.emplace (lcinfo.lcId, lcinfo);
235  rntiIt->second.m_ueAttached.emplace (lcinfo.lcId, msu);
236  }
237  else
238  {
239  NS_LOG_ERROR ("LC already exists");
240  }
241  return res;
242 
243 }
244 
245 std::vector<uint8_t>
247 {
248  NS_LOG_FUNCTION (this << rnti << +lcid);
249 
250  // Here we receive directly the RNTI and the LCID, instead of only DRB ID
251  // DRB ID are mapped as DRBID = LCID + 2
252  auto rntiIt = m_ueInfo.find (rnti);
253  NS_ASSERT_MSG (rntiIt != m_ueInfo.end (), "request to Release Data Radio Bearer on UE with unknown RNTI " << rnti);
254 
255  NS_LOG_DEBUG (this << " remove LCID " << +lcid << " for RNTI " << rnti);
256  std::vector<uint8_t> res;
257  for (uint16_t i = 0; i < rntiIt->second.m_enabledComponentCarrier; i++)
258  {
259  res.insert (res.end (), i);
260  }
261 
262  auto lcIt = rntiIt->second.m_ueAttached.find (lcid);
263  NS_ASSERT_MSG (lcIt != rntiIt->second.m_ueAttached.end (), "Logical Channel not found");
264  rntiIt->second.m_ueAttached.erase (lcIt);
265 
266  auto rlcInstancesIt = rntiIt->second.m_rlcLcInstantiated.find (rnti);
267  NS_ASSERT_MSG (rlcInstancesIt != rntiIt->second.m_rlcLcInstantiated.end (), "Logical Channel not found");
268  rntiIt->second.m_rlcLcInstantiated.erase (rlcInstancesIt);
269 
270  return res;
271 }
272 
275 {
276  NS_LOG_FUNCTION (this);
277 
278  auto rntiIt = m_ueInfo.find (lcinfo.rnti);
279  NS_ASSERT_MSG (rntiIt != m_ueInfo.end (), "request to add a signal bearer to unknown RNTI " << lcinfo.rnti);
280 
281  auto lcidIt = rntiIt->second.m_ueAttached.find (lcinfo.lcId);
282  if (lcidIt == rntiIt->second.m_ueAttached.end ())
283  {
284  rntiIt->second.m_ueAttached.emplace (lcinfo.lcId, msu);
285  }
286  else
287  {
288  NS_LOG_ERROR ("LC already exists");
289  }
290 
291  return m_ccmMacSapUser;
292 }
293 
294 void
295 NoOpComponentCarrierManager::DoNotifyPrbOccupancy (double prbOccupancy, uint8_t componentCarrierId)
296 {
297  NS_LOG_FUNCTION (this);
298  NS_LOG_DEBUG ("Update PRB occupancy:"<<prbOccupancy<<" at carrier:"<< (uint32_t) componentCarrierId);
299  m_ccPrbOccupancy.insert(std::pair<uint8_t, double> (componentCarrierId, prbOccupancy));
300 }
301 
302 void
304 {
305  NS_LOG_FUNCTION (this);
306  NS_ASSERT_MSG (bsr.m_macCeType == MacCeListElement_s::BSR, "Received a Control Message not allowed " << bsr.m_macCeType);
307  if ( bsr.m_macCeType == MacCeListElement_s::BSR)
308  {
309  MacCeListElement_s newBsr;
310  newBsr.m_rnti = bsr.m_rnti;
311  newBsr.m_macCeType = bsr.m_macCeType;
312  newBsr.m_macCeValue.m_phr = bsr.m_macCeValue.m_phr;
314  newBsr.m_macCeValue.m_bufferStatus.resize (4);
315  for (uint16_t i = 0; i < 4; i++)
316  {
317  uint8_t bsrId = bsr.m_macCeValue.m_bufferStatus.at (i);
318  uint32_t buffer = BufferSizeLevelBsr::BsrId2BufferSize (bsrId);
319  // here the buffer should be divide among the different sap
320  // since the buffer status report are compressed information
321  // it is needed to use BsrId2BufferSize to uncompress
322  // after the split over all component carriers is is needed to
323  // compress again the information to fit MacCeListEkement_s structure
324  // verify how many Component Carrier are enabled per UE
325  // in this simple code the BufferStatus will be notify only
326  // to the primary carrier component
328  }
329  auto sapIt = m_ccmMacSapProviderMap.find (componentCarrierId);
330  if (sapIt == m_ccmMacSapProviderMap.end ())
331  {
332  NS_FATAL_ERROR ("Sap not found in the CcmMacSapProviderMap");
333  }
334  else
335  {
336  // in the current implementation bsr in uplink is forwarded only to the primary carrier.
337  // above code demonstrates how to resize buffer status if more carriers are being used in future
338  sapIt->second->ReportMacCeToScheduler (newBsr);
339  }
340  }
341  else
342  {
343  NS_FATAL_ERROR ("Expected BSR type of message.");
344  }
345 }
346 
347 void
348 NoOpComponentCarrierManager::DoUlReceiveSr (uint16_t rnti, uint8_t componentCarrierId)
349 {
350  NS_LOG_FUNCTION (this);
351 
352  auto sapIt = m_ccmMacSapProviderMap.find (componentCarrierId);
353  NS_ABORT_MSG_IF (sapIt == m_ccmMacSapProviderMap.end (),
354  "Sap not found in the CcmMacSapProviderMap");
355 
356  sapIt->second->ReportSrToScheduler (rnti);
357 }
358 
359 
361 
363 
365 {
366  NS_LOG_FUNCTION (this);
367 
368 }
369 
371 {
372  NS_LOG_FUNCTION (this);
373 }
374 
375 TypeId
377 {
378  static TypeId tid = TypeId ("ns3::RrComponentCarrierManager")
380  .SetGroupName("Lte")
381  .AddConstructor<RrComponentCarrierManager> ()
382  ;
383  return tid;
384 }
385 
386 
387 void
389 {
390  NS_LOG_FUNCTION (this);
391 
392  uint32_t numberOfCarriersForUe = m_ueInfo.at (params.rnti).m_enabledComponentCarrier;
393  if (params.lcid == 0 || params.lcid == 1 || numberOfCarriersForUe == 1)
394  {
395  NS_LOG_INFO("Buffer status forwarded to the primary carrier.");
396  auto ueManager = m_ccmRrcSapUser->GetUeManager (params.rnti);
397  m_macSapProvidersMap.at (ueManager->GetComponentCarrierId ())->ReportBufferStatus (params);
398  }
399  else
400  {
401  params.retxQueueSize /= numberOfCarriersForUe;
402  params.txQueueSize /= numberOfCarriersForUe;
403  for ( uint16_t i = 0; i < numberOfCarriersForUe ; i++)
404  {
405  NS_ASSERT_MSG (m_macSapProvidersMap.find(i)!=m_macSapProvidersMap.end(), "Mac sap provider does not exist.");
406  m_macSapProvidersMap.at (i)->ReportBufferStatus(params);
407  }
408  }
409 }
410 
411 
412 void
414 {
415  NS_LOG_FUNCTION (this);
416  NS_ASSERT_MSG (componentCarrierId == 0, "Received BSR from a ComponentCarrier not allowed, ComponentCarrierId = " << componentCarrierId);
417  NS_ASSERT_MSG (bsr.m_macCeType == MacCeListElement_s::BSR, "Received a Control Message not allowed " << bsr.m_macCeType);
418 
419  // split traffic in uplink equally among carriers
420  uint32_t numberOfCarriersForUe = m_ueInfo.at (bsr.m_rnti).m_enabledComponentCarrier;
421 
422  if ( bsr.m_macCeType == MacCeListElement_s::BSR)
423  {
424  MacCeListElement_s newBsr;
425  newBsr.m_rnti = bsr.m_rnti;
426  // mac control element type, values can be BSR, PHR, CRNTI
427  newBsr.m_macCeType = bsr.m_macCeType;
428  // the power headroom, 64 means no valid phr is available
429  newBsr.m_macCeValue.m_phr = bsr.m_macCeValue.m_phr;
430  // indicates that the CRNTI MAC CE was received. The value is not used.
432  // and value 64 means that the buffer status should not be updated
433  newBsr.m_macCeValue.m_bufferStatus.resize (4);
434  // always all 4 LCGs are present see 6.1.3.1 of 3GPP TS 36.321.
435  for (uint16_t i = 0; i < 4; i++)
436  {
437  uint8_t bsrStatusId = bsr.m_macCeValue.m_bufferStatus.at (i);
438  uint32_t bufferSize = BufferSizeLevelBsr::BsrId2BufferSize (bsrStatusId);
439  // here the buffer should be divide among the different sap
440  // since the buffer status report are compressed information
441  // it is needed to use BsrId2BufferSize to uncompress
442  // after the split over all component carriers is is needed to
443  // compress again the information to fit MacCeListElement_s structure
444  // verify how many Component Carrier are enabled per UE
445  newBsr.m_macCeValue.m_bufferStatus.at(i) = BufferSizeLevelBsr::BufferSize2BsrId (bufferSize/numberOfCarriersForUe);
446  }
447  // notify MAC of each component carrier that is enabled for this UE
448  for ( uint16_t i = 0; i < numberOfCarriersForUe ; i++)
449  {
450  NS_ASSERT_MSG (m_ccmMacSapProviderMap.find(i)!=m_ccmMacSapProviderMap.end(), "Mac sap provider does not exist.");
451  m_ccmMacSapProviderMap.find(i)->second->ReportMacCeToScheduler(newBsr);
452  }
453  }
454  else
455  {
456  auto ueManager = m_ccmRrcSapUser->GetUeManager (bsr.m_rnti);
457  m_ccmMacSapProviderMap.at (ueManager->GetComponentCarrierId ())->ReportMacCeToScheduler (bsr);
458  }
459 }
460 
461 void
462 RrComponentCarrierManager::DoUlReceiveSr(uint16_t rnti, [[maybe_unused]] uint8_t componentCarrierId)
463 {
464  NS_LOG_FUNCTION (this);
465  // split traffic in uplink equally among carriers
466  uint32_t numberOfCarriersForUe = m_ueInfo.at (rnti).m_enabledComponentCarrier;
467 
468  m_ccmMacSapProviderMap.find (m_lastCcIdForSr)->second->ReportSrToScheduler (rnti);
469 
470  m_lastCcIdForSr++;
471  if (m_lastCcIdForSr > numberOfCarriersForUe - 1)
472  {
473  m_lastCcIdForSr = 0;
474  }
475 }
476 
477 } // end of namespace ns3
static uint8_t BufferSize2BsrId(uint32_t val)
Convert Buffer size to BSR ID.
Definition: lte-common.cc:191
static uint32_t BsrId2BufferSize(uint8_t val)
Convert BSR ID to buffer size.
Definition: lte-common.cc:184
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:92
enum ns3::EpsBearer::Qci qci
Qos class indicator.
bool IsGbr() const
Definition: eps-bearer.cc:119
GbrQosInformation gbrQosInfo
GBR QOS information.
Definition: eps-bearer.h:131
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.
std::map< uint8_t, LteCcmMacSapProvider * > m_ccmMacSapProviderMap
A map of pointers to the SAP interfaces of CCM instance that provides the CCM specific functionalitie...
uint16_t m_noOfComponentCarriers
The number component of carriers that are supported by this eNb.
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,...
virtual LteMacSapUser * DoConfigureSignalBearer(LteEnbCmacSapProvider::LcInfo lcinfo, LteMacSapUser *msu)
Configure the signal bearer.
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.
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 DoDispose()
Destructor implementation.
std::map< uint8_t, double > m_ccPrbOccupancy
The physical resource block occupancy per carrier.
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.
virtual void DoInitialize()
Initialize() implementation.
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.
virtual void DoReportUeMeas(uint16_t rnti, LteRrcSap::MeasResults measResults)
Implementation of ReportUeMeas.
virtual void DoNotifyHarqDeliveryFailure()
Notify HARQ delivery failure.
virtual void DoInitialize(void)
Initialize() implementation.
Definition: object.cc:353
Component carrier manager implementation that splits traffic equally among carriers.
virtual 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.
virtual 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.
virtual void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters params) override
Report buffer status.
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
#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:88
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#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:257
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#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:281
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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:68
uint32_t txQueueSize
the current size of the RLC transmission queue
Definition: lte-mac-sap.h:71
uint32_t retxQueueSize
the current size of the RLC retransmission queue in bytes
Definition: lte-mac-sap.h:73
uint8_t lcid
the logical channel id corresponding to the sending RLC instance
Definition: lte-mac-sap.h:70
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-mac-sap.h:69
Parameters for LteMacSapProvider::TransmitPdu.
Definition: lte-mac-sap.h:46
uint8_t componentCarrierId
the component carrier id corresponding to the sending Mac istance
Definition: lte-mac-sap.h:52
Parameters for LteMacSapUser::ReceivePdu.
Definition: lte-mac-sap.h:157
uint8_t lcid
the logical channel id
Definition: lte-mac-sap.h:177
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-mac-sap.h:176
Parameters for LteMacSapUser::NotifyTxOpportunity.
Definition: lte-mac-sap.h:104
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-mac-sap.h:133
uint8_t componentCarrierId
the component carrier id
Definition: lte-mac-sap.h:132
uint8_t layer
the layer of transmission (MIMO)
Definition: lte-mac-sap.h:130
uint8_t lcid
the logical channel id
Definition: lte-mac-sap.h:134
MeasResults structure.
Definition: lte-rrc-sap.h:680
uint8_t measId
measure ID
Definition: lte-rrc-sap.h:681
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.