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:
19  * Manuel Requena <manuel.requena@cttc.es>
20  * Nicola Baldo <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 
45 using namespace ns3;
46 
47 NS_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 
59  AddTestCase(new LteInterferenceHardFrTestCase("d1=50, d2=20",
60  50.000000,
61  20.000000,
62  356449.932732,
63  10803.280215),
64  TestCase::QUICK);
65  AddTestCase(new LteInterferenceHardFrTestCase("d1=50, d2=50",
66  50.000000,
67  50.000000,
68  356449.932732,
69  10803.280215),
70  TestCase::QUICK);
71  AddTestCase(new LteInterferenceHardFrTestCase("d1=50, d2=200",
72  50.000000,
73  200.000000,
74  356449.932732,
75  10803.280215),
76  TestCase::QUICK);
77  AddTestCase(new LteInterferenceHardFrTestCase("d1=50, d2=500",
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);
102  AddTestCase(new LteInterferenceStrictFrTestCase("d1=50, d2=200",
103  50.000000,
104  200.000000,
105  15.999282,
106  15.976339,
107  356449.932732,
108  10803.280215,
109  30),
110  TestCase::QUICK);
111  AddTestCase(new LteInterferenceStrictFrTestCase("d1=50, d2=500",
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 
148 void
150 {
151  NS_LOG_INFO(this << GetName());
152  NS_LOG_DEBUG("LteInterferenceHardFrTestCase");
153 
154  Config::Reset();
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  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);
265  NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr1Db,
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);
281  NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr2Db,
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 
323 void
325 {
326  NS_LOG_INFO(this << GetName());
327  NS_LOG_DEBUG("LteInterferenceStrictFrTestCase");
328 
329  Config::Reset();
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  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);
452  NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr1Db,
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);
459  NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr2Db,
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);
469  NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr1Db,
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);
485  NS_TEST_ASSERT_MSG_EQ_TOL(dlSinr2Db,
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
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:62
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:319
void SetSchedulerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the scheduler to be created.
Definition: lte-helper.cc:306
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:485
void SetFfrAlgorithmAttribute(std::string n, const AttributeValue &v)
Set an attribute for the FFR algorithm to be created.
Definition: lte-helper.cc:327
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:292
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:1039
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1436
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:500
The LtePhy models the physical layer of LTE.
Definition: lte-phy.h:51
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:204
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:301
std::string GetName() const
Definition: test.cc:373
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:855
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:890
#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:1326
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:704
mobility
Definition: third.py:105