A Discrete-Event Network Simulator
API
lte-test-pf-ff-mac-scheduler.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011, 2012 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 * Nicola Baldo <nbaldo@cttc.es>
19 */
20
22
23#include "ns3/double.h"
24#include "ns3/radio-bearer-stats-calculator.h"
25#include "ns3/string.h"
26#include <ns3/boolean.h>
27#include <ns3/constant-position-mobility-model.h>
28#include <ns3/enum.h>
29#include <ns3/eps-bearer.h>
30#include <ns3/ff-mac-scheduler.h>
31#include <ns3/log.h>
32#include <ns3/lte-enb-net-device.h>
33#include <ns3/lte-enb-phy.h>
34#include <ns3/lte-helper.h>
35#include <ns3/lte-ue-net-device.h>
36#include <ns3/lte-ue-phy.h>
37#include <ns3/lte-ue-rrc.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/simulator.h>
45#include <ns3/spectrum-error-model.h>
46#include <ns3/spectrum-interference.h>
47#include <ns3/test.h>
48
49#include <iostream>
50#include <sstream>
51#include <string>
52
53using namespace ns3;
54
55NS_LOG_COMPONENT_DEFINE("LenaTestPfFfMacScheduler");
56
58 : TestSuite("lte-pf-ff-mac-scheduler", SYSTEM)
59{
60 NS_LOG_INFO("creating LenaTestPfFfMacSchedulerSuite");
61
62 bool errorModel = false;
63
64 // Test Case 1: AMC works in PF
65
66 // DOWNLINK - DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
67 // 1 user -> 24 PRB at Itbs 26 -> 2196 -> 2196000 bytes/sec
68 // 3 users -> 2196000 among 3 users -> 732000 bytes/sec
69 // 6 users -> 2196000 among 6 users -> 366000 bytes/sec
70 // 12 users -> 2196000 among 12 users -> 183000 bytes/sec
71 // 15 users -> 2196000 among 15 users -> 146400 bytes/sec
72 // UPLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
73 // 1 user -> 25 PRB at Itbs 26 -> 2292 -> 2292000 bytes/sec
74 // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
75 // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
76 // after the patch enforcing min 3 PRBs per UE:
77 // 12 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/12 UE/TTI -> 184670 bytes/sec
78 // 15 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/15 UE/TTI -> 147730 bytes/sec
79 AddTestCase(new LenaPfFfMacSchedulerTestCase1(1, 0, 2196000, 2292000, errorModel),
80 TestCase::EXTENSIVE);
81 AddTestCase(new LenaPfFfMacSchedulerTestCase1(3, 0, 732000, 749000, errorModel),
82 TestCase::EXTENSIVE);
83 AddTestCase(new LenaPfFfMacSchedulerTestCase1(6, 0, 366000, 373000, errorModel),
84 TestCase::EXTENSIVE);
85 AddTestCase(new LenaPfFfMacSchedulerTestCase1(12, 0, 183000, 184670, errorModel),
86 TestCase::EXTENSIVE);
87 AddTestCase(new LenaPfFfMacSchedulerTestCase1(15, 0, 146400, 147730, errorModel),
88 TestCase::EXTENSIVE);
89
90 // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
91 // 1 user -> 24 PRB at Itbs 15 -> 1383 -> 1383000 bytes/sec
92 // 3 users -> 1383000 among 3 users -> 461000 bytes/sec
93 // 6 users -> 1383000 among 6 users -> 230500 bytes/sec
94 // 12 users -> 1383000 among 12 users -> 115250 bytes/sec
95 // 15 users -> 1383000 among 15 users -> 92200 bytes/sec
96 // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
97 // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 bytes/sec
98 // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 bytes/sec
99 // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 bytes/sec
100 // after the patch enforcing min 3 PRBs per UE:
101 // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 bytes/sec
102 // 15 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/15 UE/TTI -> 49600 bytes/sec
103 AddTestCase(new LenaPfFfMacSchedulerTestCase1(1, 4800, 1383000, 807000, errorModel),
104 TestCase::EXTENSIVE);
105 AddTestCase(new LenaPfFfMacSchedulerTestCase1(3, 4800, 461000, 253000, errorModel),
106 TestCase::EXTENSIVE);
107 AddTestCase(new LenaPfFfMacSchedulerTestCase1(6, 4800, 230500, 125000, errorModel),
108 TestCase::EXTENSIVE);
109 AddTestCase(new LenaPfFfMacSchedulerTestCase1(12, 4800, 115250, 62000, errorModel),
110 TestCase::EXTENSIVE);
111 AddTestCase(new LenaPfFfMacSchedulerTestCase1(15, 4800, 92200, 49600, errorModel),
112 TestCase::EXTENSIVE);
113
114 // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
115 // 1 user -> 24 PRB at Itbs 20 -> 1191 -> 1191000 bytes/sec
116 // 3 users -> 1191000 among 3 users -> 397000 bytes/sec
117 // 6 users -> 1191000 among 6 users -> 198500 bytes/sec
118 // 12 users -> 1191000 among 12 users -> 99250 bytes/sec
119 // 15 users -> 1191000 among 15 users -> 79400 bytes/sec
120 // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
121 // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 bytes/sec
122 // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 bytes/sec
123 // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 bytes/sec
124 // after the patch enforcing min 3 PRBs per UE:
125 // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 bytes/sec
126 // 15 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/15 UE/TTI -> 38993 bytes/sec
127 AddTestCase(new LenaPfFfMacSchedulerTestCase1(1, 6000, 1191000, 621000, errorModel),
128 TestCase::EXTENSIVE);
129 AddTestCase(new LenaPfFfMacSchedulerTestCase1(3, 6000, 397000, 201000, errorModel),
130 TestCase::EXTENSIVE);
131 AddTestCase(new LenaPfFfMacSchedulerTestCase1(6, 6000, 198500, 97000, errorModel),
132 TestCase::EXTENSIVE);
133 AddTestCase(new LenaPfFfMacSchedulerTestCase1(12, 6000, 99250, 48667, errorModel),
134 TestCase::EXTENSIVE);
135 AddTestCase(new LenaPfFfMacSchedulerTestCase1(15, 6000, 79400, 38993, errorModel),
136 TestCase::EXTENSIVE);
137
138 // DOWNLINK - DISTANCE 10000 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
139 // 1 user -> 24 PRB at Itbs 13 -> 871 -> 775000 bytes/sec
140 // 3 users -> 775000 among 3 users -> 258333 bytes/sec
141 // 6 users -> 775000 among 6 users -> 129167 bytes/sec
142 // 12 users -> 775000 among 12 users -> 64583 bytes/sec
143 // 15 users -> 775000 among 15 users -> 51667 bytes/sec
144 // UPLINK - DISTANCE 10000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
145 // 1 user -> 24 PRB at Itbs 8 -> 437 -> 437000 bytes/sec
146 // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
147 // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
148 // after the patch enforcing min 3 PRBs per UE:
149 // 12 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/12 UE/TTI -> 32667 bytes/sec
150 // 15 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/15 UE/TTI -> 26133 bytes/sec
151 AddTestCase(new LenaPfFfMacSchedulerTestCase1(1, 10000, 775000, 437000, errorModel),
152 TestCase::EXTENSIVE);
153 AddTestCase(new LenaPfFfMacSchedulerTestCase1(3, 10000, 258333, 137000, errorModel),
154 TestCase::EXTENSIVE);
155 AddTestCase(new LenaPfFfMacSchedulerTestCase1(6, 10000, 129167, 67000, errorModel),
156 TestCase::EXTENSIVE);
157 AddTestCase(new LenaPfFfMacSchedulerTestCase1(12, 10000, 64583, 32667, errorModel),
158 TestCase::EXTENSIVE);
159 AddTestCase(new LenaPfFfMacSchedulerTestCase1(15, 10000, 51667, 26133, errorModel),
160 TestCase::EXTENSIVE);
161
162 // DONWLINK - DISTANCE 20000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
163 // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 bytes/sec
164 // 3 users -> 421000 among 3 users -> 140333 bytes/sec
165 // 6 users -> 421000 among 6 users -> 70167 bytes/sec
166 // 12 users -> 421000 among 12 users -> 35083 bytes/sec
167 // 15 users -> 421000 among 15 users -> 28067 bytes/sec
168 // UPLINK - DISTANCE 20000 -> MCS 2 -> Itbs 2 (from table 7.1.7.2.1-1 of 36.213)
169 // 1 user -> 25 PRB at Itbs 2 -> 233 -> 137000 bytes/sec
170 // 3 users -> 8 PRB at Itbs 2 -> 69 -> 41000 bytes/sec
171 // 6 users -> 4 PRB at Itbs 2 -> 32 -> 22000 bytes/sec
172 // after the patch enforcing min 3 PRBs per UE:
173 // 12 users -> 3 PRB at Itbs 2 -> 26 bytes * 8/12 UE/TTI -> 12000 bytes/sec
174 // 15 users -> 3 PRB at Itbs 2 -> 26 bytes * 8/15 UE/TTI -> 9600 bytes/sec
175 AddTestCase(new LenaPfFfMacSchedulerTestCase1(1, 20000, 421000, 137000, errorModel),
176 TestCase::EXTENSIVE);
177 AddTestCase(new LenaPfFfMacSchedulerTestCase1(3, 20000, 140333, 41000, errorModel),
178 TestCase::EXTENSIVE);
179 AddTestCase(new LenaPfFfMacSchedulerTestCase1(6, 20000, 70167, 22000, errorModel),
180 TestCase::EXTENSIVE);
181 AddTestCase(new LenaPfFfMacSchedulerTestCase1(12, 20000, 35083, 12000, errorModel),
182 TestCase::EXTENSIVE);
183 AddTestCase(new LenaPfFfMacSchedulerTestCase1(15, 20000, 28067, 9600, errorModel),
184 TestCase::EXTENSIVE);
185
186 // DOWNLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
187 // UPLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
188 AddTestCase(new LenaPfFfMacSchedulerTestCase1(1, 100000, 0, 0, errorModel), TestCase::QUICK);
189
190 // Test Case 2: fairness check
191
192 std::vector<double> dist;
193 dist.push_back(0); // User 0 distance --> MCS 28
194 dist.push_back(4800); // User 1 distance --> MCS 22
195 dist.push_back(6000); // User 2 distance --> MCS 16
196 dist.push_back(10000); // User 3 distance --> MCS 8
197 dist.push_back(20000); // User 4 distance --> MCS 8
198 std::vector<uint32_t> estThrPfDl;
199 estThrPfDl.push_back(90000); // User 0 estimated TTI throughput from PF
200 estThrPfDl.push_back(37000); // User 1 estimated TTI throughput from PF
201 estThrPfDl.push_back(37000); // User 2 estimated TTI throughput from PF
202 estThrPfDl.push_back(17400); // User 3 estimated TTI throughput from PF
203 estThrPfDl.push_back(17400); // User 4 estimated TTI throughput from PF
204 std::vector<uint32_t> estThrPfUl;
205 estThrPfUl.push_back(469000); // User 0 estimated TTI throughput from PF
206 estThrPfUl.push_back(157000); // User 1 estimated TTI throughput from PF
207 estThrPfUl.push_back(125000); // User 2 estimated TTI throughput from PF
208 estThrPfUl.push_back(85000); // User 3 estimated TTI throughput from PF
209 estThrPfUl.push_back(26000); // User 4 estimated TTI throughput from PF
210 AddTestCase(new LenaPfFfMacSchedulerTestCase2(dist, estThrPfDl, estThrPfUl, errorModel),
211 TestCase::QUICK);
212}
213
215
216// --------------- T E S T - C A S E # 1 ------------------------------
217
218std::string
220{
221 std::ostringstream oss;
222 oss << nUser << " UEs, distance " << dist << " m";
223 return oss.str();
224}
225
227 double dist,
228 double thrRefDl,
229 double thrRefUl,
230 bool errorModelEnabled)
231 : TestCase(BuildNameString(nUser, dist)),
232 m_nUser(nUser),
233 m_dist(dist),
234 m_thrRefDl(thrRefDl),
235 m_thrRefUl(thrRefUl),
236 m_errorModelEnabled(errorModelEnabled)
237{
238}
239
241{
242}
243
244void
246{
247 NS_LOG_FUNCTION(this << m_nUser << m_dist);
248
250 {
251 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
252 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
253 }
254 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
255 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
256 StringValue(CreateTempDirFilename("DlMacStats.txt")));
257 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
258 StringValue(CreateTempDirFilename("UlMacStats.txt")));
259 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
260 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
261 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
262 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
263
268 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
269 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
270
271 // Create Nodes: eNodeB and UE
272 NodeContainer enbNodes;
273 NodeContainer ueNodes;
274 enbNodes.Create(1);
275 ueNodes.Create(m_nUser);
276
277 // Install Mobility Model
279 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
280 mobility.Install(enbNodes);
281 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
282 mobility.Install(ueNodes);
283
284 // Create Devices and install them in the Nodes (eNB and UE)
285 NetDeviceContainer enbDevs;
286 NetDeviceContainer ueDevs;
287 lteHelper->SetSchedulerType("ns3::PfFfMacScheduler");
288 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
289 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
290 ueDevs = lteHelper->InstallUeDevice(ueNodes);
291
292 // Attach a UE to a eNB
293 lteHelper->Attach(ueDevs, enbDevs.Get(0));
294
295 // Activate an EPS bearer
296 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
297 EpsBearer bearer(q);
298 lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
299
300 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
301 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
302 enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
303 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
304
305 // Set UEs' position and power
306 for (int i = 0; i < m_nUser; i++)
307 {
310 mm->SetPosition(Vector(m_dist, 0.0, 0.0));
311 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
312 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
313 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
314 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
315 }
316
317 double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
318 double statsDuration = 0.6;
319 double tolerance = 0.1;
320 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.000001));
321
322 lteHelper->EnableMacTraces();
323 lteHelper->EnableRlcTraces();
324 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
325 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
326 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
327
328 Simulator::Run();
329
333 NS_LOG_INFO("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
334 std::vector<uint64_t> dlDataRxed;
335 for (int i = 0; i < m_nUser; i++)
336 {
337 // get the imsi
338 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
339 uint8_t lcId = 3;
340 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
341 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at(i)
342 << " thr " << (double)dlDataRxed.at(i) / statsDuration << " ref "
343 << m_thrRefDl);
344 }
351 for (int i = 0; i < m_nUser; i++)
352 {
353 NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
355 m_thrRefDl * tolerance,
356 " Unfair Throughput!");
357 }
358
362 NS_LOG_INFO("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
363 std::vector<uint64_t> ulDataRxed;
364 for (int i = 0; i < m_nUser; i++)
365 {
366 // get the imsi
367 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
368 // get the lcId
369 uint8_t lcId = 3;
370 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
371 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)ulDataRxed.at(i)
372 << " thr " << (double)ulDataRxed.at(i) / statsDuration << " ref "
373 << m_thrRefUl);
374 }
381 for (int i = 0; i < m_nUser; i++)
382 {
383 NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
385 m_thrRefUl * tolerance,
386 " Unfair Throughput!");
387 }
388 Simulator::Destroy();
389}
390
391// --------------- T E S T - C A S E # 2 ------------------------------
392
393std::string
394LenaPfFfMacSchedulerTestCase2::BuildNameString(uint16_t nUser, std::vector<double> dist)
395{
396 std::ostringstream oss;
397 oss << "distances (m) = [ ";
398 for (std::vector<double>::iterator it = dist.begin(); it != dist.end(); ++it)
399 {
400 oss << *it << " ";
401 }
402 oss << "]";
403 return oss.str();
404}
405
407 std::vector<uint32_t> estThrPfDl,
408 std::vector<uint32_t> estThrPfUl,
409 bool errorModelEnabled)
410 : TestCase(BuildNameString(dist.size(), dist)),
411 m_nUser(dist.size()),
412 m_dist(dist),
413 m_estThrPfDl(estThrPfDl),
414 m_estThrPfUl(estThrPfUl),
415 m_errorModelEnabled(errorModelEnabled)
416{
417}
418
420{
421}
422
423void
425{
426 NS_LOG_FUNCTION(this);
428 {
429 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
430 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
431 }
432 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(false));
433 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
434 StringValue(CreateTempDirFilename("DlMacStats.txt")));
435 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
436 StringValue(CreateTempDirFilename("UlMacStats.txt")));
437 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
438 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
439 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
440 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
441
446 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
447
448 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
449
450 // Create Nodes: eNodeB and UE
451 NodeContainer enbNodes;
452 NodeContainer ueNodes;
453 enbNodes.Create(1);
454 ueNodes.Create(m_nUser);
455
456 // Install Mobility Model
458 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
459 mobility.Install(enbNodes);
460 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
461 mobility.Install(ueNodes);
462
463 // Create Devices and install them in the Nodes (eNB and UE)
464 NetDeviceContainer enbDevs;
465 NetDeviceContainer ueDevs;
466 lteHelper->SetSchedulerType("ns3::PfFfMacScheduler");
467 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
468 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
469 ueDevs = lteHelper->InstallUeDevice(ueNodes);
470
471 // Attach a UE to a eNB
472 lteHelper->Attach(ueDevs, enbDevs.Get(0));
473
474 // Activate an EPS bearer
475 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
476 EpsBearer bearer(q);
477 lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
478
479 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
480 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
481 enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
482 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
483
484 // Set UEs' position and power
485 for (int i = 0; i < m_nUser; i++)
486 {
489 mm->SetPosition(Vector(m_dist.at(i), 0.0, 0.0));
490 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
491 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
492 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
493 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
494 }
495
496 double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
497 double statsDuration = 0.4;
498 double tolerance = 0.1;
499 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.000001));
500
501 lteHelper->EnableRlcTraces();
502 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
503 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
504 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
505
506 Simulator::Run();
507
508 NS_LOG_INFO("DL - Test with " << m_nUser << " user(s)");
509 std::vector<uint64_t> dlDataRxed;
510 double totalData = 0;
511 double totalEstThrPf = 0;
512 for (int i = 0; i < m_nUser; i++)
513 {
514 // get the imsi
515 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
516 // get the lcId
517 uint8_t lcId = 3;
518 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
519 totalData += (double)dlDataRxed.at(i);
520 NS_LOG_INFO("\tUser " << i << " dist " << m_dist.at(i) << " imsi " << imsi << " bytes rxed "
521 << (double)dlDataRxed.at(i) << " thr "
522 << (double)dlDataRxed.at(i) / statsDuration);
523 totalEstThrPf += m_estThrPfDl.at(i);
524 }
525
531 for (int i = 0; i < m_nUser; i++)
532 {
533 double thrRatio = (double)dlDataRxed.at(i) / totalData;
534 double estThrRatio = (double)m_estThrPfDl.at(i) / totalEstThrPf;
535 NS_LOG_INFO("\tUser " << i << " thrRatio " << thrRatio << " estThrRatio " << estThrRatio);
536 NS_TEST_ASSERT_MSG_EQ_TOL(estThrRatio, thrRatio, tolerance, " Unfair Throughput!");
537 }
538
543 NS_LOG_INFO("UL - Test with " << m_nUser);
544 std::vector<uint64_t> ulDataRxed;
545 for (int i = 0; i < m_nUser; i++)
546 {
547 // get the imsi
548 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
549 // get the lcId
550 uint8_t lcId = 3;
551 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
552 NS_LOG_INFO("\tUser " << i << " dist " << m_dist.at(i) << " bytes rxed "
553 << (double)ulDataRxed.at(i) << " thr "
554 << (double)ulDataRxed.at(i) / statsDuration << " ref "
555 << (double)m_estThrPfUl.at(i));
556 NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
557 (double)m_estThrPfUl.at(i),
558 (double)m_estThrPfUl.at(i) * tolerance,
559 " Unfair Throughput!");
560 }
561 Simulator::Destroy();
562}
This system test program creates different test cases with a single eNB and several UEs,...
static std::string BuildNameString(uint16_t nUser, double dist)
Build name string.
bool m_errorModelEnabled
whether error model is enabled
void DoRun() override
Implementation to actually run this TestCase.
double m_thrRefUl
the UL throughput reference
double m_thrRefDl
the DL throughput reference
LenaPfFfMacSchedulerTestCase1(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
Constructor.
double m_dist
the distance between nodes
Lena PfFf Mac Scheduler Test Case 2.
LenaPfFfMacSchedulerTestCase2(std::vector< double > dist, std::vector< uint32_t > estThrPfDl, std::vector< uint32_t > estThrPfUl, bool errorModelEnabled)
Constructor.
std::vector< uint32_t > m_estThrPfUl
the estimated UL throughput
bool m_errorModelEnabled
indicates whether the error model is enabled
std::vector< uint32_t > m_estThrPfDl
the estimated DL throughput
std::vector< double > m_dist
the distance between nodes
static std::string BuildNameString(uint16_t nUser, std::vector< double > dist)
Builds the test name string based on provided parameter values.
void DoRun() override
Implementation to actually run this TestCase.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Mobility model for which the current position does not change once it has been set and until it is se...
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.
Ptr< LteEnbPhy > GetPhy() const
Ptr< RadioBearerStatsCalculator > GetRlcStats()
Definition: lte-helper.cc:1708
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 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 EnableRlcTraces()
Enable trace sinks for RLC layer.
Definition: lte-helper.cc:1563
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
void EnableMacTraces()
Enable trace sinks for MAC layer.
Definition: lte-helper.cc:1666
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
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 CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:442
A suite of tests to run.
Definition: test.h:1256
AttributeValue implementation for Time.
Definition: nstime.h:1425
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_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#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 LenaTestPfFfMacSchedulerSuite lenaTestPfFfMacSchedulerSuite
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mobility
Definition: third.py:96