A Discrete-Event Network Simulator
API
lte-test-pf-ff-mac-scheduler.cc
Go to the documentation of this file.
1/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2011, 2012 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 * Nicola Baldo <nbaldo@cttc.es>
20 */
21
22#include <iostream>
23#include <sstream>
24#include <string>
25
26#include <ns3/object.h>
27#include <ns3/spectrum-interference.h>
28#include <ns3/spectrum-error-model.h>
29#include <ns3/log.h>
30#include <ns3/test.h>
31#include <ns3/simulator.h>
32#include <ns3/packet.h>
33#include <ns3/ptr.h>
34#include "ns3/radio-bearer-stats-calculator.h"
35#include <ns3/constant-position-mobility-model.h>
36#include <ns3/ff-mac-scheduler.h>
37#include <ns3/eps-bearer.h>
38#include <ns3/node-container.h>
39#include <ns3/mobility-helper.h>
40#include <ns3/net-device-container.h>
41#include <ns3/lte-ue-net-device.h>
42#include <ns3/lte-enb-net-device.h>
43#include <ns3/lte-ue-rrc.h>
44#include <ns3/lte-helper.h>
45#include "ns3/string.h"
46#include "ns3/double.h"
47#include <ns3/lte-enb-phy.h>
48#include <ns3/lte-ue-phy.h>
49#include <ns3/boolean.h>
50#include <ns3/enum.h>
51
53
54using namespace ns3;
55
56NS_LOG_COMPONENT_DEFINE ("LenaTestPfFfMacScheduler");
57
59 : TestSuite ("lte-pf-ff-mac-scheduler", SYSTEM)
60{
61 NS_LOG_INFO ("creating LenaTestPfFfMacSchedulerSuite");
62
63 bool errorModel = false;
64
65
66 //Test Case 1: AMC works in PF
67
68 // DOWNLINK - DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
69 // 1 user -> 24 PRB at Itbs 26 -> 2196 -> 2196000 bytes/sec
70 // 3 users -> 2196000 among 3 users -> 732000 bytes/sec
71 // 6 users -> 2196000 among 6 users -> 366000 bytes/sec
72 // 12 users -> 2196000 among 12 users -> 183000 bytes/sec
73 // 15 users -> 2196000 among 15 users -> 146400 bytes/sec
74 // UPLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
75 // 1 user -> 25 PRB at Itbs 26 -> 2292 -> 2292000 bytes/sec
76 // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
77 // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
78 // after the patch enforcing min 3 PRBs per UE:
79 // 12 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/12 UE/TTI -> 184670 bytes/sec
80 // 15 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/15 UE/TTI -> 147730 bytes/sec
81 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (1,0,2196000,2292000,errorModel), TestCase::EXTENSIVE);
82 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (3,0,732000,749000,errorModel), TestCase::EXTENSIVE);
83 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (6,0,366000,373000,errorModel), TestCase::EXTENSIVE);
84 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,183000,184670,errorModel), TestCase::EXTENSIVE);
85 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,146400,147730,errorModel), TestCase::EXTENSIVE);
86
87
88 // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
89 // 1 user -> 24 PRB at Itbs 15 -> 1383 -> 1383000 bytes/sec
90 // 3 users -> 1383000 among 3 users -> 461000 bytes/sec
91 // 6 users -> 1383000 among 6 users -> 230500 bytes/sec
92 // 12 users -> 1383000 among 12 users -> 115250 bytes/sec
93 // 15 users -> 1383000 among 15 users -> 92200 bytes/sec
94 // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
95 // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 bytes/sec
96 // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 bytes/sec
97 // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 bytes/sec
98 // after the patch enforcing min 3 PRBs per UE:
99 // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 bytes/sec
100 // 15 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/15 UE/TTI -> 49600 bytes/sec
101 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (1,4800,1383000,807000,errorModel), TestCase::EXTENSIVE);
102 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (3,4800,461000,253000,errorModel), TestCase::EXTENSIVE);
103 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (6,4800,230500,125000,errorModel), TestCase::EXTENSIVE);
104 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,4800,115250,62000,errorModel), TestCase::EXTENSIVE);
105 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,4800,92200,49600,errorModel), TestCase::EXTENSIVE);
106
107 // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
108 // 1 user -> 24 PRB at Itbs 20 -> 1191 -> 1191000 bytes/sec
109 // 3 users -> 1191000 among 3 users -> 397000 bytes/sec
110 // 6 users -> 1191000 among 6 users -> 198500 bytes/sec
111 // 12 users -> 1191000 among 12 users -> 99250 bytes/sec
112 // 15 users -> 1191000 among 15 users -> 79400 bytes/sec
113 // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
114 // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 bytes/sec
115 // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 bytes/sec
116 // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 bytes/sec
117 // after the patch enforcing min 3 PRBs per UE:
118 // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 bytes/sec
119 // 15 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/15 UE/TTI -> 38993 bytes/sec
120 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (1,6000,1191000,621000,errorModel), TestCase::EXTENSIVE);
121 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (3,6000,397000,201000,errorModel), TestCase::EXTENSIVE);
122 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (6,6000,198500,97000,errorModel), TestCase::EXTENSIVE);
123 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,6000,99250,48667,errorModel), TestCase::EXTENSIVE);
124 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,6000,79400,38993,errorModel), TestCase::EXTENSIVE);
125
126 // DOWNLINK - DISTANCE 10000 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
127 // 1 user -> 24 PRB at Itbs 13 -> 871 -> 775000 bytes/sec
128 // 3 users -> 775000 among 3 users -> 258333 bytes/sec
129 // 6 users -> 775000 among 6 users -> 129167 bytes/sec
130 // 12 users -> 775000 among 12 users -> 64583 bytes/sec
131 // 15 users -> 775000 among 15 users -> 51667 bytes/sec
132 // UPLINK - DISTANCE 10000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
133 // 1 user -> 24 PRB at Itbs 8 -> 437 -> 437000 bytes/sec
134 // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
135 // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
136 // after the patch enforcing min 3 PRBs per UE:
137 // 12 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/12 UE/TTI -> 32667 bytes/sec
138 // 15 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/15 UE/TTI -> 26133 bytes/sec
139 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (1,10000,775000,437000,errorModel), TestCase::EXTENSIVE);
140 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (3,10000,258333,137000,errorModel), TestCase::EXTENSIVE);
141 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (6,10000,129167,67000,errorModel), TestCase::EXTENSIVE);
142 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,10000,64583,32667,errorModel), TestCase::EXTENSIVE);
143 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,10000,51667,26133,errorModel), TestCase::EXTENSIVE);
144
145 // DONWLINK - DISTANCE 20000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
146 // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 bytes/sec
147 // 3 users -> 421000 among 3 users -> 140333 bytes/sec
148 // 6 users -> 421000 among 6 users -> 70167 bytes/sec
149 // 12 users -> 421000 among 12 users -> 35083 bytes/sec
150 // 15 users -> 421000 among 15 users -> 28067 bytes/sec
151 // UPLINK - DISTANCE 20000 -> MCS 2 -> Itbs 2 (from table 7.1.7.2.1-1 of 36.213)
152 // 1 user -> 25 PRB at Itbs 2 -> 233 -> 137000 bytes/sec
153 // 3 users -> 8 PRB at Itbs 2 -> 69 -> 41000 bytes/sec
154 // 6 users -> 4 PRB at Itbs 2 -> 32 -> 22000 bytes/sec
155 // after the patch enforcing min 3 PRBs per UE:
156 // 12 users -> 3 PRB at Itbs 2 -> 26 bytes * 8/12 UE/TTI -> 12000 bytes/sec
157 // 15 users -> 3 PRB at Itbs 2 -> 26 bytes * 8/15 UE/TTI -> 9600 bytes/sec
158 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (1,20000,421000,137000,errorModel), TestCase::EXTENSIVE);
159 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (3,20000,140333,41000,errorModel), TestCase::EXTENSIVE);
160 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (6,20000,70167,22000,errorModel), TestCase::EXTENSIVE);
161 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,20000,35083,12000,errorModel), TestCase::EXTENSIVE);
162 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,20000,28067,9600,errorModel), TestCase::EXTENSIVE);
163
164 // DOWNLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
165 // UPLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
166 AddTestCase (new LenaPfFfMacSchedulerTestCase1 (1,100000,0,0,errorModel), TestCase::QUICK);
167
168
169 // Test Case 2: fairness check
170
171 std::vector<double> dist;
172 dist.push_back (0); // User 0 distance --> MCS 28
173 dist.push_back (4800); // User 1 distance --> MCS 22
174 dist.push_back (6000); // User 2 distance --> MCS 16
175 dist.push_back (10000); // User 3 distance --> MCS 8
176 dist.push_back (20000); // User 4 distance --> MCS 8
177 std::vector<uint32_t> estThrPfDl;
178 estThrPfDl.push_back (90000); // User 0 estimated TTI throughput from PF
179 estThrPfDl.push_back (37000); // User 1 estimated TTI throughput from PF
180 estThrPfDl.push_back (37000); // User 2 estimated TTI throughput from PF
181 estThrPfDl.push_back (17400); // User 3 estimated TTI throughput from PF
182 estThrPfDl.push_back (17400); // User 4 estimated TTI throughput from PF
183 std::vector<uint32_t> estThrPfUl;
184 estThrPfUl.push_back (469000); // User 0 estimated TTI throughput from PF
185 estThrPfUl.push_back (157000); // User 1 estimated TTI throughput from PF
186 estThrPfUl.push_back (125000); // User 2 estimated TTI throughput from PF
187 estThrPfUl.push_back (85000); // User 3 estimated TTI throughput from PF
188 estThrPfUl.push_back (26000); // User 4 estimated TTI throughput from PF
189 AddTestCase (new LenaPfFfMacSchedulerTestCase2 (dist, estThrPfDl, estThrPfUl,errorModel), TestCase::QUICK);
190
191
192}
193
195
196
197// --------------- T E S T - C A S E # 1 ------------------------------
198
199
200std::string
202{
203 std::ostringstream oss;
204 oss << nUser << " UEs, distance " << dist << " m";
205 return oss.str ();
206}
207
208LenaPfFfMacSchedulerTestCase1::LenaPfFfMacSchedulerTestCase1 (uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
209 : TestCase (BuildNameString (nUser, dist)),
210 m_nUser (nUser),
211 m_dist (dist),
212 m_thrRefDl (thrRefDl),
213 m_thrRefUl (thrRefUl),
214 m_errorModelEnabled (errorModelEnabled)
215{
216}
217
219{
220}
221
222void
224{
225 NS_LOG_FUNCTION (this << m_nUser << m_dist);
226
228 {
229 Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
230 Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
231 }
232 Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
233 Config::SetDefault ("ns3::MacStatsCalculator::DlOutputFilename", StringValue (CreateTempDirFilename ("DlMacStats.txt")));
234 Config::SetDefault ("ns3::MacStatsCalculator::UlOutputFilename", StringValue (CreateTempDirFilename ("UlMacStats.txt")));
235 Config::SetDefault ("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename", StringValue (CreateTempDirFilename ("DlRlcStats.txt")));
236 Config::SetDefault ("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename", StringValue (CreateTempDirFilename ("UlRlcStats.txt")));
237
243 Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
244 lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
245
246 // Create Nodes: eNodeB and UE
247 NodeContainer enbNodes;
248 NodeContainer ueNodes;
249 enbNodes.Create (1);
250 ueNodes.Create (m_nUser);
251
252 // Install Mobility Model
254 mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
255 mobility.Install (enbNodes);
256 mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
257 mobility.Install (ueNodes);
258
259 // Create Devices and install them in the Nodes (eNB and UE)
260 NetDeviceContainer enbDevs;
261 NetDeviceContainer ueDevs;
262 lteHelper->SetSchedulerType ("ns3::PfFfMacScheduler");
263 lteHelper->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::SRS_UL_CQI));
264 enbDevs = lteHelper->InstallEnbDevice (enbNodes);
265 ueDevs = lteHelper->InstallUeDevice (ueNodes);
266
267 // Attach a UE to a eNB
268 lteHelper->Attach (ueDevs, enbDevs.Get (0));
269
270 // Activate an EPS bearer
271 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
272 EpsBearer bearer (q);
273 lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
274
275
276 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
277 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
278 enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
279 enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
280
281 // Set UEs' position and power
282 for (int i = 0; i < m_nUser; i++)
283 {
285 mm->SetPosition (Vector (m_dist, 0.0, 0.0));
286 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
287 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
288 uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
289 uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
290 }
291
292
293 double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
294 double statsDuration = 0.6;
295 double tolerance = 0.1;
296 Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.000001));
297
298 lteHelper->EnableMacTraces ();
299 lteHelper->EnableRlcTraces ();
300 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
301 rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
302 rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
303
304
305 Simulator::Run ();
306
310 NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
311 std::vector <uint64_t> dlDataRxed;
312 for (int i = 0; i < m_nUser; i++)
313 {
314 // get the imsi
315 uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
316 uint8_t lcId = 3;
317 dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
318 NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at (i) << " thr " << (double)dlDataRxed.at (i) / statsDuration << " ref " << m_thrRefDl);
319 }
326 for (int i = 0; i < m_nUser; i++)
327 {
328 NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataRxed.at (i) / statsDuration, m_thrRefDl, m_thrRefDl * tolerance, " Unfair Throughput!");
329 }
330
334 NS_LOG_INFO ("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
335 std::vector <uint64_t> ulDataRxed;
336 for (int i = 0; i < m_nUser; i++)
337 {
338 // get the imsi
339 uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
340 // get the lcId
341 uint8_t lcId = 3;
342 ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
343 NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)ulDataRxed.at (i) << " thr " << (double)ulDataRxed.at (i) / statsDuration << " ref " << m_thrRefUl);
344 }
351 for (int i = 0; i < m_nUser; i++)
352 {
353 NS_TEST_ASSERT_MSG_EQ_TOL ((double)ulDataRxed.at (i) / statsDuration, m_thrRefUl, m_thrRefUl * tolerance, " Unfair Throughput!");
354 }
355 Simulator::Destroy ();
356
357}
358
359
360
361// --------------- T E S T - C A S E # 2 ------------------------------
362
363
364std::string
365LenaPfFfMacSchedulerTestCase2::BuildNameString (uint16_t nUser, std::vector<double> dist)
366{
367 std::ostringstream oss;
368 oss << "distances (m) = [ " ;
369 for (std::vector<double>::iterator it = dist.begin (); it != dist.end (); ++it)
370 {
371 oss << *it << " ";
372 }
373 oss << "]";
374 return oss.str ();
375}
376
377
378LenaPfFfMacSchedulerTestCase2::LenaPfFfMacSchedulerTestCase2 (std::vector<double> dist, std::vector<uint32_t> estThrPfDl, std::vector<uint32_t> estThrPfUl, bool errorModelEnabled)
379 : TestCase (BuildNameString (dist.size (), dist)),
380 m_nUser (dist.size ()),
381 m_dist (dist),
382 m_estThrPfDl (estThrPfDl),
383 m_estThrPfUl (estThrPfUl),
384 m_errorModelEnabled (errorModelEnabled)
385{
386}
387
389{
390}
391
392void
394{
395 NS_LOG_FUNCTION (this);
397 {
398 Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
399 Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
400 }
401 Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (false));
402 Config::SetDefault ("ns3::MacStatsCalculator::DlOutputFilename", StringValue (CreateTempDirFilename ("DlMacStats.txt")));
403 Config::SetDefault ("ns3::MacStatsCalculator::UlOutputFilename", StringValue (CreateTempDirFilename ("UlMacStats.txt")));
404 Config::SetDefault ("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename", StringValue (CreateTempDirFilename ("DlRlcStats.txt")));
405 Config::SetDefault ("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename", StringValue (CreateTempDirFilename ("UlRlcStats.txt")));
406
411 Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
412
413 lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
414
415 // Create Nodes: eNodeB and UE
416 NodeContainer enbNodes;
417 NodeContainer ueNodes;
418 enbNodes.Create (1);
419 ueNodes.Create (m_nUser);
420
421 // Install Mobility Model
423 mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
424 mobility.Install (enbNodes);
425 mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
426 mobility.Install (ueNodes);
427
428 // Create Devices and install them in the Nodes (eNB and UE)
429 NetDeviceContainer enbDevs;
430 NetDeviceContainer ueDevs;
431 lteHelper->SetSchedulerType ("ns3::PfFfMacScheduler");
432 lteHelper->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::SRS_UL_CQI));
433 enbDevs = lteHelper->InstallEnbDevice (enbNodes);
434 ueDevs = lteHelper->InstallUeDevice (ueNodes);
435
436 // Attach a UE to a eNB
437 lteHelper->Attach (ueDevs, enbDevs.Get (0));
438
439 // Activate an EPS bearer
440 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
441 EpsBearer bearer (q);
442 lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
443
444 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
445 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
446 enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
447 enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
448
449 // Set UEs' position and power
450 for (int i = 0; i < m_nUser; i++)
451 {
453 mm->SetPosition (Vector (m_dist.at (i), 0.0, 0.0));
454 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
455 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
456 uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
457 uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
458 }
459
460 double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
461 double statsDuration = 0.4;
462 double tolerance = 0.1;
463 Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.000001));
464
465 lteHelper->EnableRlcTraces ();
466 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
467 rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
468 rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
469
470
471 Simulator::Run ();
472
473 NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s)");
474 std::vector <uint64_t> dlDataRxed;
475 double totalData = 0;
476 double totalEstThrPf = 0;
477 for (int i = 0; i < m_nUser; i++)
478 {
479 // get the imsi
480 uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
481 // get the lcId
482 uint8_t lcId = 3;
483 dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
484 totalData += (double)dlDataRxed.at (i);
485 NS_LOG_INFO ("\tUser " << i << " dist " << m_dist.at (i) << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at (i) << " thr " << (double)dlDataRxed.at (i) / statsDuration);
486 totalEstThrPf += m_estThrPfDl.at (i);
487 }
488
494 for (int i = 0; i < m_nUser; i++)
495 {
496 double thrRatio = (double)dlDataRxed.at (i) / totalData;
497 double estThrRatio = (double)m_estThrPfDl.at (i) / totalEstThrPf;
498 NS_LOG_INFO ("\tUser " << i << " thrRatio " << thrRatio << " estThrRatio " << estThrRatio);
499 NS_TEST_ASSERT_MSG_EQ_TOL (estThrRatio, thrRatio, tolerance, " Unfair Throughput!");
500 }
501
506 NS_LOG_INFO ("UL - Test with " << m_nUser);
507 std::vector <uint64_t> ulDataRxed;
508 for (int i = 0; i < m_nUser; i++)
509 {
510 // get the imsi
511 uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
512 // get the lcId
513 uint8_t lcId = 3;
514 ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
515 NS_LOG_INFO ("\tUser " << i << " dist " << m_dist.at (i) << " bytes rxed " << (double)ulDataRxed.at (i) << " thr " << (double)ulDataRxed.at (i) / statsDuration << " ref " << (double)m_estThrPfUl.at (i));
516 NS_TEST_ASSERT_MSG_EQ_TOL ((double)ulDataRxed.at (i) / statsDuration, (double)m_estThrPfUl.at (i), (double)m_estThrPfUl.at (i) * tolerance, " Unfair Throughput!");
517 }
518 Simulator::Destroy ();
519
520}
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
virtual void DoRun(void)
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
virtual void DoRun(void)
Implementation to actually run this TestCase.
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.
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:41
Hold variables of type enum.
Definition: enum.h:55
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:92
Qci
QoS Class Indicator.
Definition: eps-bearer.h:107
The eNodeB device implementation.
Ptr< LteEnbPhy > GetPhy(void) const
void SetSchedulerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the scheduler to be created.
Definition: lte-helper.cc:293
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:474
Ptr< RadioBearerStatsCalculator > GetRlcStats(void)
Definition: lte-helper.cc:1572
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:279
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:959
void EnableRlcTraces(void)
Enable trace sinks for RLC layer.
Definition: lte-helper.cc:1435
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1313
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:489
void EnableMacTraces(void)
Enable trace sinks for MAC layer.
Definition: lte-helper.cc:1529
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:256
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
Hold variables of type string.
Definition: string.h:41
encapsulates test code
Definition: test.h:994
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:430
A suite of tests to run.
Definition: test.h:1188
AttributeValue implementation for Time.
Definition: nstime.h:1308
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:849
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#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:281
#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:323
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
static LenaTestPfFfMacSchedulerSuite lenaTestPfFfMacSchedulerSuite
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mobility
Definition: third.py:107