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
123
128 double d1,
129 double d2,
130 double dlSinr,
131 double ulSinr)
132 : TestCase("Test: " + name),
133 m_d1(d1),
134 m_d2(d2),
135 m_expectedDlSinrDb(10 * std::log10(dlSinr))
136{
137 NS_LOG_INFO("Creating LteInterferenceFrTestCase");
138}
139
141{
142}
143
144void
146{
147 NS_LOG_INFO(this << GetName());
148 NS_LOG_DEBUG("LteInterferenceHardFrTestCase");
149
151 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(false));
152
153 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
154 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
155 Config::SetDefault("ns3::LteAmc::AmcModel", EnumValue(LteAmc::PiroEW2010));
156 Config::SetDefault("ns3::LteAmc::Ber", DoubleValue(0.00005));
157
158 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
159 lteHelper->SetFfrAlgorithmType("ns3::LteFrHardAlgorithm");
160
161 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
162
163 // Create Nodes: eNodeB and UE
164 NodeContainer enbNodes;
165 NodeContainer ueNodes1;
166 NodeContainer ueNodes2;
167 enbNodes.Create(2);
168 ueNodes1.Create(1);
169 ueNodes2.Create(1);
170 NodeContainer allNodes = NodeContainer(enbNodes, ueNodes1, ueNodes2);
171
172 // the topology is the following:
173 // d2
174 // UE1-----------eNB2
175 // | |
176 // d1| |d1
177 // | d2 |
178 // eNB1----------UE2
179 //
180 Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
181 positionAlloc->Add(Vector(0.0, 0.0, 0.0)); // eNB1
182 positionAlloc->Add(Vector(m_d2, m_d1, 0.0)); // eNB2
183 positionAlloc->Add(Vector(0.0, m_d1, 0.0)); // UE1
184 positionAlloc->Add(Vector(m_d2, 0.0, 0.0)); // UE2
186 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
187 mobility.SetPositionAllocator(positionAlloc);
188 mobility.Install(allNodes);
189
190 // Create Devices and install them in the Nodes (eNB and UE)
191 NetDeviceContainer enbDevs;
192 NetDeviceContainer ueDevs1;
193 NetDeviceContainer ueDevs2;
194 lteHelper->SetSchedulerType("ns3::PfFfMacScheduler");
195 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::PUSCH_UL_CQI));
196
197 lteHelper->SetFfrAlgorithmAttribute("DlSubBandOffset", UintegerValue(0));
198 lteHelper->SetFfrAlgorithmAttribute("DlSubBandwidth", UintegerValue(12));
199 lteHelper->SetFfrAlgorithmAttribute("UlSubBandOffset", UintegerValue(0));
200 lteHelper->SetFfrAlgorithmAttribute("UlSubBandwidth", UintegerValue(25));
201 enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(0)));
202
203 lteHelper->SetFfrAlgorithmAttribute("DlSubBandOffset", UintegerValue(12));
204 lteHelper->SetFfrAlgorithmAttribute("DlSubBandwidth", UintegerValue(12));
205 lteHelper->SetFfrAlgorithmAttribute("UlSubBandOffset", UintegerValue(0));
206 lteHelper->SetFfrAlgorithmAttribute("UlSubBandwidth", UintegerValue(25));
207 enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(1)));
208
209 ueDevs1 = lteHelper->InstallUeDevice(ueNodes1);
210 ueDevs2 = lteHelper->InstallUeDevice(ueNodes2);
211
212 lteHelper->Attach(ueDevs1, enbDevs.Get(0));
213 lteHelper->Attach(ueDevs2, enbDevs.Get(1));
214
215 // Activate an EPS bearer
216 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
217 EpsBearer bearer(q);
218 lteHelper->ActivateDataRadioBearer(ueDevs1, bearer);
219 lteHelper->ActivateDataRadioBearer(ueDevs2, bearer);
220
221 // Use testing chunk processor in the PHY layer
222 // It will be used to test that the SNR is as intended
223 // we plug in two instances, one for DL and one for UL
224
225 Ptr<LtePhy> ue1Phy = ueDevs1.Get(0)->GetObject<LteUeNetDevice>()->GetPhy()->GetObject<LtePhy>();
226 Ptr<LteChunkProcessor> testDlSinr1 = Create<LteChunkProcessor>();
227 LteSpectrumValueCatcher dlSinr1Catcher;
228 testDlSinr1->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &dlSinr1Catcher));
229 ue1Phy->GetDownlinkSpectrumPhy()->AddDataSinrChunkProcessor(testDlSinr1);
230
231 Ptr<LtePhy> enb1phy =
232 enbDevs.Get(0)->GetObject<LteEnbNetDevice>()->GetPhy()->GetObject<LtePhy>();
233 Ptr<LteChunkProcessor> testUlSinr1 = Create<LteChunkProcessor>();
234 LteSpectrumValueCatcher ulSinr1Catcher;
235 testUlSinr1->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &ulSinr1Catcher));
236 enb1phy->GetUplinkSpectrumPhy()->AddDataSinrChunkProcessor(testUlSinr1);
237
238 // same as above for eNB2 and UE2
239
240 Ptr<LtePhy> ue2Phy = ueDevs2.Get(0)->GetObject<LteUeNetDevice>()->GetPhy()->GetObject<LtePhy>();
241 Ptr<LteChunkProcessor> testDlSinr2 = Create<LteChunkProcessor>();
242 LteSpectrumValueCatcher dlSinr2Catcher;
243 testDlSinr2->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &dlSinr2Catcher));
244 ue2Phy->GetDownlinkSpectrumPhy()->AddDataSinrChunkProcessor(testDlSinr2);
245
246 Ptr<LtePhy> enb2phy =
247 enbDevs.Get(1)->GetObject<LteEnbNetDevice>()->GetPhy()->GetObject<LtePhy>();
248 Ptr<LteChunkProcessor> testUlSinr2 = Create<LteChunkProcessor>();
249 LteSpectrumValueCatcher ulSinr2Catcher;
250 testUlSinr2->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &ulSinr2Catcher));
251 enb1phy->GetUplinkSpectrumPhy()->AddDataSinrChunkProcessor(testUlSinr2);
252
253 // need to allow for RRC connection establishment + SRS
254 Simulator::Stop(Seconds(0.200));
255 Simulator::Run();
256
257 for (uint32_t i = 0; i < 12; i++)
258 {
259 double dlSinr1 = dlSinr1Catcher.GetValue()->operator[](i);
260 double dlSinr1Db = 10.0 * std::log10(dlSinr1);
263 0.01,
264 "Wrong SINR in DL! (eNB1 --> UE1)");
265
266 double dlSinr2 = dlSinr2Catcher.GetValue()->operator[](i);
267 NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr2, 0, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
268 }
269
270 for (uint32_t i = 12; i < 24; i++)
271 {
272 double dlSinr1 = dlSinr1Catcher.GetValue()->operator[](i);
273 NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr1, 0, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
274
275 double dlSinr2 = dlSinr2Catcher.GetValue()->operator[](i);
276 double dlSinr2Db = 10.0 * std::log10(dlSinr2);
279 0.01,
280 "Wrong SINR in DL! (eNB2 --> UE2)");
281 }
282
283 // FR algorithms do not operate in uplink now, so we do not test it
284 // double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetValue ()->operator[] (0));
285 // NS_LOG_DEBUG("ulSinr1Db: "<< ulSinr1Db);
286 // NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL! (UE1 -->
287 // eNB1)");
288 //
289 // double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetValue ()->operator[] (0));
290 // NS_LOG_DEBUG("ulSinr2Db: "<< ulSinr2Db);
291 // NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL! (UE2 -->
292 // eNB2)");
293
294 Simulator::Destroy();
295}
296
298 double d1,
299 double d2,
300 double commonDlSinr,
301 double commonUlSinr,
302 double edgeDlSinr,
303 double edgeUlSinr,
304 uint32_t rspqThreshold)
305 : TestCase("Test: " + name),
306 m_d1(d1),
307 m_d2(d2),
308 m_commonDlSinrDb(10 * std::log10(commonDlSinr)),
309 m_edgeDlSinrDb(10 * std::log10(edgeDlSinr)),
310 m_rspqThreshold(rspqThreshold)
311{
312 NS_LOG_INFO("Creating LteInterferenceFrTestCase");
313}
314
316{
317}
318
319void
321{
322 NS_LOG_INFO(this << GetName());
323 NS_LOG_DEBUG("LteInterferenceStrictFrTestCase");
324
326 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
327
328 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
329 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
330 Config::SetDefault("ns3::LteAmc::AmcModel", EnumValue(LteAmc::PiroEW2010));
331 Config::SetDefault("ns3::LteAmc::Ber", DoubleValue(0.00005));
332
333 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
334 lteHelper->SetFfrAlgorithmType("ns3::LteFrStrictAlgorithm");
335 lteHelper->SetFfrAlgorithmAttribute("RsrqThreshold", UintegerValue(m_rspqThreshold));
336 lteHelper->SetFfrAlgorithmAttribute("CenterPowerOffset",
337 UintegerValue(LteRrcSap::PdschConfigDedicated::dB0));
338 lteHelper->SetFfrAlgorithmAttribute("EdgePowerOffset",
339 UintegerValue(LteRrcSap::PdschConfigDedicated::dB0));
340
341 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
342
343 // Create Nodes: eNodeB and UE
344 NodeContainer enbNodes;
345 NodeContainer ueNodes1;
346 NodeContainer ueNodes2;
347 enbNodes.Create(2);
348 ueNodes1.Create(2);
349 ueNodes2.Create(2);
350 NodeContainer allNodes = NodeContainer(enbNodes, ueNodes1, ueNodes2);
351
352 // the topology is the following:
353 // d2
354 // UE1-----------eNB2
355 // | |
356 // d1| |d1
357 // | d2 |
358 // eNB1----------UE2
359 //
360 Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
361 positionAlloc->Add(Vector(0.0, 0.0, 0.0)); // eNB1
362 positionAlloc->Add(Vector(m_d2, m_d1, 0.0)); // eNB2
363
364 positionAlloc->Add(Vector(0.0, m_d1, 0.0)); // UE1-eNB1
365 positionAlloc->Add(Vector(0.5 * m_d2, 0.0, 0.0)); // UE2-eNB1
366
367 positionAlloc->Add(Vector(m_d2, 0.0, 0.0)); // UE1-eNB2
368 positionAlloc->Add(Vector(0.5 * m_d2, m_d1, 0.0)); // UE2-eNB2
369
371 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
372 mobility.SetPositionAllocator(positionAlloc);
373 mobility.Install(allNodes);
374
375 // Create Devices and install them in the Nodes (eNB and UE)
376 NetDeviceContainer enbDevs;
377 NetDeviceContainer ueDevs1;
378 NetDeviceContainer ueDevs2;
379 lteHelper->SetSchedulerType("ns3::PfFfMacScheduler");
380 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::PUSCH_UL_CQI));
381
382 lteHelper->SetFfrAlgorithmAttribute("DlCommonSubBandwidth", UintegerValue(12));
383 lteHelper->SetFfrAlgorithmAttribute("DlEdgeSubBandOffset", UintegerValue(0));
384 lteHelper->SetFfrAlgorithmAttribute("DlEdgeSubBandwidth", UintegerValue(6));
385 lteHelper->SetFfrAlgorithmAttribute("UlCommonSubBandwidth", UintegerValue(25));
386 lteHelper->SetFfrAlgorithmAttribute("UlEdgeSubBandOffset", UintegerValue(0));
387 lteHelper->SetFfrAlgorithmAttribute("UlEdgeSubBandwidth", UintegerValue(0));
388
389 enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(0)));
390
391 lteHelper->SetFfrAlgorithmAttribute("DlCommonSubBandwidth", UintegerValue(12));
392 lteHelper->SetFfrAlgorithmAttribute("DlEdgeSubBandOffset", UintegerValue(6));
393 lteHelper->SetFfrAlgorithmAttribute("DlEdgeSubBandwidth", UintegerValue(6));
394 enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(1)));
395
396 ueDevs1 = lteHelper->InstallUeDevice(ueNodes1);
397 ueDevs2 = lteHelper->InstallUeDevice(ueNodes2);
398
399 lteHelper->Attach(ueDevs1, enbDevs.Get(0));
400 lteHelper->Attach(ueDevs2, enbDevs.Get(1));
401
402 // Activate an EPS bearer
403 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
404 EpsBearer bearer(q);
405 lteHelper->ActivateDataRadioBearer(ueDevs1, bearer);
406 lteHelper->ActivateDataRadioBearer(ueDevs2, bearer);
407
408 // Use testing chunk processor in the PHY layer
409 // It will be used to test that the SNR is as intended
410 // we plug in two instances, one for DL and one for UL
411
412 Ptr<LtePhy> ue1Phy = ueDevs1.Get(0)->GetObject<LteUeNetDevice>()->GetPhy()->GetObject<LtePhy>();
413 Ptr<LteChunkProcessor> testDlSinr1 = Create<LteChunkProcessor>();
414 LteSpectrumValueCatcher dlSinr1Catcher;
415 testDlSinr1->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &dlSinr1Catcher));
416 ue1Phy->GetDownlinkSpectrumPhy()->AddDataSinrChunkProcessor(testDlSinr1);
417
418 Ptr<LtePhy> enb1phy =
419 enbDevs.Get(0)->GetObject<LteEnbNetDevice>()->GetPhy()->GetObject<LtePhy>();
420 Ptr<LteChunkProcessor> testUlSinr1 = Create<LteChunkProcessor>();
421 LteSpectrumValueCatcher ulSinr1Catcher;
422 testUlSinr1->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &ulSinr1Catcher));
423 enb1phy->GetUplinkSpectrumPhy()->AddDataSinrChunkProcessor(testUlSinr1);
424
425 // same as above for eNB2 and UE2
426
427 Ptr<LtePhy> ue2Phy = ueDevs2.Get(0)->GetObject<LteUeNetDevice>()->GetPhy()->GetObject<LtePhy>();
428 Ptr<LteChunkProcessor> testDlSinr2 = Create<LteChunkProcessor>();
429 LteSpectrumValueCatcher dlSinr2Catcher;
430 testDlSinr2->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &dlSinr2Catcher));
431 ue2Phy->GetDownlinkSpectrumPhy()->AddDataSinrChunkProcessor(testDlSinr2);
432
433 Ptr<LtePhy> enb2phy =
434 enbDevs.Get(1)->GetObject<LteEnbNetDevice>()->GetPhy()->GetObject<LtePhy>();
435 Ptr<LteChunkProcessor> testUlSinr2 = Create<LteChunkProcessor>();
436 LteSpectrumValueCatcher ulSinr2Catcher;
437 testUlSinr2->AddCallback(MakeCallback(&LteSpectrumValueCatcher::ReportValue, &ulSinr2Catcher));
438 enb1phy->GetUplinkSpectrumPhy()->AddDataSinrChunkProcessor(testUlSinr2);
439
440 // need to allow for UE Measurement report
441 Simulator::Stop(Seconds(2.000));
442 Simulator::Run();
443
444 for (uint32_t i = 0; i < 12; i++)
445 {
446 double dlSinr1 = dlSinr1Catcher.GetValue()->operator[](i);
447 double dlSinr1Db = 10.0 * std::log10(dlSinr1);
450 0.01,
451 "Wrong SINR in DL! (eNB1 --> UE1)");
452
453 double dlSinr2 = dlSinr2Catcher.GetValue()->operator[](i);
454 double dlSinr2Db = 10.0 * std::log10(dlSinr2);
457 0.01,
458 "Wrong SINR in DL! (eNB2 --> UE2)");
459 }
460
461 for (uint32_t i = 12; i < 18; i++)
462 {
463 double dlSinr1 = dlSinr1Catcher.GetValue()->operator[](i);
464 double dlSinr1Db = 10.0 * std::log10(dlSinr1);
467 0.01,
468 "Wrong SINR in DL! (eNB1 --> UE1)");
469
470 double dlSinr2 = dlSinr2Catcher.GetValue()->operator[](i);
471 NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr2, 0, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
472 }
473
474 for (uint32_t i = 18; i < 24; i++)
475 {
476 double dlSinr1 = dlSinr1Catcher.GetValue()->operator[](i);
477 NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr1, 0, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
478
479 double dlSinr2 = dlSinr2Catcher.GetValue()->operator[](i);
480 double dlSinr2Db = 10.0 * std::log10(dlSinr2);
483 0.01,
484 "Wrong SINR in DL! (eNB2 --> UE2)");
485 }
486
487 // FR algorithms do not operate in uplink now, so we do not test it
488 // double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetValue ()->operator[] (0));
489 // NS_LOG_DEBUG("ulSinr1Db: "<< ulSinr1Db);
490 // NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL! (UE1 -->
491 // eNB1)");
492 //
493 // double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetValue ()->operator[] (0));
494 // NS_LOG_DEBUG("ulSinr2Db: "<< ulSinr2Db);
495 // NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_expectedUlSinrDb, 0.01, "Wrong SINR in UL! (UE2 -->
496 // eNB2)");
497
498 Simulator::Destroy();
499}
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:258
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
Hold variables of type string.
Definition: string.h:42
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
#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:1338
static LteInterferenceFrTestSuite LteInterferenceFrTestSuite
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