A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
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),
81 AddTestCase(new LenaPfFfMacSchedulerTestCase1(3, 0, 732000, 749000, errorModel),
83 AddTestCase(new LenaPfFfMacSchedulerTestCase1(6, 0, 366000, 373000, errorModel),
85 AddTestCase(new LenaPfFfMacSchedulerTestCase1(12, 0, 183000, 184670, errorModel),
87 AddTestCase(new LenaPfFfMacSchedulerTestCase1(15, 0, 146400, 147730, errorModel),
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),
105 AddTestCase(new LenaPfFfMacSchedulerTestCase1(3, 4800, 461000, 253000, errorModel),
107 AddTestCase(new LenaPfFfMacSchedulerTestCase1(6, 4800, 230500, 125000, errorModel),
109 AddTestCase(new LenaPfFfMacSchedulerTestCase1(12, 4800, 115250, 62000, errorModel),
111 AddTestCase(new LenaPfFfMacSchedulerTestCase1(15, 4800, 92200, 49600, errorModel),
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),
129 AddTestCase(new LenaPfFfMacSchedulerTestCase1(3, 6000, 397000, 201000, errorModel),
131 AddTestCase(new LenaPfFfMacSchedulerTestCase1(6, 6000, 198500, 97000, errorModel),
133 AddTestCase(new LenaPfFfMacSchedulerTestCase1(12, 6000, 99250, 48667, errorModel),
135 AddTestCase(new LenaPfFfMacSchedulerTestCase1(15, 6000, 79400, 38993, errorModel),
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),
153 AddTestCase(new LenaPfFfMacSchedulerTestCase1(3, 10000, 258333, 137000, errorModel),
155 AddTestCase(new LenaPfFfMacSchedulerTestCase1(6, 10000, 129167, 67000, errorModel),
157 AddTestCase(new LenaPfFfMacSchedulerTestCase1(12, 10000, 64583, 32667, errorModel),
159 AddTestCase(new LenaPfFfMacSchedulerTestCase1(15, 10000, 51667, 26133, errorModel),
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),
177 AddTestCase(new LenaPfFfMacSchedulerTestCase1(3, 20000, 140333, 41000, errorModel),
179 AddTestCase(new LenaPfFfMacSchedulerTestCase1(6, 20000, 70167, 22000, errorModel),
181 AddTestCase(new LenaPfFfMacSchedulerTestCase1(12, 20000, 35083, 12000, errorModel),
183 AddTestCase(new LenaPfFfMacSchedulerTestCase1(15, 20000, 28067, 9600, errorModel),
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),
212}
213
219
220// --------------- T E S T - C A S E # 1 ------------------------------
221
222std::string
224{
225 std::ostringstream oss;
226 oss << nUser << " UEs, distance " << dist << " m";
227 return oss.str();
228}
229
231 double dist,
232 double thrRefDl,
233 double thrRefUl,
234 bool errorModelEnabled)
235 : TestCase(BuildNameString(nUser, dist)),
236 m_nUser(nUser),
237 m_dist(dist),
238 m_thrRefDl(thrRefDl),
239 m_thrRefUl(thrRefUl),
240 m_errorModelEnabled(errorModelEnabled)
241{
242}
243
245{
246}
247
248void
250{
251 NS_LOG_FUNCTION(this << m_nUser << m_dist);
252
254 {
255 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
256 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
257 }
258 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
259 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
260 StringValue(CreateTempDirFilename("DlMacStats.txt")));
261 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
262 StringValue(CreateTempDirFilename("UlMacStats.txt")));
263 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
264 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
265 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
266 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
267
272 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
273 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
274
275 // Create Nodes: eNodeB and UE
276 NodeContainer enbNodes;
277 NodeContainer ueNodes;
278 enbNodes.Create(1);
279 ueNodes.Create(m_nUser);
280
281 // Install Mobility Model
282 MobilityHelper mobility;
283 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
284 mobility.Install(enbNodes);
285 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
286 mobility.Install(ueNodes);
287
288 // Create Devices and install them in the Nodes (eNB and UE)
289 NetDeviceContainer enbDevs;
290 NetDeviceContainer ueDevs;
291 lteHelper->SetSchedulerType("ns3::PfFfMacScheduler");
292 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
293 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
294 ueDevs = lteHelper->InstallUeDevice(ueNodes);
295
296 // Attach a UE to a eNB
297 lteHelper->Attach(ueDevs, enbDevs.Get(0));
298
299 // Activate an EPS bearer
301 EpsBearer bearer(q);
302 lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
303
304 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
305 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
306 enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
307 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
308
309 // Set UEs' position and power
310 for (int i = 0; i < m_nUser; i++)
311 {
314 mm->SetPosition(Vector(m_dist, 0.0, 0.0));
315 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
316 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
317 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
318 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
319 }
320
321 double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
322 double statsDuration = 0.6;
323 double tolerance = 0.1;
324 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.000001));
325
326 lteHelper->EnableMacTraces();
327 lteHelper->EnableRlcTraces();
328 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
329 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
330 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
331
333
337 NS_LOG_INFO("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
338 std::vector<uint64_t> dlDataRxed;
339 for (int i = 0; i < m_nUser; i++)
340 {
341 // get the imsi
342 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
343 uint8_t lcId = 3;
344 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
345 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at(i)
346 << " thr " << (double)dlDataRxed.at(i) / statsDuration << " ref "
347 << m_thrRefDl);
348 }
355 for (int i = 0; i < m_nUser; i++)
356 {
357 NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
359 m_thrRefDl * tolerance,
360 " Unfair Throughput!");
361 }
362
366 NS_LOG_INFO("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
367 std::vector<uint64_t> ulDataRxed;
368 for (int i = 0; i < m_nUser; i++)
369 {
370 // get the imsi
371 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
372 // get the lcId
373 uint8_t lcId = 3;
374 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
375 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)ulDataRxed.at(i)
376 << " thr " << (double)ulDataRxed.at(i) / statsDuration << " ref "
377 << m_thrRefUl);
378 }
385 for (int i = 0; i < m_nUser; i++)
386 {
387 NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
389 m_thrRefUl * tolerance,
390 " Unfair Throughput!");
391 }
393}
394
395// --------------- T E S T - C A S E # 2 ------------------------------
396
397std::string
398LenaPfFfMacSchedulerTestCase2::BuildNameString(uint16_t nUser, std::vector<double> dist)
399{
400 std::ostringstream oss;
401 oss << "distances (m) = [ ";
402 for (std::vector<double>::iterator it = dist.begin(); it != dist.end(); ++it)
403 {
404 oss << *it << " ";
405 }
406 oss << "]";
407 return oss.str();
408}
409
411 std::vector<uint32_t> estThrPfDl,
412 std::vector<uint32_t> estThrPfUl,
413 bool errorModelEnabled)
414 : TestCase(BuildNameString(dist.size(), dist)),
415 m_nUser(dist.size()),
416 m_dist(dist),
417 m_estThrPfDl(estThrPfDl),
418 m_estThrPfUl(estThrPfUl),
419 m_errorModelEnabled(errorModelEnabled)
420{
421}
422
424{
425}
426
427void
429{
430 NS_LOG_FUNCTION(this);
432 {
433 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
434 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
435 }
436 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(false));
437 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
438 StringValue(CreateTempDirFilename("DlMacStats.txt")));
439 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
440 StringValue(CreateTempDirFilename("UlMacStats.txt")));
441 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
442 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
443 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
444 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
445
450 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
451
452 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
453
454 // Create Nodes: eNodeB and UE
455 NodeContainer enbNodes;
456 NodeContainer ueNodes;
457 enbNodes.Create(1);
458 ueNodes.Create(m_nUser);
459
460 // Install Mobility Model
461 MobilityHelper mobility;
462 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
463 mobility.Install(enbNodes);
464 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
465 mobility.Install(ueNodes);
466
467 // Create Devices and install them in the Nodes (eNB and UE)
468 NetDeviceContainer enbDevs;
469 NetDeviceContainer ueDevs;
470 lteHelper->SetSchedulerType("ns3::PfFfMacScheduler");
471 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
472 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
473 ueDevs = lteHelper->InstallUeDevice(ueNodes);
474
475 // Attach a UE to a eNB
476 lteHelper->Attach(ueDevs, enbDevs.Get(0));
477
478 // Activate an EPS bearer
480 EpsBearer bearer(q);
481 lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
482
483 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
484 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
485 enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
486 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
487
488 // Set UEs' position and power
489 for (int i = 0; i < m_nUser; i++)
490 {
493 mm->SetPosition(Vector(m_dist.at(i), 0.0, 0.0));
494 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
495 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
496 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
497 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
498 }
499
500 double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
501 double statsDuration = 0.4;
502 double tolerance = 0.1;
503 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.000001));
504
505 lteHelper->EnableRlcTraces();
506 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
507 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
508 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
509
511
512 NS_LOG_INFO("DL - Test with " << m_nUser << " user(s)");
513 std::vector<uint64_t> dlDataRxed;
514 double totalData = 0;
515 double totalEstThrPf = 0;
516 for (int i = 0; i < m_nUser; i++)
517 {
518 // get the imsi
519 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
520 // get the lcId
521 uint8_t lcId = 3;
522 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
523 totalData += (double)dlDataRxed.at(i);
524 NS_LOG_INFO("\tUser " << i << " dist " << m_dist.at(i) << " imsi " << imsi << " bytes rxed "
525 << (double)dlDataRxed.at(i) << " thr "
526 << (double)dlDataRxed.at(i) / statsDuration);
527 totalEstThrPf += m_estThrPfDl.at(i);
528 }
529
535 for (int i = 0; i < m_nUser; i++)
536 {
537 double thrRatio = (double)dlDataRxed.at(i) / totalData;
538 double estThrRatio = (double)m_estThrPfDl.at(i) / totalEstThrPf;
539 NS_LOG_INFO("\tUser " << i << " thrRatio " << thrRatio << " estThrRatio " << estThrRatio);
540 NS_TEST_ASSERT_MSG_EQ_TOL(estThrRatio, thrRatio, tolerance, " Unfair Throughput!");
541 }
542
547 NS_LOG_INFO("UL - Test with " << m_nUser);
548 std::vector<uint64_t> ulDataRxed;
549 for (int i = 0; i < m_nUser; i++)
550 {
551 // get the imsi
552 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
553 // get the lcId
554 uint8_t lcId = 3;
555 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
556 NS_LOG_INFO("\tUser " << i << " dist " << m_dist.at(i) << " bytes rxed "
557 << (double)ulDataRxed.at(i) << " thr "
558 << (double)ulDataRxed.at(i) / statsDuration << " ref "
559 << (double)m_estThrPfUl.at(i));
560 NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
561 (double)m_estThrPfUl.at(i),
562 (double)m_estThrPfUl.at(i) * tolerance,
563 " Unfair Throughput!");
564 }
566}
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
@ GBR_CONV_VOICE
GBR Conversational Voice.
Definition: eps-bearer.h:107
The eNodeB device implementation.
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.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:140
static void Run()
Run the simulation.
Definition: simulator.cc:176
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:184
Hold variables of type string.
Definition: string.h:56
encapsulates test code
Definition: test.h:1060
@ EXTENSIVE
Medium length test.
Definition: test.h:1066
@ QUICK
Fast test.
Definition: test.h:1065
void AddTestCase(TestCase *testCase, TestDuration 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:1256
AttributeValue implementation for Time.
Definition: nstime.h:1423
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
static LenaTestPfFfMacSchedulerSuite lenaTestPfFfMacSchedulerSuite
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:1336
Every class exported by the ns3 library is enclosed in the ns3 namespace.