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 
53 using namespace ns3;
54 
55 NS_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 
219 
220 // --------------- T E S T - C A S E # 1 ------------------------------
221 
222 std::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 
248 void
250 {
251  NS_LOG_FUNCTION(this << m_nUser << m_dist);
252 
253  if (!m_errorModelEnabled)
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
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
300  EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
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 
332  Simulator::Run();
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,
358  m_thrRefDl,
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,
388  m_thrRefUl,
389  m_thrRefUl * tolerance,
390  " Unfair Throughput!");
391  }
392  Simulator::Destroy();
393 }
394 
395 // --------------- T E S T - C A S E # 2 ------------------------------
396 
397 std::string
398 LenaPfFfMacSchedulerTestCase2::BuildNameString(uint16_t nUser, std::vector<double> dist)
399 {
400  std::ostringstream oss;
401  oss << "distances (m) = [ ";
402  for (auto 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 
427 void
429 {
430  NS_LOG_FUNCTION(this);
431  if (!m_errorModelEnabled)
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
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
479  EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
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 
510  Simulator::Run();
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  }
565  Simulator::Destroy();
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.
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:62
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:1701
void SetSchedulerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the scheduler to be created.
Definition: lte-helper.cc:306
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:485
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:292
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:1039
void EnableRlcTraces()
Enable trace sinks for RLC layer.
Definition: lte-helper.cc:1558
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1436
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:500
void EnableMacTraces()
Enable trace sinks for MAC layer.
Definition: lte-helper.cc:1659
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:204
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
Hold variables of type string.
Definition: string.h:56
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: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
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:890
#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:1326
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mobility
Definition: third.py:105