5G-LENA nr-v3.0-32-g83aee33
The 5G/NR module for the ns-3 simulator
Loading...
Searching...
No Matches
nr-test-fdm-of-numerologies.cc
Go to the documentation of this file.
1/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2
3// Copyright (c) 2020 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#include "ns3/three-gpp-channel-model.h"
17// #include "ns3/component-carrier-gnb.h"
18// #include "ns3/component-carrier-nr-ue.h"
19using namespace ns3;
20
36class NrTestFdmOfNumerologiesCase1 : public TestCase
37{
38 public:
39 NrTestFdmOfNumerologiesCase1(std::string name,
40 uint32_t numerology,
41 double bw1,
42 double bw2,
43 bool isDownlink,
44 bool isUplink);
45 ~NrTestFdmOfNumerologiesCase1() override;
46
47 private:
48 void DoRun() override;
49
50 uint32_t m_numerology; // the numerology to be used
51 double m_bw1; // bandwidth of bandwidth part 1
52 double m_bw2; // bandwidth of bandwidth part 2
53 bool m_isDownlink; // whether to generate the downlink traffic
54 bool m_isUplink; // whether to generate the uplink traffic
55};
56
57// Add some help text to this case to describe what it is intended to test
58NrTestFdmOfNumerologiesCase1::NrTestFdmOfNumerologiesCase1(std::string name,
59 uint32_t numerology,
60 double bw1,
61 double bw2,
62 bool isDownlnk,
63 bool isUplink)
64 : TestCase(name)
65{
66 m_numerology = numerology;
67 m_bw1 = bw1;
68 m_bw2 = bw2;
69 m_isDownlink = isDownlnk;
70 m_isUplink = isUplink;
71}
72
73// This destructor does nothing but we include it as a reminder that
74// the test case should clean up after itself
75NrTestFdmOfNumerologiesCase1::~NrTestFdmOfNumerologiesCase1()
76{
77}
78
79void
80NrTestFdmOfNumerologiesCase1::DoRun()
81{
82 // set simulation time and mobility
83 double simTime = 0.2; // seconds
84 double udpAppStartTime = 0.1; // seconds
85 double totalTxPower = 4;
86 uint16_t gNbNum = 1;
87 uint16_t ueNumPergNb = 2;
88 uint32_t packetSize = 1000;
89
90 Config::SetDefault("ns3::LteRlcUm::MaxTxBufferSize", UintegerValue(999999999));
91 Config::SetDefault("ns3::EpsBearer::Release", UintegerValue(15));
92
93 RngSeedManager::SetSeed(1);
94 RngSeedManager::SetRun(1);
95
96 // create base stations and mobile terminals
97 NodeContainer gNbNodes;
98 NodeContainer ueNodes;
99 MobilityHelper mobility;
100
101 double gNbHeight = 10;
102 double ueHeight = 1.5;
103
104 gNbNodes.Create(gNbNum);
105 ueNodes.Create(ueNumPergNb * gNbNum);
106
107 Ptr<ListPositionAllocator> apPositionAlloc = CreateObject<ListPositionAllocator>();
108 Ptr<ListPositionAllocator> staPositionAlloc = CreateObject<ListPositionAllocator>();
109 apPositionAlloc->Add(Vector(0.0, 20, gNbHeight));
110 staPositionAlloc->Add(Vector(1, 1, ueHeight));
111 staPositionAlloc->Add(Vector(-1, 1, ueHeight));
112 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
113 mobility.SetPositionAllocator(apPositionAlloc);
114 mobility.Install(gNbNodes);
115 mobility.SetPositionAllocator(staPositionAlloc);
116 mobility.Install(ueNodes);
117
118 double totalBandwidth = 0;
119 totalBandwidth = m_bw1 + m_bw2;
120
121 Ptr<NrPointToPointEpcHelper> epcHelper = CreateObject<NrPointToPointEpcHelper>();
122 Ptr<IdealBeamformingHelper> idealBeamformingHelper = CreateObject<IdealBeamformingHelper>();
123 Ptr<NrHelper> nrHelper = CreateObject<NrHelper>();
124
125 // Put the pointers inside nrHelper
126 nrHelper->SetBeamformingHelper(idealBeamformingHelper);
127
128 // Antennas for all the UEs
129 nrHelper->SetUeAntennaAttribute("NumRows", UintegerValue(2));
130 nrHelper->SetUeAntennaAttribute("NumColumns", UintegerValue(4));
131 nrHelper->SetUeAntennaAttribute("AntennaElement",
132 PointerValue(CreateObject<IsotropicAntennaModel>()));
133
134 // Antennas for all the gNbs
135 nrHelper->SetGnbAntennaAttribute("NumRows", UintegerValue(4));
136 nrHelper->SetGnbAntennaAttribute("NumColumns", UintegerValue(8));
137 nrHelper->SetGnbAntennaAttribute("AntennaElement",
138 PointerValue(CreateObject<IsotropicAntennaModel>()));
139
140 nrHelper->SetEpcHelper(epcHelper);
141
143 CcBwpCreator ccBwpCreator;
144
145 const uint8_t numCcPerBand = 2;
146
148 totalBandwidth,
149 numCcPerBand,
151 OperationBandInfo band1 = ccBwpCreator.CreateOperationBandContiguousCc(bandConf1);
152
153 // Set BW of each BWP
154 band1.m_cc[0]->m_bwp[0]->m_channelBandwidth = m_bw1;
155 band1.m_cc[1]->m_bwp[0]->m_channelBandwidth = m_bw2;
156
157 nrHelper->SetPathlossAttribute("ShadowingEnabled", BooleanValue(false));
158
159 nrHelper->InitializeOperationBand(&band1);
160
161 allBwps = CcBwpCreator::GetAllBwps({band1});
162
163 // gNb routing between Bearer and bandwidh part
164 nrHelper->SetGnbBwpManagerAlgorithmAttribute("NGBR_LOW_LAT_EMBB", UintegerValue(0));
165 nrHelper->SetGnbBwpManagerAlgorithmAttribute("GBR_CONV_VOICE", UintegerValue(1));
166 // Ue routing between Bearer and bandwidth part
167 nrHelper->SetUeBwpManagerAlgorithmAttribute("NGBR_LOW_LAT_EMBB", UintegerValue(0));
168 nrHelper->SetUeBwpManagerAlgorithmAttribute("GBR_CONV_VOICE", UintegerValue(1));
169
170 // install nr net devices
171 NetDeviceContainer enbNetDev = nrHelper->InstallGnbDevice(gNbNodes, allBwps);
172 NetDeviceContainer ueNetDev = nrHelper->InstallUeDevice(ueNodes, allBwps);
173
174 double x = pow(10, totalTxPower / 10);
175
176 nrHelper->GetGnbPhy(enbNetDev.Get(0), 0)
177 ->SetAttribute("Numerology", UintegerValue(m_numerology));
178 nrHelper->GetGnbPhy(enbNetDev.Get(0), 1)
179 ->SetAttribute("Numerology", UintegerValue(m_numerology));
180
181 nrHelper->GetGnbPhy(enbNetDev.Get(0), 0)
182 ->SetAttribute("TxPower", DoubleValue(10 * log10((m_bw1 / totalBandwidth) * x)));
183 nrHelper->GetGnbPhy(enbNetDev.Get(0), 1)
184 ->SetAttribute("TxPower", DoubleValue(10 * log10((m_bw2 / totalBandwidth) * x)));
185
186 nrHelper->GetUePhy(ueNetDev.Get(0), 0)
187 ->SetAttribute("TxPower", DoubleValue(10 * log10((m_bw1 / totalBandwidth) * x)));
188 nrHelper->GetUePhy(ueNetDev.Get(0), 1)
189 ->SetAttribute("TxPower", DoubleValue(10 * log10((m_bw2 / totalBandwidth) * x)));
190
191 nrHelper->GetUePhy(ueNetDev.Get(1), 0)
192 ->SetAttribute("TxPower", DoubleValue(10 * log10((m_bw1 / totalBandwidth) * x)));
193 nrHelper->GetUePhy(ueNetDev.Get(1), 1)
194 ->SetAttribute("TxPower", DoubleValue(10 * log10((m_bw2 / totalBandwidth) * x)));
195
196 for (uint32_t j = 0; j < gNbNodes.GetN(); ++j)
197 {
198 // We test 2 BWP in this test
199 for (uint8_t bwpId = 0; bwpId < 2; bwpId++)
200 {
201 Ptr<const NrSpectrumPhy> txSpectrumPhy =
202 nrHelper->GetGnbPhy(enbNetDev.Get(j), bwpId)->GetSpectrumPhy();
203 Ptr<SpectrumChannel> txSpectrumChannel = txSpectrumPhy->GetSpectrumChannel();
204 Ptr<ThreeGppPropagationLossModel> propagationLossModel =
205 DynamicCast<ThreeGppPropagationLossModel>(
206 txSpectrumChannel->GetPropagationLossModel());
207 NS_ASSERT(propagationLossModel != nullptr);
208 propagationLossModel->AssignStreams(1);
209 Ptr<ChannelConditionModel> channelConditionModel =
210 propagationLossModel->GetChannelConditionModel();
211 channelConditionModel->AssignStreams(1);
212 Ptr<ThreeGppSpectrumPropagationLossModel> spectrumLossModel =
213 DynamicCast<ThreeGppSpectrumPropagationLossModel>(
214 txSpectrumChannel->GetPhasedArraySpectrumPropagationLossModel());
215 NS_ASSERT(spectrumLossModel != nullptr);
216 Ptr<ThreeGppChannelModel> channel =
217 DynamicCast<ThreeGppChannelModel>(spectrumLossModel->GetChannelModel());
218 channel->AssignStreams(1);
219 }
220 }
221
222 for (uint32_t j = 0; j < ueNodes.GetN(); ++j)
223 {
224 // We test 2 BWP in this test
225 for (uint8_t bwpId = 0; bwpId < 2; bwpId++)
226 {
227 Ptr<const NrSpectrumPhy> txSpectrumPhy =
228 nrHelper->GetUePhy(ueNetDev.Get(j), bwpId)->GetSpectrumPhy();
229 Ptr<SpectrumChannel> txSpectrumChannel = txSpectrumPhy->GetSpectrumChannel();
230 Ptr<ThreeGppPropagationLossModel> propagationLossModel =
231 DynamicCast<ThreeGppPropagationLossModel>(
232 txSpectrumChannel->GetPropagationLossModel());
233 NS_ASSERT(propagationLossModel != nullptr);
234 propagationLossModel->AssignStreams(1);
235 Ptr<ChannelConditionModel> channelConditionModel =
236 propagationLossModel->GetChannelConditionModel();
237 channelConditionModel->AssignStreams(1);
238 Ptr<ThreeGppSpectrumPropagationLossModel> spectrumLossModel =
239 DynamicCast<ThreeGppSpectrumPropagationLossModel>(
240 txSpectrumChannel->GetPhasedArraySpectrumPropagationLossModel());
241 NS_ASSERT(spectrumLossModel != nullptr);
242 Ptr<ThreeGppChannelModel> channel =
243 DynamicCast<ThreeGppChannelModel>(spectrumLossModel->GetChannelModel());
244 channel->AssignStreams(1);
245 }
246 }
247
248 for (auto it = enbNetDev.Begin(); it != enbNetDev.End(); ++it)
249 {
250 DynamicCast<NrGnbNetDevice>(*it)->UpdateConfig();
251 }
252
253 for (auto it = ueNetDev.Begin(); it != ueNetDev.End(); ++it)
254 {
255 DynamicCast<NrUeNetDevice>(*it)->UpdateConfig();
256 }
257
258 // create the internet and install the IP stack on the UEs
259 // get SGW/PGW and create a single RemoteHost
260 Ptr<Node> pgw = epcHelper->GetPgwNode();
261 NodeContainer remoteHostContainer;
262 remoteHostContainer.Create(1);
263 Ptr<Node> remoteHost = remoteHostContainer.Get(0);
264 InternetStackHelper internet;
265 internet.Install(remoteHostContainer);
266 // connect a remoteHost to pgw. Setup routing too
267 PointToPointHelper p2ph;
268 p2ph.SetDeviceAttribute("DataRate", DataRateValue(DataRate("100Gb/s")));
269 p2ph.SetDeviceAttribute("Mtu", UintegerValue(2500));
270 p2ph.SetChannelAttribute("Delay", TimeValue(Seconds(0.000)));
271 NetDeviceContainer internetDevices = p2ph.Install(pgw, remoteHost);
272 Ipv4AddressHelper ipv4h;
273 ipv4h.SetBase("1.0.0.0", "255.0.0.0");
274 Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign(internetDevices);
275 // in this container, interface 0 is the pgw, 1 is the remoteHost
276 Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress(1);
277
278 Ipv4StaticRoutingHelper ipv4RoutingHelper;
279 Ptr<Ipv4StaticRouting> remoteHostStaticRouting =
280 ipv4RoutingHelper.GetStaticRouting(remoteHost->GetObject<Ipv4>());
281 remoteHostStaticRouting->AddNetworkRouteTo(Ipv4Address("7.0.0.0"), Ipv4Mask("255.0.0.0"), 1);
282 internet.Install(ueNodes);
283 Ipv4InterfaceContainer ueIpIface;
284 ueIpIface = epcHelper->AssignUeIpv4Address(NetDeviceContainer(ueNetDev));
285
286 // Set the default gateway for the UEs
287 for (uint32_t j = 0; j < ueNodes.GetN(); ++j)
288 {
289 Ptr<Ipv4StaticRouting> ueStaticRouting =
290 ipv4RoutingHelper.GetStaticRouting(ueNodes.Get(j)->GetObject<Ipv4>());
291 ueStaticRouting->SetDefaultRoute(epcHelper->GetUeDefaultGatewayAddress(), 1);
292 }
293
294 // attach UEs to the closest eNB
295 nrHelper->AttachToClosestEnb(ueNetDev, enbNetDev);
296
297 // assign IP address to UEs, and install UDP downlink applications
298 uint16_t dlPort = 1234;
299 uint16_t ulPort = 2000;
300 ApplicationContainer clientAppsDl;
301 ApplicationContainer serverAppsDl;
302 ApplicationContainer clientAppsUl;
303 ApplicationContainer serverAppsUl;
304 // ObjectMapValue objectMapValue;
305
306 if (m_isUplink)
307 {
308 // configure here UDP traffic
309 for (uint32_t j = 0; j < ueNodes.GetN(); ++j)
310 {
311 UdpServerHelper ulPacketSinkHelper(ulPort);
312 serverAppsUl.Add(ulPacketSinkHelper.Install(remoteHost));
313
314 UdpClientHelper ulClient(remoteHostAddr, ulPort);
315 ulClient.SetAttribute("MaxPackets", UintegerValue(0xFFFFFFFF));
316 ulClient.SetAttribute("PacketSize", UintegerValue(packetSize));
317 ulClient.SetAttribute(
318 "Interval",
319 TimeValue(Seconds(0.00001))); // we try to saturate, we just need to measure during
320 // a short time, how much traffic can handle each BWP
321 clientAppsUl.Add(ulClient.Install(ueNodes.Get(j)));
322
323 Ptr<EpcTft> tft = Create<EpcTft>();
324 EpcTft::PacketFilter ulpf;
325 ulpf.remotePortStart = ulPort;
326 ulpf.remotePortEnd = ulPort;
327 tft->Add(ulpf);
328
329 enum EpsBearer::Qci q;
330
331 if (j == 0)
332 {
333 q = EpsBearer::NGBR_LOW_LAT_EMBB;
334 }
335 else
336 {
337 q = EpsBearer::GBR_CONV_VOICE;
338 }
339
340 EpsBearer bearer(q);
341 nrHelper->ActivateDedicatedEpsBearer(ueNetDev.Get(j), bearer, tft);
342
343 ulPort++;
344 }
345
346 serverAppsUl.Start(Seconds(udpAppStartTime));
347 clientAppsUl.Start(Seconds(udpAppStartTime));
348 serverAppsUl.Stop(Seconds(simTime));
349 clientAppsUl.Stop(Seconds(simTime));
350 }
351
352 if (m_isDownlink)
353 {
354 UdpServerHelper dlPacketSinkHelper(dlPort);
355 serverAppsDl.Add(dlPacketSinkHelper.Install(ueNodes));
356
357 // configure here UDP traffic
358 for (uint32_t j = 0; j < ueNodes.GetN(); ++j)
359 {
360 UdpClientHelper dlClient(ueIpIface.GetAddress(j), dlPort);
361 dlClient.SetAttribute("MaxPackets", UintegerValue(0xFFFFFFFF));
362 dlClient.SetAttribute("PacketSize", UintegerValue(packetSize));
363 dlClient.SetAttribute(
364 "Interval",
365 TimeValue(Seconds(0.00001))); // we try to saturate, we just need to measure during
366 // a short time, how much traffic can handle each BWP
367 clientAppsDl.Add(dlClient.Install(remoteHost));
368
369 Ptr<EpcTft> tft = Create<EpcTft>();
370 EpcTft::PacketFilter dlpf;
371 dlpf.localPortStart = dlPort;
372 dlpf.localPortEnd = dlPort;
373 tft->Add(dlpf);
374
375 enum EpsBearer::Qci q;
376
377 if (j == 0)
378 {
379 q = EpsBearer::NGBR_LOW_LAT_EMBB;
380 }
381 else
382 {
383 q = EpsBearer::GBR_CONV_VOICE;
384 }
385
386 EpsBearer bearer(q);
387 nrHelper->ActivateDedicatedEpsBearer(ueNetDev.Get(j), bearer, tft);
388 }
389
390 // start UDP server and client apps
391 serverAppsDl.Start(Seconds(udpAppStartTime));
392 clientAppsDl.Start(Seconds(udpAppStartTime));
393 serverAppsDl.Stop(Seconds(simTime));
394 clientAppsDl.Stop(Seconds(simTime));
395 }
396
397 // nrHelper->EnableTraces();
398 Simulator::Stop(Seconds(simTime));
399 Simulator::Run();
400
401 if (m_isDownlink)
402 {
403 Ptr<UdpServer> serverApp1 = serverAppsDl.Get(0)->GetObject<UdpServer>();
404 Ptr<UdpServer> serverApp2 = serverAppsDl.Get(1)->GetObject<UdpServer>();
405 double throughput1 =
406 (serverApp1->GetReceived() * (packetSize + 28) * 8) / (simTime - udpAppStartTime);
407 double throughput2 =
408 (serverApp2->GetReceived() * (packetSize + 28) * 8) / (simTime - udpAppStartTime);
409
410 NS_TEST_ASSERT_MSG_EQ_TOL(throughput2,
411 throughput1 * m_bw2 / m_bw1,
412 std::max(throughput1, throughput2) * 0.2,
413 "Throughputs are not equal within tolerance");
414 NS_TEST_ASSERT_MSG_NE(throughput1, 0, "Throughput should be a non-zero value");
415 std::cout << "Total DL UDP throughput 1 (bps):" << throughput1 / 10e6 << "Mbps"
416 << std::endl;
417 std::cout << "Total DL UDP throughput 2 (bps):" << throughput2 / 10e6 << "Mbps"
418 << std::endl;
419 std::cout << "\n Test value throughput 1: " << (throughput2 * m_bw1 / m_bw2) / 10e6
420 << "Mbps" << std::endl;
421 std::cout << "\n Test value throughput 2: " << (throughput1 * m_bw2 / m_bw1) / 10e6
422 << "Mbps" << std::endl;
423 }
424 if (m_isUplink)
425 {
426 Ptr<UdpServer> serverApp1 = serverAppsUl.Get(0)->GetObject<UdpServer>();
427 Ptr<UdpServer> serverApp2 = serverAppsUl.Get(1)->GetObject<UdpServer>();
428 double throughput1 =
429 (serverApp1->GetReceived() * (packetSize + 28) * 8) / (simTime - udpAppStartTime);
430 double throughput2 =
431 (serverApp2->GetReceived() * (packetSize + 28) * 8) / (simTime - udpAppStartTime);
432
433 std::cout << "\nBw1:" << m_bw1 << ", bwp2:" << m_bw2 << std::endl;
434 std::cout << "Total UL UDP throughput 1 (bps):" << throughput1 / 10e6 << "Mbps"
435 << std::endl;
436 std::cout << "Total UL UDP throughput 2 (bps):" << throughput2 / 10e6 << "Mbps"
437 << std::endl;
438 std::cout << "Test expected throughput 1: " << (throughput2 * m_bw1 / m_bw2) / 10e6
439 << "Mbps" << std::endl;
440 std::cout << "Test expected throughput 2: " << (throughput1 * m_bw2 / m_bw1) / 10e6
441 << "Mbps" << std::endl;
442
443 NS_TEST_ASSERT_MSG_EQ_TOL(throughput2,
444 throughput1 * m_bw2 / m_bw1,
445 std::max(throughput1, throughput2) * 0.5,
446 "Throughputs are not equal within tolerance");
447
448 NS_TEST_ASSERT_MSG_NE(throughput1, 0, "Throughput should be a non-zero value");
449 }
450
451 Simulator::Destroy();
452}
453
454// The TestSuite class names the TestNrTestFdmOfNumerologiesTestSuite, identifies what type of
455// TestSuite, and enables the TestCases to be run. Typically, only the constructor for this class
456// must be defined
457//
458class NrTestFdmOfNumerologiesTestSuiteDlFour : public TestSuite
459{
460 public:
461 NrTestFdmOfNumerologiesTestSuiteDlFour();
462};
463
464NrTestFdmOfNumerologiesTestSuiteDlFour::NrTestFdmOfNumerologiesTestSuiteDlFour()
465 : TestSuite("nr-test-fdm-of-numerologies-dl-4", Type::SYSTEM)
466{
467 // downlink test cases
468 AddTestCase(
469 new NrTestFdmOfNumerologiesCase1("fdm dl 4, 50e6, 150e6", 4, 50e6, 150e6, true, false),
470 Duration::QUICK);
471 AddTestCase(
472 new NrTestFdmOfNumerologiesCase1("fdm dl 4, 100e6, 100e6", 4, 100e6, 100e6, true, false),
473 Duration::QUICK);
474 AddTestCase(
475 new NrTestFdmOfNumerologiesCase1("fdm dl 4, 80e6, 120e6", 4, 80e6, 120e6, true, false),
476 Duration::QUICK);
477 AddTestCase(
478 new NrTestFdmOfNumerologiesCase1("fdm dl 4 60e6, 140e6", 4, 60e6, 140e6, true, false),
479 Duration::QUICK);
480}
481
482// Do not forget to allocate an instance of this TestSuite
483static NrTestFdmOfNumerologiesTestSuiteDlFour nrTestFdmOfNumerologiesTestSuiteDlFour;
484
485// ----------------------------------------------------------------------------
486
487class NrTestFdmOfNumerologiesTestSuiteDlTwo : public TestSuite
488{
489 public:
490 NrTestFdmOfNumerologiesTestSuiteDlTwo();
491};
492
493NrTestFdmOfNumerologiesTestSuiteDlTwo::NrTestFdmOfNumerologiesTestSuiteDlTwo()
494 : TestSuite("nr-test-fdm-of-numerologies-dl-2", Type::SYSTEM)
495{
496 AddTestCase(
497 new NrTestFdmOfNumerologiesCase1("fdm dl 2 50e6 150e6", 2, 50e6, 150e6, true, false),
498 Duration::QUICK);
499 AddTestCase(
500 new NrTestFdmOfNumerologiesCase1("fdm dl 2 100e6 100e6", 2, 100e6, 100e6, true, false),
501 Duration::QUICK);
502 AddTestCase(
503 new NrTestFdmOfNumerologiesCase1("fdm dl 2 80e6 120e6", 2, 80e6, 120e6, true, false),
504 Duration::QUICK);
505 AddTestCase(
506 new NrTestFdmOfNumerologiesCase1("fdm dl 2 60e6 140e6", 2, 60e6, 140e6, true, false),
507 Duration::QUICK);
508}
509
510// Do not forget to allocate an instance of this TestSuite
511static NrTestFdmOfNumerologiesTestSuiteDlTwo nrTestFdmOfNumerologiesTestSuiteDlTwo;
512
513// ----------------------------------------------------------------------------
514
515class NrTestFdmOfNumerologiesTestSuiteUlFour : public TestSuite
516{
517 public:
518 NrTestFdmOfNumerologiesTestSuiteUlFour();
519};
520
521NrTestFdmOfNumerologiesTestSuiteUlFour::NrTestFdmOfNumerologiesTestSuiteUlFour()
522 : TestSuite("nr-test-fdm-of-numerologies-ul-4", Type::SYSTEM)
523{
524 AddTestCase(
525 new NrTestFdmOfNumerologiesCase1("fdm ul 4, 50e6, 150e6", 4, 50e6, 150e6, false, true),
526 Duration::QUICK);
527 AddTestCase(
528 new NrTestFdmOfNumerologiesCase1("fdm ul 4, 100e6, 100e6", 4, 100e6, 100e6, false, true),
529 Duration::QUICK);
530 AddTestCase(
531 new NrTestFdmOfNumerologiesCase1("fdm ul 4, 80e6, 120e6", 4, 80e6, 120e6, false, true),
532 Duration::QUICK);
533 AddTestCase(
534 new NrTestFdmOfNumerologiesCase1("fdm ul 4 60e6, 140e6", 4, 60e6, 140e6, false, true),
535 Duration::QUICK);
536}
537
538// Do not forget to allocate an instance of this TestSuite
539static NrTestFdmOfNumerologiesTestSuiteUlFour nrTestFdmOfNumerologiesTestSuiteUlFour;
540
541// ----------------------------------------------------------------------------
542
543class NrTestFdmOfNumerologiesTestSuiteUlTwo : public TestSuite
544{
545 public:
546 NrTestFdmOfNumerologiesTestSuiteUlTwo();
547};
548
549NrTestFdmOfNumerologiesTestSuiteUlTwo::NrTestFdmOfNumerologiesTestSuiteUlTwo()
550 : TestSuite("nr-test-fdm-of-numerologies-ul-2", Type::SYSTEM)
551{
552 AddTestCase(
553 new NrTestFdmOfNumerologiesCase1("fdm ul 2 50e6 150e6", 2, 50e6, 150e6, false, true),
554 Duration::QUICK);
555 // AddTestCase (new NrTestFdmOfNumerologiesCase1 ("fdm ul 2 100e6 100e6", 2, 100e6, 100e6,
556 // false, true), Duration::QUICK); AddTestCase (new NrTestFdmOfNumerologiesCase1 ("fdm ul 2 80e6
557 // 120e6" , 2, 80e6, 120e6, false, true), Duration::QUICK); AddTestCase (new
558 // NrTestFdmOfNumerologiesCase1 ("fdm ul 2 60e6 140e6", 2, 60e6, 140e6, false, true),
559 // Duration::QUICK);
560}
561
562// Do not forget to allocate an instance of this TestSuite
563static NrTestFdmOfNumerologiesTestSuiteUlTwo nrTestFdmOfNumerologiesTestSuiteUlTwo;
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.
std::vector< std::reference_wrapper< BandwidthPartInfoPtr > > BandwidthPartInfoPtrVector
vector of unique_ptr of BandwidthPartInfo
@ UMi_StreetCanyon_LoS
UMi_StreetCanyon where all the nodes will be in Line-of-Sight.
Minimum configuration requirements for a OperationBand.
Operation band information structure.
std::vector< ComponentCarrierInfoPtr > m_cc
Operation band component carriers.