A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
lte-test-interference.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Manuel Requena <manuel.requena@cttc.es>
19  * Nicola Baldo <nbaldo@cttc.es>
20  */
21 
22 #include "ns3/simulator.h"
23 #include "ns3/log.h"
24 #include "ns3/string.h"
25 #include "ns3/double.h"
26 #include <ns3/enum.h>
27 #include "ns3/boolean.h"
28 #include "ns3/mobility-helper.h"
29 #include "ns3/lte-helper.h"
30 #include "ns3/ff-mac-scheduler.h"
31 
32 #include "ns3/lte-enb-phy.h"
33 #include "ns3/lte-enb-net-device.h"
34 
35 #include "ns3/lte-ue-phy.h"
36 #include "ns3/lte-ue-net-device.h"
37 
38 #include "lte-test-interference.h"
39 
41 
42 NS_LOG_COMPONENT_DEFINE ("LteInterferenceTest");
43 
44 namespace ns3 {
45 
46 
47 void
49  uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
50  uint8_t mcsTb1, uint16_t sizeTb1, uint8_t mcsTb2, uint16_t sizeTb2)
51 {
52  testcase->DlScheduling (frameNo, subframeNo, rnti, mcsTb1, sizeTb1, mcsTb2, sizeTb2);
53 }
54 
55 void
57  uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
58  uint8_t mcs, uint16_t sizeTb)
59 {
60  testcase->UlScheduling (frameNo, subframeNo, rnti, mcs, sizeTb);
61 }
62 
63 
69  : TestSuite ("lte-interference", SYSTEM)
70 {
71  AddTestCase (new LteInterferenceTestCase ("d1=3000, d2=6000", 3000.000000, 6000.000000, 3.844681, 1.714583, 0.761558, 0.389662, 6, 4), TestCase::QUICK);
72  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=10", 50.000000, 10.000000, 0.040000, 0.040000, 0.010399, 0.010399, 0, 0), TestCase::QUICK);
73  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=20", 50.000000, 20.000000, 0.160000, 0.159998, 0.041154, 0.041153, 0, 0), TestCase::QUICK);
74  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=50", 50.000000, 50.000000, 0.999997, 0.999907, 0.239828, 0.239808, 2, 2), TestCase::QUICK);
75  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=100", 50.000000, 100.000000, 3.999955, 3.998520, 0.785259, 0.785042, 6, 6), TestCase::QUICK);
76  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=200", 50.000000, 200.000000, 15.999282, 15.976339, 1.961072, 1.959533, 14, 14), TestCase::QUICK);
77  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=500", 50.000000, 500.000000, 99.971953, 99.082845, 4.254003, 4.241793, 22, 22), TestCase::QUICK);
78  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=1000", 50.000000, 1000.000000, 399.551632, 385.718468, 6.194952, 6.144825, 28, 28), TestCase::QUICK);
79  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=10000", 50.000000, 10000.000000, 35964.181431, 8505.970614, 12.667381, 10.588084, 28, 28), TestCase::QUICK);
80  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=100000", 50.000000, 100000.000000, 327284.773828, 10774.181090, 15.853097, 10.928917, 28, 28), TestCase::QUICK);
81  AddTestCase (new LteInterferenceTestCase ("d1=50, d2=1000000", 50.000000, 1000000.000000, 356132.574152, 10802.988445, 15.974963, 10.932767, 28, 28), TestCase::QUICK);
82  AddTestCase (new LteInterferenceTestCase ("d1=4500, d2=12600", 4500.000000, 12600.000000, 6.654462, 1.139831, 1.139781, 0.270399, 8, 2), TestCase::QUICK);
83  AddTestCase (new LteInterferenceTestCase ("d1=5400, d2=12600", 5400.000000, 12600.000000, 4.621154, 0.791549, 0.876368, 0.193019, 6, 0), TestCase::QUICK);
84 
85 
86 }
87 
89 
90 
95 LteInterferenceTestCase::LteInterferenceTestCase (std::string name, double d1, double d2, double dlSinr, double ulSinr, double dlSe, double ulSe, uint16_t dlMcs, uint16_t ulMcs)
96  : TestCase (name),
97  m_d1 (d1),
98  m_d2 (d2),
99  m_dlSinrDb (10 * std::log10 (dlSinr)),
100  m_ulSinrDb (10 * std::log10 (ulSinr)),
101  m_dlMcs (dlMcs),
102  m_ulMcs (ulMcs)
103 {
104 }
105 
107 {
108 }
109 
110 void
112 {
113  NS_LOG_INFO (this << GetName ());
114 
115  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
116  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
117  Config::SetDefault ("ns3::LteAmc::AmcModel", EnumValue (LteAmc::PiroEW2010));
118  Config::SetDefault ("ns3::LteAmc::Ber", DoubleValue (0.00005));
119  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
120  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
121  lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (false));
122 
123  // Create Nodes: eNodeB and UE
124  NodeContainer enbNodes;
125  NodeContainer ueNodes1;
126  NodeContainer ueNodes2;
127  enbNodes.Create (2);
128  ueNodes1.Create (1);
129  ueNodes2.Create (1);
130  NodeContainer allNodes = NodeContainer ( enbNodes, ueNodes1, ueNodes2);
131 
132  // the topology is the following:
133  // d2
134  // UE1-----------eNB2
135  // | |
136  // d1| |d1
137  // | d2 |
138  // eNB1----------UE2
139  //
140  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
141  positionAlloc->Add (Vector (0.0, 0.0, 0.0)); // eNB1
142  positionAlloc->Add (Vector (m_d2, m_d1, 0.0)); // eNB2
143  positionAlloc->Add (Vector (0.0, m_d1, 0.0)); // UE1
144  positionAlloc->Add (Vector (m_d2, 0.0, 0.0)); // UE2
145  MobilityHelper mobility;
146  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
147  mobility.SetPositionAllocator (positionAlloc);
148  mobility.Install (allNodes);
149 
150  // Create Devices and install them in the Nodes (eNB and UE)
151  NetDeviceContainer enbDevs;
152  NetDeviceContainer ueDevs1;
153  NetDeviceContainer ueDevs2;
154  lteHelper->SetSchedulerType ("ns3::RrFfMacScheduler");
155  lteHelper->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::PUSCH_UL_CQI));
156  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
157  ueDevs1 = lteHelper->InstallUeDevice (ueNodes1);
158  ueDevs2 = lteHelper->InstallUeDevice (ueNodes2);
159 
160  lteHelper->Attach (ueDevs1, enbDevs.Get (0));
161  lteHelper->Attach (ueDevs2, enbDevs.Get (1));
162 
163  // Activate an EPS bearer
165  EpsBearer bearer (q);
166  lteHelper->ActivateDataRadioBearer (ueDevs1, bearer);
167  lteHelper->ActivateDataRadioBearer (ueDevs2, bearer);
168 
169  // Use testing chunk processor in the PHY layer
170  // It will be used to test that the SNR is as intended
171  // we plug in two instances, one for DL and one for UL
172 
173  Ptr<LtePhy> ue1Phy = ueDevs1.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
174  Ptr<LteTestSinrChunkProcessor> testDlSinr1 = Create<LteTestSinrChunkProcessor> (ue1Phy);
175  ue1Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr1);
176 
177  Ptr<LtePhy> enb1phy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
178  Ptr<LteTestSinrChunkProcessor> testUlSinr1 = Create<LteTestSinrChunkProcessor> (enb1phy);
179  enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr1);
180 
181  Config::Connect ("/NodeList/0/DeviceList/0/LteEnbMac/DlScheduling",
183 
184  Config::Connect ("/NodeList/0/DeviceList/0/LteEnbMac/UlScheduling",
186 
187 
188  // same as above for eNB2 and UE2
189 
190  Ptr<LtePhy> ue2Phy = ueDevs2.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
191  Ptr<LteTestSinrChunkProcessor> testDlSinr2 = Create<LteTestSinrChunkProcessor> (ue2Phy);
192  ue2Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr2);
193 
194  Ptr<LtePhy> enb2phy = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetPhy ()->GetObject<LtePhy> ();
195  Ptr<LteTestSinrChunkProcessor> testUlSinr2 = Create<LteTestSinrChunkProcessor> (enb2phy);
196  enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr2);
197 
198  Config::Connect ("/NodeList/1/DeviceList/0/LteEnbMac/DlScheduling",
200 
201  Config::Connect ("/NodeList/1/DeviceList/0/LteEnbMac/UlScheduling",
203 
204 // need to allow for RRC connection establishment + SRS
205  Simulator::Stop (Seconds (0.100));
206  Simulator::Run ();
207 
208  if (m_dlMcs > 0)
209  {
210  double dlSinr1Db = 10.0 * std::log10 (testDlSinr1->GetSinr ()->operator[] (0));
211  NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_dlSinrDb, 0.01, "Wrong SINR in DL! (eNB1 --> UE1)");
212 
213  double dlSinr2Db = 10.0 * std::log10 (testDlSinr2->GetSinr ()->operator[] (0));
214  NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_dlSinrDb, 0.01, "Wrong SINR in DL! (eNB2 --> UE2)");
215  }
216  if (m_ulMcs > 0)
217  {
218  double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetSinr ()->operator[] (0));
219  NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_ulSinrDb, 0.01, "Wrong SINR in UL! (UE1 --> eNB1)");
220 
221  double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetSinr ()->operator[] (0));
222  NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_ulSinrDb, 0.01, "Wrong SINR in UL! (UE2 --> eNB2)");
223  }
224 
226 
227 }
228 
229 
230 void
231 LteInterferenceTestCase::DlScheduling (uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
232  uint8_t mcsTb1, uint16_t sizeTb1, uint8_t mcsTb2, uint16_t sizeTb2)
233 {
234  // need to allow for RRC connection establishment + CQI feedback reception
235  if (Simulator::Now () > MilliSeconds (35))
236  {
237  NS_TEST_ASSERT_MSG_EQ ((uint32_t)mcsTb1, (uint32_t)m_dlMcs, "Wrong DL MCS ");
238  }
239 }
240 
241 void
242 LteInterferenceTestCase::UlScheduling (uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
243  uint8_t mcs, uint16_t sizeTb)
244 {
245  // need to allow for RRC connection establishment + SRS transmission
246  if (Simulator::Now () > MilliSeconds (50))
247  {
248  NS_TEST_ASSERT_MSG_EQ ((uint32_t)mcs, (uint32_t)m_ulMcs, "Wrong UL MCS");
249  }
250 }
251 
252 } // namespace ns3
253 
void LteTestUlSchedulingCallback(LteInterferenceTestCase *testcase, std::string path, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t sizeTb)
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
Hold a bool native type.
Definition: boolean.h:38
void LteTestDlSchedulingCallback(LteInterferenceTestCase *testcase, std::string path, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcsTb1, uint16_t sizeTb1, uint8_t mcsTb2, uint16_t sizeTb2)
hold variables of type string
Definition: string.h:19
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
#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:326
A suite of tests to run.
Definition: test.h:1025
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Build bound Callbacks which take varying numbers of arguments, and potentially returning a value...
Definition: callback.h:1463
static LteInterferenceTestSuite lteLinkAdaptationWithInterferenceTestSuite
void DlScheduling(uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcsTb1, uint16_t sizeTb1, uint8_t mcsTb2, uint16_t sizeTb2)
virtual void DoRun(void)
Implementation to actually run this TestCase.
static void Run(void)
Run the simulation until one of:
Definition: simulator.cc:157
#define NS_LOG_INFO(msg)
Definition: log.h:298
encapsulates test code
Definition: test.h:849
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:728
a 3d vector
Definition: vector.h:31
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:71
LteInterferenceTestCase(std::string name, double d1, double d2, double dlSinr, double ulSinr, double dlSe, double ulSe, uint16_t dlMcs, uint16_t ulMcs)
TestCase.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
hold variables of type 'enum'
Definition: enum.h:37
holds a vector of ns3::NetDevice pointers
Test that SINR calculation and MCS selection works fine in a multi-cell interference scenario...
NS_LOG_COMPONENT_DEFINE("LteInterferenceTest")
static void Destroy(void)
Every event scheduled by the Simulator::insertAtDestroy method is invoked.
Definition: simulator.cc:121
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:667
keep track of a set of node pointers.
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
static Time Now(void)
Return the "current simulation time".
Definition: simulator.cc:180
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
Definition: test.cc:173
void UlScheduling(uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t sizeTb)
Fast test.
Definition: test.h:857
Helper class used to assign positions and mobility models to nodes.
static void Stop(void)
If an event invokes this method, it will be the last event scheduled by the Simulator::run method bef...
Definition: simulator.cc:165
std::string GetName(void) const
Definition: test.cc:242
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
Hold a floating point type.
Definition: double.h:41
The eNodeB device implementation.
Ptr< T > GetObject(void) const
Definition: object.h:361
Qci
QoS Class Indicator.
Definition: eps-bearer.h:77
The LtePhy models the physical layer of LTE.
Definition: lte-phy.h:52
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:137
The LteUeNetDevice class implements the UE net device.