5G-LENA nr-v3.0-32-g83aee33
The 5G/NR module for the ns-3 simulator
Loading...
Searching...
No Matches
nr-test-numerology-delay.cc
Go to the documentation of this file.
1/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2
3// Copyright (c) 2019 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
4//
5// SPDX-License-Identifier: GPL-2.0-only
6
7#include "ns3/antenna-module.h"
8#include "ns3/applications-module.h"
9#include "ns3/core-module.h"
10#include "ns3/eps-bearer-tag.h"
11#include "ns3/internet-module.h"
12#include "ns3/mobility-module.h"
13#include "ns3/network-module.h"
14#include "ns3/nr-module.h"
15#include "ns3/point-to-point-helper.h"
16
17// Do not put your test classes in namespace ns3. You may find it useful
18// to use the using directive to access the ns3 namespace directly
19using namespace ns3;
20
29static uint32_t packetSize = 1000;
30
31class NrTestNumerologyDelayCase1 : public TestCase
32{
33 public:
34 NrTestNumerologyDelayCase1(std::string name, uint32_t numerology);
35 ~NrTestNumerologyDelayCase1() override;
36 void DlScheduling(uint32_t frameNo,
37 uint32_t subframeNo,
38 uint32_t slotNum,
39 uint32_t tbSize,
40 uint32_t mcs,
41 uint32_t rnti,
42 uint8_t componentCarrierId);
43 void DlSpectrumUeEndRx(RxPacketTraceParams params);
44 void DlSpectrumEnbStartTx(GnbPhyPacketCountParameter params);
45 void TxRlcPDU(uint16_t rnti, uint8_t lcid, uint32_t bytes);
46 void TxPdcpPDU(uint16_t rnti, uint8_t lcid, uint32_t bytes);
47 void RxRlcPDU(uint16_t rnti, uint8_t lcid, uint32_t bytes, uint64_t delay);
48 void RxPdcpPDU(uint16_t rnti, uint8_t lcid, uint32_t bytes, uint64_t delay);
49
50 private:
51 void DoRun() override;
52
53 static Time GetSlotTime(uint32_t numerology);
54 static Time GetSymbolPeriod(uint32_t numerology);
55
56 uint32_t m_numerology{0};
57 Time m_sendPacketTime{Seconds(0)};
58 uint32_t m_numSym{0};
59 bool m_firstMacPdu{true};
60 bool m_firstRlcPdu{true};
61 bool m_firstDlTransmission{true};
62 bool m_firstDlReception{true};
63 bool m_firstRxPlcPDU{true};
64 Time m_lastDlReceptionFinished{Seconds(0)};
65 uint32_t m_slotsCounter{0};
66 uint32_t m_totalNumberOfSymbols{0};
67 uint32_t m_firstMacPduMcs{0};
68 uint32_t m_l1l2{0};
69 Time m_tbDecodeLatency{Seconds(0)};
70};
71
72// Add some help text to this case to describe what it is intended to test
73NrTestNumerologyDelayCase1::NrTestNumerologyDelayCase1(std::string name, uint32_t numerology)
74 : TestCase(name),
75 m_numerology(numerology)
76{
77}
78
79// This destructor does nothing but we include it as a reminder that
80// the test case should clean up after itself
81NrTestNumerologyDelayCase1::~NrTestNumerologyDelayCase1()
82{
83}
84
85void
86LteTestDlSchedCallback(NrTestNumerologyDelayCase1* testcase,
87 std::string path,
89{
90 testcase->DlScheduling(info.m_frameNum,
91 info.m_subframeNum,
92 info.m_slotNum,
93 info.m_tbSize,
94 info.m_mcs,
95 info.m_rnti,
96 info.m_bwpId);
97}
98
99void
100LteTestRxPacketUeCallback(NrTestNumerologyDelayCase1* testcase,
101 std::string path,
102 RxPacketTraceParams rxParams)
103{
104 testcase->DlSpectrumUeEndRx(rxParams);
105}
106
107void
108LteTestTxPacketEnbCallback(NrTestNumerologyDelayCase1* testcase,
109 std::string path,
111{
112 testcase->DlSpectrumEnbStartTx(params);
113}
114
115void
116LteTestTxRlcPDUCallback(NrTestNumerologyDelayCase1* testcase,
117 std::string path,
118 uint16_t rnti,
119 uint8_t lcid,
120 uint32_t bytes)
121{
122 testcase->TxRlcPDU(rnti, lcid, bytes);
123}
124
125void
126LteTestTxPdcpPDUCallback(NrTestNumerologyDelayCase1* testcase,
127 std::string path,
128 uint16_t rnti,
129 uint8_t lcid,
130 uint32_t bytes)
131{
132 testcase->TxPdcpPDU(rnti, lcid, bytes);
133}
134
135void
136LteTestRxRlcPDUCallback(NrTestNumerologyDelayCase1* testcase,
137 std::string path,
138 uint16_t rnti,
139 uint8_t lcid,
140 uint32_t bytes,
141 uint64_t delay)
142{
143 testcase->RxRlcPDU(rnti, lcid, bytes, delay);
144}
145
146void
147LteTestRxPdcpPDUCallback(NrTestNumerologyDelayCase1* testcase,
148 std::string path,
149 uint16_t rnti,
150 uint8_t lcid,
151 uint32_t bytes,
152 uint64_t delay)
153{
154 testcase->RxPdcpPDU(rnti, lcid, bytes, delay);
155}
156
157void
158ConnectRlcPdcpTraces(NrTestNumerologyDelayCase1* testcase)
159{
160 Config::Connect("/NodeList/1/DeviceList/*/LteEnbRrc/UeMap/1/DataRadioBearerMap/1/LteRlc/TxPDU",
161 MakeBoundCallback(&LteTestTxRlcPDUCallback, testcase));
162
163 Config::Connect("/NodeList/1/DeviceList/*/LteEnbRrc/UeMap/1/DataRadioBearerMap/1/LtePdcp/TxPDU",
164 MakeBoundCallback(&LteTestTxPdcpPDUCallback, testcase));
165
166 Config::Connect("/NodeList/0/DeviceList/*/LteUeRrc/DataRadioBearerMap/1/LteRlc/RxPDU",
167 MakeBoundCallback(&LteTestRxRlcPDUCallback, testcase));
168
169 Config::Connect("/NodeList/0/DeviceList/*/LteUeRrc/DataRadioBearerMap/1/LtePdcp/RxPDU",
170 MakeBoundCallback(&LteTestRxPdcpPDUCallback, testcase));
171}
172
173static void
174SendPacket(Ptr<NetDevice> device, Address& addr)
175{
176 Ptr<Packet> pkt = Create<Packet>(packetSize);
177 // Adding empty IPV4 header after adding the IPV6 support for NR module.
178 // NrNetDevice::Receive need to peek the header to know the IP protocol.
179 // Since, there are no apps install in this test, this packet will be
180 // dropped in Ipv4L3Protocol::Receive method upon not finding the route.
181 Ipv4Header ipHeader;
182 pkt->AddHeader(ipHeader);
183 EpsBearerTag tag(1, 1);
184 pkt->AddPacketTag(tag);
185 device->Send(pkt, addr, Ipv4L3Protocol::PROT_NUMBER);
186}
187
188void
189NrTestNumerologyDelayCase1::DoRun()
190{
191 Ptr<Node> ueNode = CreateObject<Node>();
192 Ptr<Node> gNbNode = CreateObject<Node>();
193
194 MobilityHelper mobility;
195 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
196 mobility.Install(gNbNode);
197 mobility.Install(ueNode);
198 gNbNode->GetObject<MobilityModel>()->SetPosition(Vector(0.0, 0.0, 10));
199 ueNode->GetObject<MobilityModel>()->SetPosition(Vector(0, 10, 1.5));
200
201 m_sendPacketTime = MilliSeconds(400);
202
203 ns3::SeedManager::SetRun(5);
204
205 Ptr<NrHelper> nrHelper = CreateObject<NrHelper>();
206 Ptr<IdealBeamformingHelper> idealBeamformingHelper = CreateObject<IdealBeamformingHelper>();
207 Ptr<NrPointToPointEpcHelper> epcHelper = CreateObject<NrPointToPointEpcHelper>();
208
209 // Beamforming method
210 idealBeamformingHelper->SetAttribute("BeamformingMethod",
211 TypeIdValue(DirectPathBeamforming::GetTypeId()));
212
213 nrHelper->SetBeamformingHelper(idealBeamformingHelper);
214 nrHelper->SetEpcHelper(epcHelper);
215
217 CcBwpCreator ccBwpCreator;
218 const uint8_t numCcPerBand = 1;
219
221 400e6,
222 numCcPerBand,
224 OperationBandInfo band1 = ccBwpCreator.CreateOperationBandContiguousCc(bandConf1);
225
226 Config::SetDefault("ns3::ThreeGppChannelModel::UpdatePeriod", TimeValue(MilliSeconds(0)));
227 nrHelper->SetChannelConditionModelAttribute("UpdatePeriod", TimeValue(MilliSeconds(0)));
228 nrHelper->SetPathlossAttribute("ShadowingEnabled", BooleanValue(false));
229
230 nrHelper->SetSchedulerAttribute("FixedMcsDl", BooleanValue(true));
231 nrHelper->SetSchedulerAttribute("StartingMcsDl", UintegerValue(1));
232
233 nrHelper->SetGnbPhyAttribute("SymbolsPerSlot", UintegerValue(14));
234 nrHelper->SetGnbPhyAttribute("Numerology", UintegerValue(m_numerology));
235 nrHelper->SetGnbPhyAttribute("TxPower", DoubleValue(10));
236
237 // Antennas for all the UEs
238 nrHelper->SetUeAntennaAttribute("NumRows", UintegerValue(2));
239 nrHelper->SetUeAntennaAttribute("NumColumns", UintegerValue(4));
240 nrHelper->SetUeAntennaAttribute("AntennaElement",
241 PointerValue(CreateObject<IsotropicAntennaModel>()));
242
243 // Antennas for all the gNbs
244 nrHelper->SetGnbAntennaAttribute("NumRows", UintegerValue(4));
245 nrHelper->SetGnbAntennaAttribute("NumColumns", UintegerValue(8));
246 nrHelper->SetGnbAntennaAttribute("AntennaElement",
247 PointerValue(CreateObject<IsotropicAntennaModel>()));
248
249 // Error Model: UE and GNB with same spectrum error model.
250 nrHelper->SetUlErrorModel("ns3::NrEesmIrT1");
251 nrHelper->SetDlErrorModel("ns3::NrEesmIrT1");
252
253 // Both DL and UL AMC will have the same model behind.
254 nrHelper->SetGnbDlAmcAttribute(
255 "AmcModel",
256 EnumValue(NrAmc::ErrorModel)); // NrAmc::ShannonModel or NrAmc::ErrorModel
257 nrHelper->SetGnbUlAmcAttribute(
258 "AmcModel",
259 EnumValue(NrAmc::ErrorModel)); // NrAmc::ShannonModel or NrAmc::ErrorModel
260
261 nrHelper->InitializeOperationBand(&band1);
262 allBwps = CcBwpCreator::GetAllBwps({band1});
263
264 NetDeviceContainer enbNetDev = nrHelper->InstallGnbDevice(gNbNode, allBwps);
265 NetDeviceContainer ueNetDev = nrHelper->InstallUeDevice(ueNode, allBwps);
266
267 m_l1l2 = nrHelper->GetGnbPhy(enbNetDev.Get(0), 0)->GetL1L2CtrlLatency();
268 m_tbDecodeLatency = nrHelper->GetGnbPhy(enbNetDev.Get(0), 0)->GetTbDecodeLatency();
269
270 for (auto it = enbNetDev.Begin(); it != enbNetDev.End(); ++it)
271 {
272 DynamicCast<NrGnbNetDevice>(*it)->UpdateConfig();
273 }
274
275 for (auto it = ueNetDev.Begin(); it != ueNetDev.End(); ++it)
276 {
277 DynamicCast<NrUeNetDevice>(*it)->UpdateConfig();
278 }
279
280 InternetStackHelper internet;
281 internet.Install(ueNode);
282 Ipv4InterfaceContainer ueIpIface;
283 ueIpIface = epcHelper->AssignUeIpv4Address(NetDeviceContainer(ueNetDev));
284
285 Simulator::Schedule(m_sendPacketTime,
286 &SendPacket,
287 enbNetDev.Get(0),
288 ueNetDev.Get(0)->GetAddress());
289
290 // attach UEs to the closest eNB
291 nrHelper->AttachToClosestEnb(ueNetDev, enbNetDev);
292
293 Config::Connect("/NodeList/*/DeviceList/*/BandwidthPartMap/*/NrGnbMac/DlScheduling",
294 MakeBoundCallback(&LteTestDlSchedCallback, this));
295
296 Config::Connect(
297 "/NodeList/*/DeviceList/*/ComponentCarrierMapUe/*/NrUePhy/SpectrumPhy/RxPacketTraceUe",
298 MakeBoundCallback(&LteTestRxPacketUeCallback, this));
299
300 Config::Connect(
301 "/NodeList/*/DeviceList/*/BandwidthPartMap/*/NrGnbPhy/SpectrumPhy/TxPacketTraceEnb",
302 MakeBoundCallback(&LteTestTxPacketEnbCallback, this));
303
304 Simulator::Schedule(MilliSeconds(200), &ConnectRlcPdcpTraces, this);
305
306 nrHelper->EnableTraces();
307
308 Simulator::Stop(MilliSeconds(800));
309 Simulator::Run();
310 Simulator::Destroy();
311}
312
313Time
314NrTestNumerologyDelayCase1::GetSlotTime(uint32_t numerology)
315{
316 uint16_t slotsPerSubframe = static_cast<uint16_t>(std::pow(2, numerology));
317 return Seconds(0.001 / slotsPerSubframe);
318}
319
320Time
321NrTestNumerologyDelayCase1::GetSymbolPeriod(uint32_t numerology)
322{
323 return GetSlotTime(numerology) / 14; // Fix number of symbols to 14 in this test
324}
325
326void
327NrTestNumerologyDelayCase1::TxPdcpPDU(uint16_t rnti, uint8_t lcid, uint32_t bytes)
328{
329 /* std::cout<<"\n\n Packet transmitted by gNB PDCP at:"<<Simulator::Now()<<std::endl;
330 std::cout<<"\n rnti :"<<rnti<<std::endl;
331 std::cout<<"\n lcid :"<<(unsigned) lcid<<std::endl;
332 std::cout<<"\n bytes :"<<bytes<<std::endl;*/
333
334 NS_TEST_ASSERT_MSG_EQ(
335 Simulator::Now(),
336 m_sendPacketTime,
337 "There should not be delay between packet being sent and being scheduled by the gNb PDCP.");
338}
339
340void
341NrTestNumerologyDelayCase1::TxRlcPDU(uint16_t rnti, uint8_t lcid, uint32_t bytes)
342{
343 /* std::cout<<"\n\n Packet transmitted by gNB RLC at:"<<Simulator::Now()<<std::endl;
344 std::cout<<"\n rnti:"<<rnti<<std::endl;
345 std::cout<<"\n lcid:"<<rnti<<(unsigned)lcid;
346 std::cout<<"\n no of bytes :"<<bytes<<std::endl;*/
347
348 if (m_firstRlcPdu)
349 {
350 NS_TEST_ASSERT_MSG_EQ(Simulator::Now(),
351 m_sendPacketTime,
352 "There should not be delay between packet being sent and being "
353 "transmitted by the gNb RLC.");
354 m_firstRlcPdu = false;
355 }
356}
357
358void
359NrTestNumerologyDelayCase1::DlScheduling(uint32_t frameNo,
360 uint32_t subframeNo,
361 uint32_t slotNum,
362 uint32_t tbSize,
363 uint32_t mcs,
364 uint32_t rnti,
365 uint8_t componentCarrierId)
366{
367 /* std::cout<<"\n\n\n MAC sends PDU to PHY at:"<<Simulator::Now()<<std::endl;
368 std::cout<<"\n MCS :"<<mcs<<std::endl;
369 std::cout<<"\n rnti :"<<rnti<<std::endl;
370 std::cout<<"\n frameNo :"<<slotNum<<std::endl;
371 std::cout<<"\n subframeNo :"<<slotNum<<std::endl;
372 std::cout<<"\n slotNo :"<<slotNum<<std::endl;*/
373
374 if (m_firstMacPdu)
375 {
376 NS_TEST_ASSERT_MSG_EQ(
377 Simulator::Now(),
378 m_sendPacketTime,
379 "There should not be delay between packet being sent and being scheduled by the MAC.");
380 m_firstMacPdu = false;
381 m_firstMacPduMcs = mcs;
382 }
383 m_slotsCounter++;
384}
385
386void
387NrTestNumerologyDelayCase1::DlSpectrumEnbStartTx(GnbPhyPacketCountParameter params)
388{
389 /* std::cout<<"\n\n Started transmission at eNb PHY at:"<<Simulator::Now()<<std::endl;
390 std::cout<<"\n cell id :"<<params.m_cellId<<std::endl;
391 std::cout<<"\n no of bytes :"<<(unsigned)params.m_noBytes<<std::endl;
392 std::cout<<"\n subframe no:"<<params.m_subframeno<<std::endl;*/
393 Time delay = m_l1l2 * GetSlotTime(m_numerology);
394 Time ctrlDuration = GetSymbolPeriod(m_numerology);
395 // first there is L1L2 processing delay
396 // the, before it start the transmission of the DATA symbol, there is 1 DL CTRL symbol
397 // and then we are here already in the following nano second
398
399 if (m_firstDlTransmission)
400 {
401 NS_TEST_ASSERT_MSG_EQ(Simulator::Now(),
402 m_sendPacketTime + delay + ctrlDuration + NanoSeconds(1),
403 "The delay between packet scheduled by the MAC and being transmitted "
404 "should be L1L2 delay, plus the duration of the control.");
405 m_firstDlTransmission = false;
406 }
407}
408
409void
410NrTestNumerologyDelayCase1::DlSpectrumUeEndRx(RxPacketTraceParams params)
411{
412 /* std::cout<<"\n\n Finished reception at UE PHY at:"<<Simulator::Now()<<std::endl;
413 std::cout<<"\n MCS :"<<params.m_mcs<<std::endl;
414 std::cout<<"\n slot :"<<(unsigned int)params.m_slotNum<<std::endl;
415 std::cout<<"\n rnti:"<<params.m_rnti<<std::endl;*/
416
417 Time delay = m_l1l2 * GetSlotTime(m_numerology);
418 Time ctrlDuration = GetSymbolPeriod(m_numerology);
419 Time dataDuration = (GetSymbolPeriod(m_numerology) * params.m_numSym) - NanoSeconds(1);
420
421 /* std::cout<<"\n symbol duration:"<< Seconds (m_nrPhyMacCommon->GetSymbolPeriod());
422 std::cout<<"\n symbols:" << (unsigned) params.m_numSym;
423 std::cout<<"\n my calculation:"<<m_sendPacketTime + delay + ctrlDuration + dataDuration;*/
424
425 if (m_firstDlReception)
426 {
427 NS_TEST_ASSERT_MSG_EQ(Simulator::Now(),
428 m_sendPacketTime + delay + ctrlDuration + dataDuration,
429 "The duration of the transmission of the packet is not correct");
430 m_firstDlReception = false;
431 m_numSym = params.m_numSym;
432 }
433
434 m_lastDlReceptionFinished = Simulator::Now();
435 m_totalNumberOfSymbols += params.m_numSym;
436}
437
438void
439NrTestNumerologyDelayCase1::RxRlcPDU(uint16_t rnti, uint8_t lcid, uint32_t bytes, uint64_t rlcDelay)
440{
441 /* std::cout<<"\n\n Packet received by UE RLC at:"<<Simulator::Now()<<std::endl;
442 std::cout<<"\n rnti:"<<rnti<<std::endl;
443 std::cout<<"\n lcid:"<<(unsigned)lcid<<std::endl;
444 std::cout<<"\n bytes :"<< bytes<<std::endl;
445 std::cout<<"\n delay :"<< rlcDelay<<std::endl;*/
446
447 Time delay = m_l1l2 * GetSlotTime(m_numerology);
448 Time ctrlDuration = GetSymbolPeriod(m_numerology);
449 Time dataDuration = (GetSymbolPeriod(m_numerology) * m_numSym) - NanoSeconds(1);
450
451 if (m_firstRxPlcPDU)
452 {
453 NS_TEST_ASSERT_MSG_EQ(Simulator::Now(),
454 m_sendPacketTime + delay + ctrlDuration + dataDuration +
455 m_tbDecodeLatency,
456 "The duration of the reception by RLC is not correct.");
457 m_firstRxPlcPDU = false;
458 }
459}
460
461void
462NrTestNumerologyDelayCase1::RxPdcpPDU(uint16_t rnti,
463 uint8_t lcid,
464 uint32_t bytes,
465 uint64_t pdcpDelay)
466{
467 /* std::cout<<"\n\n Packet received by UE PDCP at:"<<Simulator::Now()<<std::endl;
468 std::cout<<"\n rnti :"<<rnti<<std::endl;
469 std::cout<<"\n lcid:"<<(unsigned)lcid<<std::endl;
470 std::cout<<"\n bytes :"<< bytes<<std::endl;
471 std::cout<<"\n delay :"<<pdcpDelay<<std::endl;*/
472
473 Time delay = m_l1l2 * GetSlotTime(m_numerology);
474 Time ctrlDuration = GetSymbolPeriod(m_numerology);
475 Time dataDuration = (GetSymbolPeriod(m_numerology) * m_numSym) - NanoSeconds(1);
476
477 NS_TEST_ASSERT_MSG_EQ(Simulator::Now(),
478 m_lastDlReceptionFinished + m_tbDecodeLatency,
479 "The duration of the reception by PDCP is not correct.");
480
481 std::cout << "\n Numerology:" << m_numerology << "\t Packet of :" << packetSize
482 << " bytes\t#Slots:" << m_slotsCounter << "\t#Symbols:" << m_totalNumberOfSymbols
483 << "\tPacket PDCP delay:" << pdcpDelay << "\tRLC delay of first PDU:"
484 << delay + ctrlDuration + dataDuration + m_tbDecodeLatency
485 << "\tMCS of the first PDU:" << m_firstMacPduMcs;
486}
487
488// The TestSuite class names the TestSuite, identifies what type of TestSuite,
489// and enables the TestCases to be run. Typically, only the constructor for
490// this class must be defined
491//
492class NrTestNumerologyDelayTestSuite : public TestSuite
493{
494 public:
495 NrTestNumerologyDelayTestSuite();
496};
497
498NrTestNumerologyDelayTestSuite::NrTestNumerologyDelayTestSuite()
499 : TestSuite("nr-test-numerology-delay", Type::SYSTEM)
500{
501 AddTestCase(new NrTestNumerologyDelayCase1("num=0", 0), Duration::QUICK);
502 AddTestCase(new NrTestNumerologyDelayCase1("num=1", 1), Duration::QUICK);
503 AddTestCase(new NrTestNumerologyDelayCase1("num=2", 2), Duration::QUICK);
504 AddTestCase(new NrTestNumerologyDelayCase1("num=3", 3), Duration::QUICK);
505 AddTestCase(new NrTestNumerologyDelayCase1("num=4", 4), Duration::QUICK);
506 AddTestCase(new NrTestNumerologyDelayCase1("num=5", 5), Duration::QUICK);
507}
508
509// Do not forget to allocate an instance of this TestSuite
510static NrTestNumerologyDelayTestSuite nrTestSuite;
Manages the correct creation of operation bands, component carriers and bandwidth parts.
OperationBandInfo CreateOperationBandContiguousCc(const SimpleOperationBandConf &conf)
Create an operation band with the CC specified.
static BandwidthPartInfoPtrVector GetAllBwps(const std::vector< std::reference_wrapper< OperationBandInfo > > &operationBands)
Get all the BWP pointers from the specified vector of operation bands.
static TypeId GetTypeId()
Get the type id.
@ ErrorModel
Error Model version (can use different error models, see NrErrorModel)
Definition nr-amc.h:89
void RxPdcpPDU(std::string path, uint16_t rnti, uint8_t lcid, uint32_t bytes, uint64_t pdcpDelay)
void RxRlcPDU(std::string path, uint16_t rnti, uint8_t lcid, uint32_t bytes, uint64_t rlcDelay)
std::vector< std::reference_wrapper< BandwidthPartInfoPtr > > BandwidthPartInfoPtrVector
vector of unique_ptr of BandwidthPartInfo
NrSchedulingCallbackInfo structure.
uint8_t m_subframeNum
subframe number
uint16_t m_frameNum
frame number
uint8_t m_bwpId
Bandwidth Part ID.
uint16_t m_slotNum
slot number
@ UMi_StreetCanyon
UMi_StreetCanyon.
Minimum configuration requirements for a OperationBand.
The GnbPhyPacketCountParameter struct.
Operation band information structure.
The RxPacketTraceParams struct.