A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
lte-test-harq.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: Marco Miozzo <marco.miozzo@cttc.es>
19  */
20 
21 #include <ns3/object.h>
22 #include <ns3/spectrum-interference.h>
23 #include <ns3/spectrum-error-model.h>
24 #include <ns3/log.h>
25 #include <ns3/test.h>
26 #include <ns3/simulator.h>
27 #include <ns3/packet.h>
28 #include <ns3/ptr.h>
29 #include <iostream>
30 #include <cmath>
31 #include <ns3/radio-bearer-stats-calculator.h>
32 #include <ns3/mobility-building-info.h>
33 #include <ns3/hybrid-buildings-propagation-loss-model.h>
34 #include <ns3/eps-bearer.h>
35 #include <ns3/node-container.h>
36 #include <ns3/mobility-helper.h>
37 #include <ns3/net-device-container.h>
38 #include <ns3/lte-ue-net-device.h>
39 #include <ns3/lte-enb-net-device.h>
40 #include <ns3/lte-ue-rrc.h>
41 #include <ns3/lte-helper.h>
42 #include <ns3/string.h>
43 #include <ns3/double.h>
44 #include <ns3/lte-enb-phy.h>
45 #include <ns3/lte-ue-phy.h>
46 #include <ns3/config.h>
47 #include <ns3/boolean.h>
48 #include <ns3/enum.h>
49 #include <ns3/unused.h>
50 #include <ns3/ff-mac-scheduler.h>
51 #include <ns3/buildings-helper.h>
52 
53 #include "lte-test-harq.h"
54 
55 NS_LOG_COMPONENT_DEFINE ("LenaTestHarq");
56 
57 namespace ns3 {
58 
59 
61  : TestSuite ("lte-harq", SYSTEM)
62 {
63  NS_LOG_INFO ("creating LenaTestHarqTestCase");
64 
65 
66  // Tests on DL/UL Data channels (PDSCH, PUSCH)
67  // MCS 0 TB size of 66 bytes SINR -9.91 dB expected throughput 31822 bytes/s
68  // TBLER 1st tx 1.0
69  // TBLER 2nd tx 0.074
70  AddTestCase (new LenaHarqTestCase (2, 2400, 66, 0.12, 31822), TestCase::QUICK);
71 
72  // Tests on DL/UL Data channels (PDSCH, PUSCH)
73  // MCS 10 TB size of 472 bytes SINR 0.3 dB expected throughput 209964 bytes/s
74  // TBLER 1st tx 1.0
75  // TBLER 2nd tx 0.248
76  AddTestCase (new LenaHarqTestCase (1, 770, 472, 0.06, 209964), TestCase::QUICK);
77 
78 
79 
80 }
81 
83 
84 std::string
85 LenaHarqTestCase::BuildNameString (uint16_t nUser, uint16_t dist, uint16_t tbSize)
86 {
87  std::ostringstream oss;
88  oss << nUser << " UEs, distance " << dist << " m, TB size " << tbSize;
89  return oss.str ();
90 }
91 
92 LenaHarqTestCase::LenaHarqTestCase (uint16_t nUser, uint16_t dist, uint16_t tbSize, double amcBer, double thrRef)
93  : TestCase (BuildNameString (nUser, dist, tbSize)),
94  m_nUser (nUser),
95  m_dist (dist),
96  m_amcBer (amcBer),
97  m_throughputRef (thrRef)
98 {
99 }
100 
102 {
103 }
104 
105 void
107 {
108 
109  Config::SetDefault ("ns3::LteAmc::Ber", DoubleValue (m_amcBer));
110  Config::SetDefault ("ns3::LteAmc::AmcModel", EnumValue (LteAmc::PiroEW2010));
111  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
112  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (true));
113  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
114 // Config::SetDefault ("ns3::RrFfMacScheduler::HarqEnabled", BooleanValue (false));
115 // LogComponentEnable ("LteEnbRrc", LOG_LEVEL_ALL);
116 // LogComponentEnable ("LteUeRrc", LOG_LEVEL_ALL);
117 // LogComponentEnable ("LteEnbMac", LOG_LEVEL_ALL);
118 // LogComponentEnable ("LteUeMac", LOG_LEVEL_ALL);
119 // LogComponentEnable ("LteRlc", LOG_LEVEL_ALL);
120 //
121 // LogComponentEnable ("LtePhy", LOG_LEVEL_ALL);
122 // LogComponentEnable ("LteEnbPhy", LOG_LEVEL_ALL);
123 // LogComponentEnable ("LteUePhy", LOG_LEVEL_ALL);
124 
125 // LogComponentEnable ("LteSpectrumPhy", LOG_LEVEL_ALL);
126 // LogComponentEnable ("LteInterference", LOG_LEVEL_ALL);
127 // LogComponentEnable ("LteSinrChunkProcessor", LOG_LEVEL_ALL);
128 //
129 // LogComponentEnable ("LtePropagationLossModel", LOG_LEVEL_ALL);
130 // LogComponentEnable ("LossModel", LOG_LEVEL_ALL);
131 // LogComponentEnable ("ShadowingLossModel", LOG_LEVEL_ALL);
132 // LogComponentEnable ("PenetrationLossModel", LOG_LEVEL_ALL);
133 // LogComponentEnable ("MultipathLossModel", LOG_LEVEL_ALL);
134 // LogComponentEnable ("PathLossModel", LOG_LEVEL_ALL);
135 //
136 // LogComponentEnable ("LteNetDevice", LOG_LEVEL_ALL);
137 // LogComponentEnable ("LteUeNetDevice", LOG_LEVEL_ALL);
138 // LogComponentEnable ("LteEnbNetDevice", LOG_LEVEL_ALL);
139 
140 // LogComponentEnable ("RrFfMacScheduler", LOG_LEVEL_ALL);
141 // LogComponentEnable ("LenaHelper", LOG_LEVEL_ALL);
142 // LogComponentEnable ("RlcStatsCalculator", LOG_LEVEL_ALL);
143 
144 
145 // LogComponentEnable ("LteSpectrumPhy", LOG_LEVEL_ALL);
146 // LogComponentEnable ("LteEnbMac", LOG_LEVEL_ALL);
147 // LogComponentEnable ("LteEnbPhy", LOG_LEVEL_ALL);
148 // LogComponentEnable ("LteUePhy", LOG_LEVEL_ALL);
149 // LogComponentEnable ("RrFfMacScheduler", LOG_LEVEL_ALL);
150 // LogComponentEnable ("LenaHelper", LOG_LEVEL_ALL);
151 // LogComponentEnable ("BuildingsPropagationLossModel", LOG_LEVEL_ALL);
152 // LogComponentEnable ("LteMiErrorModel", LOG_LEVEL_ALL);
153 // LogComponentEnable ("LteAmc", LOG_LEVEL_ALL);
154 //
155 // LogComponentDisableAll (LOG_LEVEL_ALL);
156 
157 // LogComponentEnable ("LenaTestHarq", LOG_LEVEL_ALL);
158 
159 
164  Ptr<LteHelper> lena = CreateObject<LteHelper> ();
165 
166  // Create Nodes: eNodeB and UE
167  NodeContainer enbNodes;
168  NodeContainer ueNodes;
169  enbNodes.Create (1);
170  ueNodes.Create (m_nUser);
171 
172  // Install Mobility Model
173  MobilityHelper mobility;
174  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
175  mobility.Install (enbNodes);
176  BuildingsHelper::Install (enbNodes);
177 
178  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
179  mobility.Install (ueNodes);
180  BuildingsHelper::Install (ueNodes);
181 
182  // remove random shadowing component
183  lena->SetAttribute ("PathlossModel", StringValue ("ns3::HybridBuildingsPropagationLossModel"));
184  lena->SetPathlossModelAttribute ("ShadowSigmaOutdoor", DoubleValue (0.0));
185  lena->SetPathlossModelAttribute ("ShadowSigmaIndoor", DoubleValue (0.0));
186  lena->SetPathlossModelAttribute ("ShadowSigmaExtWalls", DoubleValue (0.0));
187 
188  // Create Devices and install them in the Nodes (eNB and UE)
189  NetDeviceContainer enbDevs;
190  NetDeviceContainer ueDevs;
191  lena->SetSchedulerType ("ns3::RrFfMacScheduler");
192  lena->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::PUSCH_UL_CQI));
193 
194  enbDevs = lena->InstallEnbDevice (enbNodes);
195  ueDevs = lena->InstallUeDevice (ueNodes);
196 
197  // Attach a UE to a eNB
198  lena->Attach (ueDevs, enbDevs.Get (0));
199 
200  // Activate an EPS bearer
202  EpsBearer bearer (q);
203  lena->ActivateDataRadioBearer (ueDevs, bearer);
204 
205 
206  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
207  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
208  enbPhy->SetAttribute ("TxPower", DoubleValue (43.0));
209  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
210  // place the HeNB over the default rooftop level (20 mt.)
211  Ptr<MobilityModel> mm = enbNodes.Get (0)->GetObject<MobilityModel> ();
212  mm->SetPosition (Vector (0.0, 0.0, 30.0));
213 
214  // Set UEs' position and power
215  for (int i = 0; i < m_nUser; i++)
216  {
217  Ptr<MobilityModel> mm = ueNodes.Get (i)->GetObject<MobilityModel> ();
218  mm->SetPosition (Vector (m_dist, 0.0, 1.0));
219  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
220  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
221  uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
222  uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
223  }
224 
225 
226  double statsStartTime = 0.050; // need to allow for RRC connection establishment + SRS
227  double statsDuration = 2.0;
228  Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.0001));
229 
230  lena->EnableRlcTraces ();
231  Ptr<RadioBearerStatsCalculator> rlcStats = lena->GetRlcStats ();
232  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
233  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
234 
235  // for debugging purposes
236  lena->EnableMacTraces ();
237 
238  Simulator::Run ();
239 
243  NS_LOG_INFO ("\tTest on downlink data shared channels (PDSCH)");
244  NS_LOG_INFO ("Test with " << m_nUser << " user(s) at distance " << m_dist << " expected Thr " << m_throughputRef);
245  for (int i = 0; i < m_nUser; i++)
246  {
247  // get the imsi
248  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
249  uint8_t lcId = 3;
250  double txed = rlcStats->GetDlTxData (imsi, lcId);
251  double rxed = rlcStats->GetDlRxData (imsi, lcId);
252  double tolerance = 0.1;
253 
254  NS_LOG_INFO (" User " << i << " imsi " << imsi << " bytes rxed/t " << rxed/statsDuration << " txed/t " << txed/statsDuration << " thr Ref " << m_throughputRef << " Err " << (abs (txed/statsDuration - m_throughputRef)) / m_throughputRef);
255 
256  NS_TEST_ASSERT_MSG_EQ_TOL (txed/statsDuration, m_throughputRef, m_throughputRef * tolerance, " Unexpected Throughput!");
257  NS_TEST_ASSERT_MSG_EQ_TOL (rxed/statsDuration, m_throughputRef, m_throughputRef * tolerance, " Unexpected Throughput!");
258  }
259 
260 
262 }
263 
264 
265 } // namespace
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
Hold a bool native type.
Definition: boolean.h:38
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
This system test program creates different test cases with a single eNB and several UEs...
Definition: lte-test-harq.h:38
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
a 3d vector
Definition: vector.h:31
Keep track of the current position and velocity of an object.
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:71
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
hold objects of type ns3::Time
Definition: nstime.h:961
holds a vector of ns3::NetDevice pointers
static void Destroy(void)
Every event scheduled by the Simulator::insertAtDestroy method is invoked.
Definition: simulator.cc:121
LenaHarqTestCase(uint16_t nUser, uint16_t dist, uint16_t tbSize, double amcBer, double thrRef)
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 LenaTestHarqSuite lenaTestHarqSuite
virtual void DoRun(void)
Implementation to actually run this TestCase.
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
Definition: test.cc:173
void SetPosition(const Vector &position)
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
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
static std::string BuildNameString(uint16_t nUser, uint16_t dist, uint16_t tbSize)
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
NS_LOG_COMPONENT_DEFINE("LenaTestHarq")
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
static void Install(Ptr< Node > node)
Install the MobilityBuildingInfo to a node.
The LteUeNetDevice class implements the UE net device.