A Discrete-Event Network Simulator
API
lte-test-interference-fr.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2014 Piotr Gawlowicz
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Author: Piotr Gawlowicz <gawlowicz.p@gmail.com>
18 * Based on lte-test-interference.{h,cc} by Manuel Requena <manuel.requena@cttc.es>
19 * Nicola Baldo
20 * <nbaldo@cttc.es>
21 */
22
24
26
27#include "ns3/boolean.h"
28#include "ns3/double.h"
29#include "ns3/ff-mac-scheduler.h"
30#include "ns3/log.h"
31#include "ns3/lte-enb-net-device.h"
32#include "ns3/lte-enb-phy.h"
33#include "ns3/lte-helper.h"
34#include "ns3/lte-spectrum-value-helper.h"
35#include "ns3/lte-ue-net-device.h"
36#include "ns3/lte-ue-phy.h"
37#include "ns3/mobility-helper.h"
38#include "ns3/simulator.h"
39#include "ns3/spectrum-value.h"
40#include "ns3/string.h"
41#include <ns3/enum.h>
42#include <ns3/lte-chunk-processor.h>
43#include <ns3/pointer.h>
44
45using namespace ns3;
46
47NS_LOG_COMPONENT_DEFINE("LteInterferenceFrTest");
48
54 : TestSuite("lte-interference-fr", SYSTEM)
55{
56 // LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_DEBUG);
57 // LogComponentEnable ("LteInterferenceFrTest", logLevel);
58
60 50.000000,
61 20.000000,
62 356449.932732,
63 10803.280215),
64 TestCase::QUICK);
66 50.000000,
67 50.000000,
68 356449.932732,
69 10803.280215),
70 TestCase::QUICK);
72 50.000000,
73 200.000000,
74 356449.932732,
75 10803.280215),
76 TestCase::QUICK);
78 50.000000,
79 500.000000,
80 356449.932732,
81 10803.280215),
82 TestCase::QUICK);
83
85 50.000000,
86 20.000000,
87 0.160000,
88 0.159998,
89 356449.932732,
90 10803.280215,
91 18),
92 TestCase::QUICK);
94 50.000000,
95 50.000000,
96 0.999997,
97 0.999907,
98 356449.932732,
99 10803.280215,
100 28),
101 TestCase::QUICK);
103 50.000000,
104 200.000000,
105 15.999282,
106 15.976339,
107 356449.932732,
108 10803.280215,
109 30),
110 TestCase::QUICK);
112 50.000000,
113 500.000000,
114 99.971953,
115 99.082845,
116 356449.932732,
117 10803.280215,
118 30),
119 TestCase::QUICK);
120}
121
127
132 double d1,
133 double d2,
134 double dlSinr,
135 double ulSinr)
136 : TestCase("Test: " + name),
137 m_d1(d1),
138 m_d2(d2),
139 m_expectedDlSinrDb(10 * std::log10(dlSinr))
140{
141 NS_LOG_INFO("Creating LteInterferenceFrTestCase");
142}
143
145{
146}
147
148void
150{
151 NS_LOG_INFO(this << GetName());
152 NS_LOG_DEBUG("LteInterferenceHardFrTestCase");
153
155 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(false));
156
157 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
158 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
159 Config::SetDefault("ns3::LteAmc::AmcModel", EnumValue(LteAmc::PiroEW2010));
160 Config::SetDefault("ns3::LteAmc::Ber", DoubleValue(0.00005));
161
162 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
163 lteHelper->SetFfrAlgorithmType("ns3::LteFrHardAlgorithm");
164
165 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
166
167 // Create Nodes: eNodeB and UE
168 NodeContainer enbNodes;
169 NodeContainer ueNodes1;
170 NodeContainer ueNodes2;
171 enbNodes.Create(2);
172 ueNodes1.Create(1);
173 ueNodes2.Create(1);
174 NodeContainer allNodes = NodeContainer(enbNodes, ueNodes1, ueNodes2);
175
176 // the topology is the following:
177 // d2
178 // UE1-----------eNB2
179 // | |
180 // d1| |d1
181 // | d2 |
182 // eNB1----------UE2
183 //
184 Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
185 positionAlloc->Add(Vector(0.0, 0.0, 0.0)); // eNB1
186 positionAlloc->Add(Vector(m_d2, m_d1, 0.0)); // eNB2
187 positionAlloc->Add(Vector(0.0, m_d1, 0.0)); // UE1
188 positionAlloc->Add(Vector(m_d2, 0.0, 0.0)); // UE2
190 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
191 mobility.SetPositionAllocator(positionAlloc);
192 mobility.Install(allNodes);
193
194 // Create Devices and install them in the Nodes (eNB and UE)
195 NetDeviceContainer enbDevs;
196 NetDeviceContainer ueDevs1;
197 NetDeviceContainer ueDevs2;
198 lteHelper->SetSchedulerType("ns3::PfFfMacScheduler");
199 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::PUSCH_UL_CQI));
200
201 lteHelper->SetFfrAlgorithmAttribute("DlSubBandOffset", UintegerValue(0));
202 lteHelper->SetFfrAlgorithmAttribute("DlSubBandwidth", UintegerValue(12));
203 lteHelper->SetFfrAlgorithmAttribute("UlSubBandOffset", UintegerValue(0));
204 lteHelper->SetFfrAlgorithmAttribute("UlSubBandwidth", UintegerValue(25));
205 enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(0)));
206
207 lteHelper->SetFfrAlgorithmAttribute("DlSubBandOffset", UintegerValue(12));
208 lteHelper->SetFfrAlgorithmAttribute("DlSubBandwidth", UintegerValue(12));
209 lteHelper->SetFfrAlgorithmAttribute("UlSubBandOffset", UintegerValue(0));
210 lteHelper->SetFfrAlgorithmAttribute("UlSubBandwidth", UintegerValue(25));
211 enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(1)));
212
213 ueDevs1 = lteHelper->InstallUeDevice(ueNodes1);
214 ueDevs2 = lteHelper->InstallUeDevice(ueNodes2);
215
216 lteHelper->Attach(ueDevs1, enbDevs.Get(0));
217 lteHelper->Attach(ueDevs2, enbDevs.Get(1));
218
219 // Activate an EPS bearer
220 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
221 EpsBearer bearer(q);
222 lteHelper->ActivateDataRadioBearer(ueDevs1, bearer);
223 lteHelper->ActivateDataRadioBearer(ueDevs2, bearer);
224
225 // Use testing chunk processor in the PHY layer
226 // It will be used to test that the SNR is as intended
227 // we plug in two instances, one for DL and one for UL
228
229 Ptr<LtePhy> ue1Phy = ueDevs1.Get(0)->GetObject<LteUeNetDevice>()->GetPhy()->GetObject<LtePhy>();
230 Ptr<LteChunkProcessor> testDlSinr1 = Create<LteChunkProcessor>();
231 LteSpectrumValueCatcher dlSinr1Catcher;
232 testDlSinr1->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &dlSinr1Catcher));
233 ue1Phy->GetDownlinkSpectrumPhy()->AddDataSinrChunkProcessor(testDlSinr1);
234
235 Ptr<LtePhy> enb1phy =
236 enbDevs.Get(0)->GetObject<LteEnbNetDevice>()->GetPhy()->GetObject<LtePhy>();
237 Ptr<LteChunkProcessor> testUlSinr1 = Create<LteChunkProcessor>();
238 LteSpectrumValueCatcher ulSinr1Catcher;
239 testUlSinr1->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &ulSinr1Catcher));
240 enb1phy->GetUplinkSpectrumPhy()->AddDataSinrChunkProcessor(testUlSinr1);
241
242 // same as above for eNB2 and UE2
243
244 Ptr<LtePhy> ue2Phy = ueDevs2.Get(0)->GetObject<LteUeNetDevice>()->GetPhy()->GetObject<LtePhy>();
245 Ptr<LteChunkProcessor> testDlSinr2 = Create<LteChunkProcessor>();
246 LteSpectrumValueCatcher dlSinr2Catcher;
247 testDlSinr2->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &dlSinr2Catcher));
248 ue2Phy->GetDownlinkSpectrumPhy()->AddDataSinrChunkProcessor(testDlSinr2);
249
250 Ptr<LtePhy> enb2phy =
251 enbDevs.Get(1)->GetObject<LteEnbNetDevice>()->GetPhy()->GetObject<LtePhy>();
252 Ptr<LteChunkProcessor> testUlSinr2 = Create<LteChunkProcessor>();
253 LteSpectrumValueCatcher ulSinr2Catcher;
254 testUlSinr2->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &ulSinr2Catcher));
255 enb1phy->GetUplinkSpectrumPhy()->AddDataSinrChunkProcessor(testUlSinr2);
256
257 // need to allow for RRC connection establishment + SRS
258 Simulator::Stop(Seconds(0.200));
259 Simulator::Run();
260
261 for (uint32_t i = 0; i < 12; i++)
262 {
263 double dlSinr1 = dlSinr1Catcher.GetValue()->operator[](i);
264 double dlSinr1Db = 10.0 * std::log10(dlSinr1);
267 0.01,
268 "Wrong SINR in DL! (eNB1 --> UE1)");
269
270 double dlSinr2 = dlSinr2Catcher.GetValue()->operator[](i);
271 NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr2, 0, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
272 }
273
274 for (uint32_t i = 12; i < 24; i++)
275 {
276 double dlSinr1 = dlSinr1Catcher.GetValue()->operator[](i);
277 NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr1, 0, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
278
279 double dlSinr2 = dlSinr2Catcher.GetValue()->operator[](i);
280 double dlSinr2Db = 10.0 * std::log10(dlSinr2);
283 0.01,
284 "Wrong SINR in DL! (eNB2 --> UE2)");
285 }
286
287 // FR algorithms do not operate in uplink now, so we do not test it
288 // double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetValue ()->operator[] (0));
289 // NS_LOG_DEBUG("ulSinr1Db: "<< ulSinr1Db);
290 // NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL! (UE1 -->
291 // eNB1)");
292 //
293 // double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetValue ()->operator[] (0));
294 // NS_LOG_DEBUG("ulSinr2Db: "<< ulSinr2Db);
295 // NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL! (UE2 -->
296 // eNB2)");
297
298 Simulator::Destroy();
299}
300
302 double d1,
303 double d2,
304 double commonDlSinr,
305 double commonUlSinr,
306 double edgeDlSinr,
307 double edgeUlSinr,
308 uint32_t rspqThreshold)
309 : TestCase("Test: " + name),
310 m_d1(d1),
311 m_d2(d2),
312 m_commonDlSinrDb(10 * std::log10(commonDlSinr)),
313 m_edgeDlSinrDb(10 * std::log10(edgeDlSinr)),
314 m_rspqThreshold(rspqThreshold)
315{
316 NS_LOG_INFO("Creating LteInterferenceFrTestCase");
317}
318
320{
321}
322
323void
325{
326 NS_LOG_INFO(this << GetName());
327 NS_LOG_DEBUG("LteInterferenceStrictFrTestCase");
328
330 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
331
332 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
333 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
334 Config::SetDefault("ns3::LteAmc::AmcModel", EnumValue(LteAmc::PiroEW2010));
335 Config::SetDefault("ns3::LteAmc::Ber", DoubleValue(0.00005));
336
337 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
338 lteHelper->SetFfrAlgorithmType("ns3::LteFrStrictAlgorithm");
339 lteHelper->SetFfrAlgorithmAttribute("RsrqThreshold", UintegerValue(m_rspqThreshold));
340 lteHelper->SetFfrAlgorithmAttribute("CenterPowerOffset",
341 UintegerValue(LteRrcSap::PdschConfigDedicated::dB0));
342 lteHelper->SetFfrAlgorithmAttribute("EdgePowerOffset",
343 UintegerValue(LteRrcSap::PdschConfigDedicated::dB0));
344
345 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
346
347 // Create Nodes: eNodeB and UE
348 NodeContainer enbNodes;
349 NodeContainer ueNodes1;
350 NodeContainer ueNodes2;
351 enbNodes.Create(2);
352 ueNodes1.Create(2);
353 ueNodes2.Create(2);
354 NodeContainer allNodes = NodeContainer(enbNodes, ueNodes1, ueNodes2);
355
356 // the topology is the following:
357 // d2
358 // UE1-----------eNB2
359 // | |
360 // d1| |d1
361 // | d2 |
362 // eNB1----------UE2
363 //
364 Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
365 positionAlloc->Add(Vector(0.0, 0.0, 0.0)); // eNB1
366 positionAlloc->Add(Vector(m_d2, m_d1, 0.0)); // eNB2
367
368 positionAlloc->Add(Vector(0.0, m_d1, 0.0)); // UE1-eNB1
369 positionAlloc->Add(Vector(0.5 * m_d2, 0.0, 0.0)); // UE2-eNB1
370
371 positionAlloc->Add(Vector(m_d2, 0.0, 0.0)); // UE1-eNB2
372 positionAlloc->Add(Vector(0.5 * m_d2, m_d1, 0.0)); // UE2-eNB2
373
375 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
376 mobility.SetPositionAllocator(positionAlloc);
377 mobility.Install(allNodes);
378
379 // Create Devices and install them in the Nodes (eNB and UE)
380 NetDeviceContainer enbDevs;
381 NetDeviceContainer ueDevs1;
382 NetDeviceContainer ueDevs2;
383 lteHelper->SetSchedulerType("ns3::PfFfMacScheduler");
384 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::PUSCH_UL_CQI));
385
386 lteHelper->SetFfrAlgorithmAttribute("DlCommonSubBandwidth", UintegerValue(12));
387 lteHelper->SetFfrAlgorithmAttribute("DlEdgeSubBandOffset", UintegerValue(0));
388 lteHelper->SetFfrAlgorithmAttribute("DlEdgeSubBandwidth", UintegerValue(6));
389 lteHelper->SetFfrAlgorithmAttribute("UlCommonSubBandwidth", UintegerValue(25));
390 lteHelper->SetFfrAlgorithmAttribute("UlEdgeSubBandOffset", UintegerValue(0));
391 lteHelper->SetFfrAlgorithmAttribute("UlEdgeSubBandwidth", UintegerValue(0));
392
393 enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(0)));
394
395 lteHelper->SetFfrAlgorithmAttribute("DlCommonSubBandwidth", UintegerValue(12));
396 lteHelper->SetFfrAlgorithmAttribute("DlEdgeSubBandOffset", UintegerValue(6));
397 lteHelper->SetFfrAlgorithmAttribute("DlEdgeSubBandwidth", UintegerValue(6));
398 enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(1)));
399
400 ueDevs1 = lteHelper->InstallUeDevice(ueNodes1);
401 ueDevs2 = lteHelper->InstallUeDevice(ueNodes2);
402
403 lteHelper->Attach(ueDevs1, enbDevs.Get(0));
404 lteHelper->Attach(ueDevs2, enbDevs.Get(1));
405
406 // Activate an EPS bearer
407 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
408 EpsBearer bearer(q);
409 lteHelper->ActivateDataRadioBearer(ueDevs1, bearer);
410 lteHelper->ActivateDataRadioBearer(ueDevs2, bearer);
411
412 // Use testing chunk processor in the PHY layer
413 // It will be used to test that the SNR is as intended
414 // we plug in two instances, one for DL and one for UL
415
416 Ptr<LtePhy> ue1Phy = ueDevs1.Get(0)->GetObject<LteUeNetDevice>()->GetPhy()->GetObject<LtePhy>();
417 Ptr<LteChunkProcessor> testDlSinr1 = Create<LteChunkProcessor>();
418 LteSpectrumValueCatcher dlSinr1Catcher;
419 testDlSinr1->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &dlSinr1Catcher));
420 ue1Phy->GetDownlinkSpectrumPhy()->AddDataSinrChunkProcessor(testDlSinr1);
421
422 Ptr<LtePhy> enb1phy =
423 enbDevs.Get(0)->GetObject<LteEnbNetDevice>()->GetPhy()->GetObject<LtePhy>();
424 Ptr<LteChunkProcessor> testUlSinr1 = Create<LteChunkProcessor>();
425 LteSpectrumValueCatcher ulSinr1Catcher;
426 testUlSinr1->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &ulSinr1Catcher));
427 enb1phy->GetUplinkSpectrumPhy()->AddDataSinrChunkProcessor(testUlSinr1);
428
429 // same as above for eNB2 and UE2
430
431 Ptr<LtePhy> ue2Phy = ueDevs2.Get(0)->GetObject<LteUeNetDevice>()->GetPhy()->GetObject<LtePhy>();
432 Ptr<LteChunkProcessor> testDlSinr2 = Create<LteChunkProcessor>();
433 LteSpectrumValueCatcher dlSinr2Catcher;
434 testDlSinr2->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &dlSinr2Catcher));
435 ue2Phy->GetDownlinkSpectrumPhy()->AddDataSinrChunkProcessor(testDlSinr2);
436
437 Ptr<LtePhy> enb2phy =
438 enbDevs.Get(1)->GetObject<LteEnbNetDevice>()->GetPhy()->GetObject<LtePhy>();
439 Ptr<LteChunkProcessor> testUlSinr2 = Create<LteChunkProcessor>();
440 LteSpectrumValueCatcher ulSinr2Catcher;
441 testUlSinr2->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &ulSinr2Catcher));
442 enb1phy->GetUplinkSpectrumPhy()->AddDataSinrChunkProcessor(testUlSinr2);
443
444 // need to allow for UE Measurement report
445 Simulator::Stop(Seconds(2.000));
446 Simulator::Run();
447
448 for (uint32_t i = 0; i < 12; i++)
449 {
450 double dlSinr1 = dlSinr1Catcher.GetValue()->operator[](i);
451 double dlSinr1Db = 10.0 * std::log10(dlSinr1);
454 0.01,
455 "Wrong SINR in DL! (eNB1 --> UE1)");
456
457 double dlSinr2 = dlSinr2Catcher.GetValue()->operator[](i);
458 double dlSinr2Db = 10.0 * std::log10(dlSinr2);
461 0.01,
462 "Wrong SINR in DL! (eNB2 --> UE2)");
463 }
464
465 for (uint32_t i = 12; i < 18; i++)
466 {
467 double dlSinr1 = dlSinr1Catcher.GetValue()->operator[](i);
468 double dlSinr1Db = 10.0 * std::log10(dlSinr1);
471 0.01,
472 "Wrong SINR in DL! (eNB1 --> UE1)");
473
474 double dlSinr2 = dlSinr2Catcher.GetValue()->operator[](i);
475 NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr2, 0, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
476 }
477
478 for (uint32_t i = 18; i < 24; i++)
479 {
480 double dlSinr1 = dlSinr1Catcher.GetValue()->operator[](i);
481 NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr1, 0, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
482
483 double dlSinr2 = dlSinr2Catcher.GetValue()->operator[](i);
484 double dlSinr2Db = 10.0 * std::log10(dlSinr2);
487 0.01,
488 "Wrong SINR in DL! (eNB2 --> UE2)");
489 }
490
491 // FR algorithms do not operate in uplink now, so we do not test it
492 // double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetValue ()->operator[] (0));
493 // NS_LOG_DEBUG("ulSinr1Db: "<< ulSinr1Db);
494 // NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL! (UE1 -->
495 // eNB1)");
496 //
497 // double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetValue ()->operator[] (0));
498 // NS_LOG_DEBUG("ulSinr2Db: "<< ulSinr2Db);
499 // NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL! (UE2 -->
500 // eNB2)");
501
502 Simulator::Destroy();
503}
Test suite for the interference test when using different frequency reuse algorithms....
Lte interference test when using hard frequency reuse algorithm.
double m_expectedDlSinrDb
expected DL SINR in dB
void DoRun() override
Implementation to actually run this TestCase.
double m_d2
distance between UE and other ENB
double m_d1
distance between UE and ENB
LteInterferenceHardFrTestCase(std::string name, double d1, double d2, double dlSinr, double ulSinr)
Constructor.
Lte interference test when using strict frequency reuse algorithm.
double m_d1
distance between UE and ENB
void DoRun() override
Implementation to actually run this TestCase.
double m_commonDlSinrDb
expected common DL SINR in dB
double m_edgeDlSinrDb
expected edge DL SINR in dB
LteInterferenceStrictFrTestCase(std::string name, double d1, double d2, double commonDlSinr, double commonUlSinr, double edgeDlSinr, double edgeUlSinr, uint32_t rspqThreshold)
Constructor.
double m_d2
distance between UE and other ENB
AttributeValue implementation for Boolean.
Definition: boolean.h:37
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:42
Hold variables of type enum.
Definition: enum.h:56
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:91
Qci
QoS Class Indicator.
Definition: eps-bearer.h:106
The eNodeB device implementation.
void SetFfrAlgorithmType(std::string type)
Set the type of FFR algorithm to be used by eNodeB devices.
Definition: lte-helper.cc:316
void SetSchedulerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the scheduler to be created.
Definition: lte-helper.cc:303
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:482
void SetFfrAlgorithmAttribute(std::string n, const AttributeValue &v)
Set an attribute for the FFR algorithm to be created.
Definition: lte-helper.cc:324
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:289
void Attach(NetDeviceContainer ueDevices)
Enables automatic attachment of a set of UE devices to a suitable cell using Idle mode initial cell s...
Definition: lte-helper.cc:1044
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1441
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:497
The LtePhy models the physical layer of LTE.
Definition: lte-phy.h:50
A sink to be plugged to the callback of LteChunkProcessor allowing to save and later retrieve the lat...
Ptr< SpectrumValue > GetValue()
The LteUeNetDevice class implements the UE net device.
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:200
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
Hold variables of type string.
Definition: string.h:56
encapsulates test code
Definition: test.h:1060
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:305
std::string GetName() const
Definition: test.cc:377
A suite of tests to run.
Definition: test.h:1256
Hold an unsigned integer type.
Definition: uinteger.h:45
void Reset()
Reset the initial value of every attribute as well as the value of every global to what they were bef...
Definition: config.cc:856
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:891
#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_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:275
static LteInterferenceFrTestSuite LteInterferenceFrTestSuite
Static variable for test initialization.
#define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report and...
Definition: test.h:337
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1336
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:691
STL namespace.
mobility
Definition: third.py:96