A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
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 * SPDX-License-Identifier: GPL-2.0-only
6 *
7 * Authors: Danilo Abrignani <danilo.abrignani@unibo.it>
8 * Biljana Bojovic <biljana.bojovic@cttc.es>
9 *
10 */
11
13
14#include "lte-common.h"
15
16#include <ns3/log.h>
17#include <ns3/random-variable-stream.h>
18
19namespace ns3
20{
21
22NS_LOG_COMPONENT_DEFINE("NoOpComponentCarrierManager");
23NS_OBJECT_ENSURE_REGISTERED(NoOpComponentCarrierManager);
24
33
38
39void
47
50{
51 static TypeId tid = TypeId("ns3::NoOpComponentCarrierManager")
53 .SetGroupName("Lte")
54 .AddConstructor<NoOpComponentCarrierManager>();
55 return tid;
56}
57
58void
64
65//////////////////////////////////////////////
66// MAC SAP
67/////////////////////////////////////////////
68
69void
71{
72 NS_LOG_FUNCTION(this);
73 auto it = m_macSapProvidersMap.find(params.componentCarrierId);
75 "could not find Sap for ComponentCarrier " << params.componentCarrierId);
76 // with this algorithm all traffic is on Primary Carrier
77 it->second->TransmitPdu(params);
78}
79
80void
83{
84 NS_LOG_FUNCTION(this);
85 auto ueManager = m_ccmRrcSapUser->GetUeManager(params.rnti);
86 auto it = m_macSapProvidersMap.find(ueManager->GetComponentCarrierId());
87 NS_ASSERT_MSG(it != m_macSapProvidersMap.end(), "could not find Sap for ComponentCarrier ");
88 it->second->ReportBufferStatus(params);
89}
90
91void
94{
95 NS_LOG_FUNCTION(this);
96 NS_LOG_DEBUG(this << " rnti= " << txOpParams.rnti << " lcid= " << +txOpParams.lcid << " layer= "
97 << +txOpParams.layer << " ccId=" << +txOpParams.componentCarrierId);
98 m_ueInfo.at(txOpParams.rnti).m_ueAttached.at(txOpParams.lcid)->NotifyTxOpportunity(txOpParams);
99}
100
101void
103{
104 NS_LOG_FUNCTION(this);
105 auto lcidIt = m_ueInfo.at(rxPduParams.rnti).m_ueAttached.find(rxPduParams.lcid);
106 if (lcidIt != m_ueInfo.at(rxPduParams.rnti).m_ueAttached.end())
107 {
108 lcidIt->second->ReceivePdu(rxPduParams);
109 }
110}
111
112void
117
118void
120{
121 NS_LOG_FUNCTION(this << rnti << (uint16_t)measResults.measId);
122}
123
124void
125NoOpComponentCarrierManager::DoAddUe(uint16_t rnti, uint8_t state)
126{
127 NS_LOG_FUNCTION(this << rnti << (uint16_t)state);
128 auto ueInfoIt = m_ueInfo.find(rnti);
129 if (ueInfoIt == m_ueInfo.end())
130 {
131 NS_LOG_DEBUG(this << " UE " << rnti << " was not found, now it is added in the map");
132 UeInfo info;
133 info.m_ueState = state;
134
135 // the Primary carrier (PC) is enabled by default
136 // on the PC the SRB0 and SRB1 are enabled when the Ue is connected
137 // these are hard-coded and the configuration not pass through the
138 // Component Carrier Manager which is responsible of configure
139 // only DataRadioBearer on the different Component Carrier
141 m_ueInfo.emplace(rnti, info);
142 }
143 else
144 {
145 NS_LOG_DEBUG(this << " UE " << rnti << "found, updating the state from "
146 << +ueInfoIt->second.m_ueState << " to " << +state);
147 ueInfoIt->second.m_ueState = state;
148 }
149}
150
151void
153{
154 NS_LOG_FUNCTION(this);
155 m_ueInfo.at(lcInfo.rnti).m_rlcLcInstantiated.emplace(lcInfo.lcId, lcInfo);
156}
157
158void
160{
161 NS_LOG_FUNCTION(this);
162 auto rntiIt = m_ueInfo.find(rnti);
163 NS_ASSERT_MSG(rntiIt != m_ueInfo.end(), "request to remove UE info with unknown RNTI " << rnti);
164 m_ueInfo.erase(rntiIt);
165}
166
167std::vector<LteCcmRrcSapProvider::LcsConfig>
169 uint8_t bearerId,
170 uint16_t rnti,
171 uint8_t lcid,
172 uint8_t lcGroup,
173 LteMacSapUser* msu)
174{
175 NS_LOG_FUNCTION(this << rnti);
176 auto rntiIt = m_ueInfo.find(rnti);
177 NS_ASSERT_MSG(rntiIt != m_ueInfo.end(), "SetupDataRadioBearer on unknown RNTI " << rnti);
178
179 // enable by default all carriers
180 rntiIt->second.m_enabledComponentCarrier = m_noOfComponentCarriers;
181
182 std::vector<LteCcmRrcSapProvider::LcsConfig> res;
185 // NS_LOG_DEBUG (this << " componentCarrierEnabled " << (uint16_t) eccIt->second);
186 for (uint16_t ncc = 0; ncc < m_noOfComponentCarriers; ncc++)
187 {
188 // NS_LOG_DEBUG (this << " res size " << (uint16_t) res.size ());
190 lci.rnti = rnti;
191 lci.lcId = lcid;
192 lci.lcGroup = lcGroup;
193 lci.qci = bearer.qci;
194 if (ncc == 0)
195 {
196 lci.resourceType = bearer.GetResourceType();
197 lci.mbrUl = bearer.gbrQosInfo.mbrUl;
198 lci.mbrDl = bearer.gbrQosInfo.mbrDl;
199 lci.gbrUl = bearer.gbrQosInfo.gbrUl;
200 lci.gbrDl = bearer.gbrQosInfo.gbrDl;
201 }
202 else
203 {
204 lci.resourceType = 0;
205 lci.mbrUl = 0;
206 lci.mbrDl = 0;
207 lci.gbrUl = 0;
208 lci.gbrDl = 0;
209 } // data flows only on PC
210 NS_LOG_DEBUG(this << " RNTI " << lci.rnti << "Lcid " << (uint16_t)lci.lcId << " lcGroup "
211 << (uint16_t)lci.lcGroup);
212 entry.componentCarrierId = ncc;
213 entry.lc = lci;
214 entry.msu = m_ccmMacSapUser;
215 res.push_back(entry);
216 } // end for
217
218 auto lcidIt = rntiIt->second.m_rlcLcInstantiated.find(lcid);
219 if (lcidIt == rntiIt->second.m_rlcLcInstantiated.end())
220 {
221 lcinfo.rnti = rnti;
222 lcinfo.lcId = lcid;
223 lcinfo.lcGroup = lcGroup;
224 lcinfo.qci = bearer.qci;
225 lcinfo.resourceType = bearer.GetResourceType();
226 lcinfo.mbrUl = bearer.gbrQosInfo.mbrUl;
227 lcinfo.mbrDl = bearer.gbrQosInfo.mbrDl;
228 lcinfo.gbrUl = bearer.gbrQosInfo.gbrUl;
229 lcinfo.gbrDl = bearer.gbrQosInfo.gbrDl;
230 rntiIt->second.m_rlcLcInstantiated.emplace(lcinfo.lcId, lcinfo);
231 rntiIt->second.m_ueAttached.emplace(lcinfo.lcId, msu);
232 }
233 else
234 {
235 NS_LOG_ERROR("LC already exists");
236 }
237 return res;
238}
239
240std::vector<uint8_t>
242{
243 NS_LOG_FUNCTION(this << rnti << +lcid);
244
245 // Here we receive directly the RNTI and the LCID, instead of only DRB ID
246 // DRB ID are mapped as DRBID = LCID + 2
247 auto rntiIt = m_ueInfo.find(rnti);
248 NS_ASSERT_MSG(rntiIt != m_ueInfo.end(),
249 "request to Release Data Radio Bearer on UE with unknown RNTI " << rnti);
250
251 NS_LOG_DEBUG(this << " remove LCID " << +lcid << " for RNTI " << rnti);
252 std::vector<uint8_t> res;
253 for (uint16_t i = 0; i < rntiIt->second.m_enabledComponentCarrier; i++)
254 {
255 res.insert(res.end(), i);
256 }
257
258 auto lcIt = rntiIt->second.m_ueAttached.find(lcid);
259 NS_ASSERT_MSG(lcIt != rntiIt->second.m_ueAttached.end(), "Logical Channel not found");
260 rntiIt->second.m_ueAttached.erase(lcIt);
261
262 auto rlcInstancesIt = rntiIt->second.m_rlcLcInstantiated.find(rnti);
263 NS_ASSERT_MSG(rlcInstancesIt != rntiIt->second.m_rlcLcInstantiated.end(),
264 "Logical Channel not found");
265 rntiIt->second.m_rlcLcInstantiated.erase(rlcInstancesIt);
266
267 return res;
268}
269
272 LteMacSapUser* msu)
273{
274 NS_LOG_FUNCTION(this);
275
276 auto rntiIt = m_ueInfo.find(lcinfo.rnti);
277 NS_ASSERT_MSG(rntiIt != m_ueInfo.end(),
278 "request to add a signal bearer to unknown RNTI " << lcinfo.rnti);
279
280 auto lcidIt = rntiIt->second.m_ueAttached.find(lcinfo.lcId);
281 if (lcidIt == rntiIt->second.m_ueAttached.end())
282 {
283 rntiIt->second.m_ueAttached.emplace(lcinfo.lcId, msu);
284 }
285 else
286 {
287 NS_LOG_ERROR("LC already exists");
288 }
289
290 return m_ccmMacSapUser;
291}
292
293void
294NoOpComponentCarrierManager::DoNotifyPrbOccupancy(double prbOccupancy, uint8_t componentCarrierId)
295{
296 NS_LOG_FUNCTION(this);
297 NS_LOG_DEBUG("Update PRB occupancy:" << prbOccupancy
298 << " at carrier:" << (uint32_t)componentCarrierId);
299 m_ccPrbOccupancy.insert(std::pair<uint8_t, double>(componentCarrierId, prbOccupancy));
300}
301
302void
304{
305 NS_LOG_FUNCTION(this);
306 NS_ASSERT_MSG(bsr.m_macCeType == MacCeListElement_s::BSR,
307 "Received a Control Message not allowed " << bsr.m_macCeType);
308 if (bsr.m_macCeType == MacCeListElement_s::BSR)
309 {
310 MacCeListElement_s newBsr;
311 newBsr.m_rnti = bsr.m_rnti;
312 newBsr.m_macCeType = bsr.m_macCeType;
315 newBsr.m_macCeValue.m_bufferStatus.resize(4);
316 for (uint16_t i = 0; i < 4; i++)
317 {
318 uint8_t bsrId = bsr.m_macCeValue.m_bufferStatus.at(i);
320 // here the buffer should be divide among the different sap
321 // since the buffer status report are compressed information
322 // it is needed to use BsrId2BufferSize to uncompress
323 // after the split over all component carriers is is needed to
324 // compress again the information to fit MacCeListEkement_s structure
325 // verify how many Component Carrier are enabled per UE
326 // in this simple code the BufferStatus will be notify only
327 // to the primary carrier component
329 }
330 auto sapIt = m_ccmMacSapProviderMap.find(componentCarrierId);
331 if (sapIt == m_ccmMacSapProviderMap.end())
332 {
333 NS_FATAL_ERROR("Sap not found in the CcmMacSapProviderMap");
334 }
335 else
336 {
337 // in the current implementation bsr in uplink is forwarded only to the primary carrier.
338 // above code demonstrates how to resize buffer status if more carriers are being used
339 // in future
340 sapIt->second->ReportMacCeToScheduler(newBsr);
341 }
342 }
343 else
344 {
345 NS_FATAL_ERROR("Expected BSR type of message.");
346 }
347}
348
349void
350NoOpComponentCarrierManager::DoUlReceiveSr(uint16_t rnti, uint8_t componentCarrierId)
351{
352 NS_LOG_FUNCTION(this);
353
354 auto sapIt = m_ccmMacSapProviderMap.find(componentCarrierId);
356 "Sap not found in the CcmMacSapProviderMap");
357
358 sapIt->second->ReportSrToScheduler(rnti);
359}
360
361//////////////////////////////////////////
362
364
369
374
375TypeId
377{
378 static TypeId tid = TypeId("ns3::RrComponentCarrierManager")
380 .SetGroupName("Lte")
381 .AddConstructor<RrComponentCarrierManager>();
382 return tid;
383}
384
385void
388{
389 NS_LOG_FUNCTION(this);
390
391 uint32_t numberOfCarriersForUe = m_ueInfo.at(params.rnti).m_enabledComponentCarrier;
392 if (params.lcid == 0 || params.lcid == 1 || numberOfCarriersForUe == 1)
393 {
394 NS_LOG_INFO("Buffer status forwarded to the primary carrier.");
395 auto ueManager = m_ccmRrcSapUser->GetUeManager(params.rnti);
396 m_macSapProvidersMap.at(ueManager->GetComponentCarrierId())->ReportBufferStatus(params);
397 }
398 else
399 {
400 params.retxQueueSize /= numberOfCarriersForUe;
401 params.txQueueSize /= numberOfCarriersForUe;
402 for (uint32_t i = 0; i < numberOfCarriersForUe; i++)
403 {
405 "Mac sap provider does not exist.");
406 m_macSapProvidersMap.at(i)->ReportBufferStatus(params);
407 }
408 }
409}
410
411void
413{
414 NS_LOG_FUNCTION(this);
415 NS_ASSERT_MSG(componentCarrierId == 0,
416 "Received BSR from a ComponentCarrier not allowed, ComponentCarrierId = "
417 << componentCarrierId);
418 NS_ASSERT_MSG(bsr.m_macCeType == MacCeListElement_s::BSR,
419 "Received a Control Message not allowed " << bsr.m_macCeType);
420
421 // split traffic in uplink equally among carriers
422 uint32_t numberOfCarriersForUe = m_ueInfo.at(bsr.m_rnti).m_enabledComponentCarrier;
423
424 if (bsr.m_macCeType == MacCeListElement_s::BSR)
425 {
426 MacCeListElement_s newBsr;
427 newBsr.m_rnti = bsr.m_rnti;
428 // mac control element type, values can be BSR, PHR, CRNTI
429 newBsr.m_macCeType = bsr.m_macCeType;
430 // the power headroom, 64 means no valid phr is available
432 // indicates that the CRNTI MAC CE was received. The value is not used.
434 // and value 64 means that the buffer status should not be updated
435 newBsr.m_macCeValue.m_bufferStatus.resize(4);
436 // always all 4 LCGs are present see 6.1.3.1 of 3GPP TS 36.321.
437 for (uint16_t i = 0; i < 4; i++)
438 {
439 uint8_t bsrStatusId = bsr.m_macCeValue.m_bufferStatus.at(i);
440 uint32_t bufferSize = BufferSizeLevelBsr::BsrId2BufferSize(bsrStatusId);
441 // here the buffer should be divide among the different sap
442 // since the buffer status report are compressed information
443 // it is needed to use BsrId2BufferSize to uncompress
444 // after the split over all component carriers is is needed to
445 // compress again the information to fit MacCeListElement_s structure
446 // verify how many Component Carrier are enabled per UE
447 newBsr.m_macCeValue.m_bufferStatus.at(i) =
448 BufferSizeLevelBsr::BufferSize2BsrId(bufferSize / numberOfCarriersForUe);
449 }
450 // notify MAC of each component carrier that is enabled for this UE
451 for (uint32_t i = 0; i < numberOfCarriersForUe; i++)
452 {
454 "Mac sap provider does not exist.");
455 m_ccmMacSapProviderMap.find(i)->second->ReportMacCeToScheduler(newBsr);
456 }
457 }
458 else
459 {
460 auto ueManager = m_ccmRrcSapUser->GetUeManager(bsr.m_rnti);
461 m_ccmMacSapProviderMap.at(ueManager->GetComponentCarrierId())->ReportMacCeToScheduler(bsr);
462 }
463}
464
465void
466RrComponentCarrierManager::DoUlReceiveSr(uint16_t rnti, uint8_t /* componentCarrierId */)
467{
468 NS_LOG_FUNCTION(this);
469 // split traffic in uplink equally among carriers
470 uint32_t numberOfCarriersForUe = m_ueInfo.at(rnti).m_enabledComponentCarrier;
471
472 m_ccmMacSapProviderMap.find(m_lastCcIdForSr)->second->ReportSrToScheduler(rnti);
473
475 if (m_lastCcIdForSr > numberOfCarriersForUe - 1)
476 {
477 m_lastCcIdForSr = 0;
478 }
479}
480
481} // end of namespace ns3
static uint8_t BufferSize2BsrId(uint32_t val)
Convert Buffer size to BSR ID.
static uint32_t BsrId2BufferSize(uint8_t val)
Convert BSR ID to buffer size.
This class contains the specification of EPS Bearers.
Definition eps-bearer.h:80
uint8_t GetResourceType() const
Qci qci
Qos class indicator.
Definition eps-bearer.h:140
GbrQosInformation gbrQosInfo
GBR QOS information.
Definition eps-bearer.h:142
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:85
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:440
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.
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:48
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition type-id.cc:1001
#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:75
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition abort.h:97
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
Definition log.h:243
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition log.h:257
#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:264
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition object-base.h:35
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:31
uint64_t gbrUl
Guaranteed Bit Rate (bit/s) in uplink.
Definition eps-bearer.h:32
uint64_t mbrDl
Maximum Bit Rate (bit/s) in downlink.
Definition eps-bearer.h:33
uint64_t mbrUl
Maximum Bit Rate (bit/s) in uplink.
Definition eps-bearer.h:34
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
uint8_t resourceType
0 if the bearer is NON-GBR, 1 if the bearer is GBR, 2 if the bearer in DC-GBR
uint64_t gbrDl
guaranteed bitrate in downlink
uint8_t lcId
logical channel identifier
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:58
Parameters for LteMacSapProvider::TransmitPdu.
Definition lte-mac-sap.h:34
Parameters for LteMacSapUser::ReceivePdu.
uint8_t lcid
the logical channel id
uint16_t rnti
the C-RNTI identifying the UE
Parameters for LteMacSapUser::NotifyTxOpportunity.
Definition lte-mac-sap.h:94
uint16_t rnti
the C-RNTI identifying the UE
uint8_t componentCarrierId
the component carrier id
uint8_t layer
the layer of transmission (MIMO)
uint8_t lcid
the logical channel id
MeasResults structure.
uint8_t measId
measure ID
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.