A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
lte-test-harq.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
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: Marco Miozzo <marco.miozzo@cttc.es>
18 */
19
20#include "lte-test-harq.h"
21
22#include <ns3/boolean.h>
23#include <ns3/buildings-helper.h>
24#include <ns3/config.h>
25#include <ns3/double.h>
26#include <ns3/enum.h>
27#include <ns3/eps-bearer.h>
28#include <ns3/ff-mac-scheduler.h>
29#include <ns3/hybrid-buildings-propagation-loss-model.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-ue-net-device.h>
35#include <ns3/lte-ue-phy.h>
36#include <ns3/lte-ue-rrc.h>
37#include <ns3/mobility-building-info.h>
38#include <ns3/mobility-helper.h>
39#include <ns3/net-device-container.h>
40#include <ns3/node-container.h>
41#include <ns3/object.h>
42#include <ns3/packet.h>
43#include <ns3/ptr.h>
44#include <ns3/radio-bearer-stats-calculator.h>
45#include <ns3/simulator.h>
46#include <ns3/spectrum-error-model.h>
47#include <ns3/spectrum-interference.h>
48#include <ns3/string.h>
49#include <ns3/test.h>
50
51#include <cmath>
52#include <iostream>
53
54using namespace ns3;
55
56NS_LOG_COMPONENT_DEFINE("LenaTestHarq");
57
59 : TestSuite("lte-harq", Type::SYSTEM)
60{
61 NS_LOG_INFO("creating LenaTestHarqTestCase");
62
63 // Tests on DL/UL Data channels (PDSCH, PUSCH)
64 // MCS 0 TB size of 66 bytes SINR -9.91 dB expected throughput 31822 bytes/s
65 // TBLER 1st tx 1.0
66 // TBLER 2nd tx 0.074
67 AddTestCase(new LenaHarqTestCase(2, 2400, 66, 0.12, 31822), TestCase::Duration::QUICK);
68
69 // Tests on DL/UL Data channels (PDSCH, PUSCH)
70 // MCS 10 TB size of 472 bytes SINR 0.3 dB expected throughput 209964 bytes/s
71 // TBLER 1st tx 1.0
72 // TBLER 2nd tx 0.248
73 AddTestCase(new LenaHarqTestCase(1, 770, 472, 0.06, 209964), TestCase::Duration::QUICK);
74}
75
76/**
77 * \ingroup lte-test
78 * Static variable for test initialization
79 */
81
82std::string
83LenaHarqTestCase::BuildNameString(uint16_t nUser, uint16_t dist, uint16_t tbSize)
84{
85 std::ostringstream oss;
86 oss << nUser << " UEs, distance " << dist << " m, TB size " << tbSize;
87 return oss.str();
88}
89
91 uint16_t dist,
92 uint16_t tbSize,
93 double amcBer,
94 double thrRef)
95 : TestCase(BuildNameString(nUser, dist, tbSize)),
96 m_nUser(nUser),
97 m_dist(dist),
98 m_amcBer(amcBer),
99 m_throughputRef(thrRef)
100{
101}
102
104{
105}
106
107void
109{
110 Config::SetDefault("ns3::LteAmc::Ber", DoubleValue(m_amcBer));
111 Config::SetDefault("ns3::LteAmc::AmcModel", EnumValue(LteAmc::PiroEW2010));
112 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
113 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(true));
114 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
115 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
116 StringValue(CreateTempDirFilename("DlMacStats.txt")));
117 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
118 StringValue(CreateTempDirFilename("UlMacStats.txt")));
119 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
120 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
121 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
122 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
123
124 // Disable Uplink Power Control
125 Config::SetDefault("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue(false));
126
127 // Config::SetDefault ("ns3::RrFfMacScheduler::HarqEnabled", BooleanValue (false));
128 // LogComponentEnable ("LteEnbRrc", LOG_LEVEL_ALL);
129 // LogComponentEnable ("LteUeRrc", LOG_LEVEL_ALL);
130 // LogComponentEnable ("LteEnbMac", LOG_LEVEL_ALL);
131 // LogComponentEnable ("LteUeMac", LOG_LEVEL_ALL);
132 // LogComponentEnable ("LteRlc", LOG_LEVEL_ALL);
133 //
134 // LogComponentEnable ("LtePhy", LOG_LEVEL_ALL);
135 // LogComponentEnable ("LteEnbPhy", LOG_LEVEL_ALL);
136 // LogComponentEnable ("LteUePhy", LOG_LEVEL_ALL);
137
138 // LogComponentEnable ("LteSpectrumPhy", LOG_LEVEL_ALL);
139 // LogComponentEnable ("LteInterference", LOG_LEVEL_ALL);
140 // LogComponentEnable ("LteChunkProcessor", LOG_LEVEL_ALL);
141 //
142 // LogComponentEnable ("LtePropagationLossModel", LOG_LEVEL_ALL);
143 // LogComponentEnable ("LossModel", LOG_LEVEL_ALL);
144 // LogComponentEnable ("ShadowingLossModel", LOG_LEVEL_ALL);
145 // LogComponentEnable ("PenetrationLossModel", LOG_LEVEL_ALL);
146 // LogComponentEnable ("MultipathLossModel", LOG_LEVEL_ALL);
147 // LogComponentEnable ("PathLossModel", LOG_LEVEL_ALL);
148 //
149 // LogComponentEnable ("LteNetDevice", LOG_LEVEL_ALL);
150 // LogComponentEnable ("LteUeNetDevice", LOG_LEVEL_ALL);
151 // LogComponentEnable ("LteEnbNetDevice", LOG_LEVEL_ALL);
152
153 // LogComponentEnable ("RrFfMacScheduler", LOG_LEVEL_ALL);
154 // LogComponentEnable ("LenaHelper", LOG_LEVEL_ALL);
155 // LogComponentEnable ("RlcStatsCalculator", LOG_LEVEL_ALL);
156
157 // LogComponentEnable ("LteSpectrumPhy", LOG_LEVEL_ALL);
158 // LogComponentEnable ("LteEnbMac", LOG_LEVEL_ALL);
159 // LogComponentEnable ("LteEnbPhy", LOG_LEVEL_ALL);
160 // LogComponentEnable ("LteUePhy", LOG_LEVEL_ALL);
161 // LogComponentEnable ("RrFfMacScheduler", LOG_LEVEL_ALL);
162 // LogComponentEnable ("LenaHelper", LOG_LEVEL_ALL);
163 // LogComponentEnable ("BuildingsPropagationLossModel", LOG_LEVEL_ALL);
164 // LogComponentEnable ("LteMiErrorModel", LOG_LEVEL_ALL);
165 // LogComponentEnable ("LteAmc", LOG_LEVEL_ALL);
166 //
167 // LogComponentDisableAll (LOG_LEVEL_ALL);
168
169 // LogComponentEnable ("LenaTestHarq", LOG_LEVEL_ALL);
170
171 /**
172 * Initialize Simulation Scenario: 1 eNB and m_nUser UEs
173 */
174
175 Ptr<LteHelper> lena = CreateObject<LteHelper>();
176
177 // Create Nodes: eNodeB and UE
178 NodeContainer enbNodes;
179 NodeContainer ueNodes;
180 enbNodes.Create(1);
181 ueNodes.Create(m_nUser);
182
183 // Install Mobility Model
184 MobilityHelper mobility;
185 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
186 mobility.Install(enbNodes);
187 BuildingsHelper::Install(enbNodes);
188
189 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
190 mobility.Install(ueNodes);
192
193 // remove random shadowing component
194 lena->SetAttribute("PathlossModel", StringValue("ns3::HybridBuildingsPropagationLossModel"));
195 lena->SetPathlossModelAttribute("ShadowSigmaOutdoor", DoubleValue(0.0));
196 lena->SetPathlossModelAttribute("ShadowSigmaIndoor", DoubleValue(0.0));
197 lena->SetPathlossModelAttribute("ShadowSigmaExtWalls", DoubleValue(0.0));
198
199 // Create Devices and install them in the Nodes (eNB and UE)
200 NetDeviceContainer enbDevs;
201 NetDeviceContainer ueDevs;
202 lena->SetSchedulerType("ns3::RrFfMacScheduler");
203 lena->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::PUSCH_UL_CQI));
204
205 enbDevs = lena->InstallEnbDevice(enbNodes);
206 ueDevs = lena->InstallUeDevice(ueNodes);
207
208 // Attach a UE to a eNB
209 lena->Attach(ueDevs, enbDevs.Get(0));
210
211 // Activate an EPS bearer
213 EpsBearer bearer(q);
214 lena->ActivateDataRadioBearer(ueDevs, bearer);
215
216 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
217 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
218 enbPhy->SetAttribute("TxPower", DoubleValue(43.0));
219 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
220 // place the HeNB over the default rooftop level (20 mt.)
221 Ptr<MobilityModel> mm = enbNodes.Get(0)->GetObject<MobilityModel>();
222 mm->SetPosition(Vector(0.0, 0.0, 30.0));
223
224 // Set UEs' position and power
225 for (int i = 0; i < m_nUser; i++)
226 {
227 Ptr<MobilityModel> mm = ueNodes.Get(i)->GetObject<MobilityModel>();
228 mm->SetPosition(Vector(m_dist, 0.0, 1.0));
229 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
230 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
231 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
232 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
233 }
234
235 double statsStartTime = 0.050; // need to allow for RRC connection establishment + SRS
236 double statsDuration = 2.0;
237 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.0001));
238
239 lena->EnableRlcTraces();
240 Ptr<RadioBearerStatsCalculator> rlcStats = lena->GetRlcStats();
241 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
242 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
243
244 // for debugging purposes
245 lena->EnableMacTraces();
246
248
249 /**
250 * Check that the assignment is done in a RR fashion
251 */
252 NS_LOG_INFO("\tTest on downlink data shared channels (PDSCH)");
253 NS_LOG_INFO("Test with " << m_nUser << " user(s) at distance " << m_dist << " expected Thr "
254 << m_throughputRef);
255 for (int i = 0; i < m_nUser; i++)
256 {
257 // get the imsi
258 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
259 uint8_t lcId = 3;
260 double txed = rlcStats->GetDlTxData(imsi, lcId);
261 double rxed = rlcStats->GetDlRxData(imsi, lcId);
262 double tolerance = 0.1;
263
264 NS_LOG_INFO(" User " << i << " imsi " << imsi << " bytes rxed/t " << rxed / statsDuration
265 << " txed/t " << txed / statsDuration << " thr Ref " << m_throughputRef
266 << " Err "
267 << (std::abs(txed / statsDuration - m_throughputRef)) /
269
270 NS_TEST_ASSERT_MSG_EQ_TOL(txed / statsDuration,
272 m_throughputRef * tolerance,
273 " Unexpected Throughput!");
274 NS_TEST_ASSERT_MSG_EQ_TOL(rxed / statsDuration,
276 m_throughputRef * tolerance,
277 " Unexpected Throughput!");
278 }
279
281}
This system test program creates different test cases with a single eNB and several UEs,...
Definition: lte-test-harq.h:38
double m_throughputRef
throughput reference
Definition: lte-test-harq.h:66
void DoRun() override
Implementation to actually run this TestCase.
uint16_t m_dist
distance between nodes
Definition: lte-test-harq.h:64
uint16_t m_nUser
number of UE nodes
Definition: lte-test-harq.h:63
static std::string BuildNameString(uint16_t nUser, uint16_t dist, uint16_t tbSize)
Build name string function.
LenaHarqTestCase(uint16_t nUser, uint16_t dist, uint16_t tbSize, double amcBer, double thrRef)
Constructor.
~LenaHarqTestCase() override
double m_amcBer
AMC bit error rate.
Definition: lte-test-harq.h:65
Test suite for harq test.
Definition: lte-test-harq.h:76
AttributeValue implementation for Boolean.
Definition: boolean.h:37
static void Install(Ptr< Node > node)
Install the MobilityBuildingInfo to a node.
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
@ GBR_CONV_VOICE
GBR Conversational Voice.
Definition: eps-bearer.h:107
@ PiroEW2010
Definition: lte-amc.h:63
The eNodeB device implementation.
The LteUeNetDevice class implements the UE net device.
Helper class used to assign positions and mobility models to nodes.
Keep track of the current position and velocity of an object.
holds a vector of ns3::NetDevice pointers
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.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:522
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:142
static void Run()
Run the simulation.
Definition: simulator.cc:178
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:186
Hold variables of type string.
Definition: string.h:56
encapsulates test code
Definition: test.h:1061
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:438
A suite of tests to run.
Definition: test.h:1268
Type
Type of test.
Definition: test.h:1275
AttributeValue implementation for Time.
Definition: nstime.h:1413
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:894
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:275
static LenaTestHarqSuite lenaTestHarqSuite
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:338
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.