A Discrete-Event Network Simulator
API
lte-test-fdbet-ff-mac-scheduler.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Marco Miozzo <marco.miozzo@cttc.es>,
18  * Nicola Baldo <nbaldo@cttc.es>
19  * Dizhi Zhou <dizhi.zhou@gmail.com>
20  */
21 
23 
24 #include "ns3/double.h"
25 #include "ns3/radio-bearer-stats-calculator.h"
26 #include "ns3/string.h"
27 #include <ns3/boolean.h>
28 #include <ns3/constant-position-mobility-model.h>
29 #include <ns3/enum.h>
30 #include <ns3/eps-bearer.h>
31 #include <ns3/ff-mac-scheduler.h>
32 #include <ns3/log.h>
33 #include <ns3/lte-enb-net-device.h>
34 #include <ns3/lte-enb-phy.h>
35 #include <ns3/lte-helper.h>
36 #include <ns3/lte-ue-net-device.h>
37 #include <ns3/lte-ue-phy.h>
38 #include <ns3/lte-ue-rrc.h>
39 #include <ns3/mobility-helper.h>
40 #include <ns3/net-device-container.h>
41 #include <ns3/node-container.h>
42 #include <ns3/object.h>
43 #include <ns3/packet.h>
44 #include <ns3/ptr.h>
45 #include <ns3/simulator.h>
46 #include <ns3/spectrum-error-model.h>
47 #include <ns3/spectrum-interference.h>
48 #include <ns3/test.h>
49 
50 #include <iostream>
51 #include <sstream>
52 #include <string>
53 
54 using namespace ns3;
55 
56 NS_LOG_COMPONENT_DEFINE("LenaTestFdBetFfMacScheduler");
57 
59  : TestSuite("lte-fdbet-ff-mac-scheduler", SYSTEM)
60 {
61  NS_LOG_INFO("creating LenaTestFdBetFfMacSchedulerSuite");
62 
63  bool errorModel = false;
64 
65  // Test Case 1: AMC works in FDBET
66 
67  // Note: here the MCS is calculated by the wideband CQI
68 
69  // DOWNLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
70  // 1 user -> 24 PRB at Itbs 26 -> 2196 -> 2196000 bytes/sec
71  // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
72  // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
73  // 12 users -> 2 PRB at Itbs 26 -> 185 -> 185000 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  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(1, 0, 2196000, 2292000, errorModel),
81  TestCase::EXTENSIVE);
82  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(3, 0, 749000, 749000, errorModel),
83  TestCase::EXTENSIVE);
84  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(6, 0, 373000, 373000, errorModel),
85  TestCase::EXTENSIVE);
86  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(12, 0, 185000, 184670, errorModel),
87  TestCase::EXTENSIVE);
88 
89  // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
90  // 1 user -> 24 PRB at Itbs 20 -> 1383 -> 1383000 bytes/sec
91  // 3 users -> 8 PRB at Itbs 20 -> 469 -> 469000 bytes/sec
92  // 6 users -> 4 PRB at Itbs 20 -> 233 -> 233000 bytes/sec
93  // 12 users -> 2 PRB at Itbs 20 -> 113 -> 113000 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  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(1, 4800, 1383000, 807000, errorModel),
101  TestCase::EXTENSIVE);
102  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(3, 4800, 469000, 253000, errorModel),
103  TestCase::EXTENSIVE);
104  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(6, 4800, 233500, 125000, errorModel),
105  TestCase::EXTENSIVE);
106  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(12, 4800, 113000, 62000, errorModel),
107  TestCase::EXTENSIVE);
108 
109  // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
110  // 1 user -> 24 PRB at Itbs 18 -> 1191 -> 1191000 byte/sec
111  // 3 users -> 8 PRB at Itbs 18 -> 389 -> 389000 bytes/sec
112  // 6 users -> 4 PRB at Itbs 18 -> 193 -> 193000 bytes/sec
113  // 12 users -> 2 PRB at Itbs 18 -> 97 -> 97000 bytes/sec
114  // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
115  // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 bytes/sec
116  // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 bytes/sec
117  // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 bytes/sec
118  // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 bytes/sec
119  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(1, 6000, 1191000, 621000, errorModel),
120  TestCase::EXTENSIVE);
121  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(3, 6000, 389000, 201000, errorModel),
122  TestCase::EXTENSIVE);
123  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(6, 6000, 193000, 97000, errorModel),
124  TestCase::EXTENSIVE);
125  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(12, 6000, 97000, 48667, errorModel),
126  TestCase::EXTENSIVE);
127 
128  // DOWNLINK - DISTANCE 10000 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
129  // 1 user -> 24 PRB at Itbs 13 -> 775 -> 775000 byte/sec
130  // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 bytes/sec
131  // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 bytes/sec
132  // 12 users -> 2 PRB at Itbs 13 -> 61 -> 61000 bytes/sec
133  // UPLINK - DISTANCE 9000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
134  // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 bytes/sec
135  // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
136  // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
137  // after the patch enforcing min 3 PRBs per UE:
138  // 12 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/12 UE/TTI -> 32667 bytes/sec
139  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(1, 10000, 775000, 421000, errorModel),
140  TestCase::EXTENSIVE);
141  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(3, 10000, 253000, 137000, errorModel),
142  TestCase::EXTENSIVE);
143  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(6, 10000, 125000, 67000, errorModel),
144  TestCase::EXTENSIVE);
145  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(12, 10000, 61000, 32667, errorModel),
146  TestCase::EXTENSIVE);
147 
148  // DOWNLINK - DISTANCE 20000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
149  // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 bytes/sec
150  // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
151  // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
152  // 12 users -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
153  // UPLINK - DISTANCE 20000 -> MCS 2 -> Itbs 2 (from table 7.1.7.2.1-1 of 36.213)
154  // 1 user -> 25 PRB at Itbs 2 -> 137 -> 137000 bytes/sec
155  // 3 users -> 8 PRB at Itbs 2 -> 41 -> 41000 bytes/sec
156  // 6 users -> 4 PRB at Itbs 2 -> 22 -> 22000 bytes/sec
157  // after the patch enforcing min 3 PRBs per UE:
158  // 12 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/12 UE/TTI -> 12000 bytes/sec
159  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(1, 20000, 421000, 137000, errorModel),
160  TestCase::EXTENSIVE);
161  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(3, 20000, 137000, 41000, errorModel),
162  TestCase::EXTENSIVE);
163  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(6, 20000, 67000, 22000, errorModel),
164  TestCase::EXTENSIVE);
165  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(12, 20000, 32000, 12000, errorModel),
166  TestCase::EXTENSIVE);
167 
168  // DOWNLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
169  // UPLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
170  AddTestCase(new LenaFdBetFfMacSchedulerTestCase1(1, 100000, 0, 0, errorModel), TestCase::QUICK);
171 
172  // Test Case 2: fairness check
173 
174  std::vector<double> dist;
175  dist.push_back(0); // User 0 distance --> MCS 28
176  dist.push_back(4800); // User 1 distance --> MCS 22
177  dist.push_back(6000); // User 2 distance --> MCS 14
178  dist.push_back(10000); // User 3 distance --> MCS 8
179  dist.push_back(20000); // User 4 distance --> MCS 8
180  std::vector<uint32_t> estAchievableRateDl;
181  estAchievableRateDl.push_back(2196000);
182  estAchievableRateDl.push_back(1383000);
183  estAchievableRateDl.push_back(775000);
184  estAchievableRateDl.push_back(421000);
185  estAchievableRateDl.push_back(421000);
186  std::vector<uint32_t> estThrFdBetUl;
187  estThrFdBetUl.push_back(469000); // User 0 estimated TTI throughput from FDBET
188  estThrFdBetUl.push_back(157000); // User 1 estimated TTI throughput from FDBET
189  estThrFdBetUl.push_back(125000); // User 2 estimated TTI throughput from FDBET
190  estThrFdBetUl.push_back(85000); // User 3 estimated TTI throughput from FDBET
191  estThrFdBetUl.push_back(26000); // User 4 estimated TTI throughput from FDBET
192  AddTestCase(
193  new LenaFdBetFfMacSchedulerTestCase2(dist, estAchievableRateDl, estThrFdBetUl, errorModel),
194  TestCase::QUICK);
195 }
196 
202 
203 // --------------- T E S T - C A S E # 1 ------------------------------
204 
205 std::string
207 {
208  std::ostringstream oss;
209  oss << nUser << " UEs, distance " << dist << " m";
210  return oss.str();
211 }
212 
214  double dist,
215  double thrRefDl,
216  double thrRefUl,
217  bool errorModelEnabled)
218  : TestCase(BuildNameString(nUser, dist)),
219  m_nUser(nUser),
220  m_dist(dist),
221  m_thrRefDl(thrRefDl),
222  m_thrRefUl(thrRefUl),
223  m_errorModelEnabled(errorModelEnabled)
224 {
225 }
226 
228 {
229 }
230 
231 void
233 {
234  if (!m_errorModelEnabled)
235  {
236  Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
237  Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
238  }
239 
240  Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
241  Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
242  StringValue(CreateTempDirFilename("DlMacStats.txt")));
243  Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
244  StringValue(CreateTempDirFilename("UlMacStats.txt")));
245  Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
246  StringValue(CreateTempDirFilename("DlRlcStats.txt")));
247  Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
248  StringValue(CreateTempDirFilename("UlRlcStats.txt")));
249 
254  Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
255 
256  lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
257 
258  // Create Nodes: eNodeB and UE
259  NodeContainer enbNodes;
260  NodeContainer ueNodes;
261  enbNodes.Create(1);
262  ueNodes.Create(m_nUser);
263 
264  // Install Mobility Model
266  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
267  mobility.Install(enbNodes);
268  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
269  mobility.Install(ueNodes);
270 
271  // Create Devices and install them in the Nodes (eNB and UE)
272  NetDeviceContainer enbDevs;
273  NetDeviceContainer ueDevs;
274  lteHelper->SetSchedulerType("ns3::FdBetFfMacScheduler");
275  lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
276  enbDevs = lteHelper->InstallEnbDevice(enbNodes);
277  ueDevs = lteHelper->InstallUeDevice(ueNodes);
278 
279  // Attach a UE to a eNB
280  lteHelper->Attach(ueDevs, enbDevs.Get(0));
281 
282  // Activate an EPS bearer
283  EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
284  EpsBearer bearer(q);
285  lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
286 
287  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
288  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
289  enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
290  enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
291 
292  // Set UEs' position and power
293  for (int i = 0; i < m_nUser; i++)
294  {
297  mm->SetPosition(Vector(m_dist, 0.0, 0.0));
298  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
299  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
300  uePhy->SetAttribute("TxPower", DoubleValue(23.0));
301  uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
302  }
303 
304  double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
305  double statsDuration = 0.6;
306  double tolerance = 0.1;
307  Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.000001));
308 
309  lteHelper->EnableMacTraces();
310  lteHelper->EnableRlcTraces();
311  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
312  rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
313  rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
314 
315  Simulator::Run();
316 
320  NS_LOG_INFO("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
321  std::vector<uint64_t> dlDataRxed;
322  for (int i = 0; i < m_nUser; i++)
323  {
324  // get the imsi
325  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
326  // get the lcId
327  uint8_t lcId = 3;
328  dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
329  NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at(i)
330  << " thr " << (double)dlDataRxed.at(i) / statsDuration << " ref "
331  << m_thrRefDl);
332  }
339  for (int i = 0; i < m_nUser; i++)
340  {
341  NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
342  m_thrRefDl,
343  m_thrRefDl * tolerance,
344  " Unfair Throughput!");
345  }
346 
350  NS_LOG_INFO("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
351  std::vector<uint64_t> ulDataRxed;
352  for (int i = 0; i < m_nUser; i++)
353  {
354  // get the imsi
355  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
356  // get the lcId
357  uint8_t lcId = 3;
358  ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
359  NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)ulDataRxed.at(i)
360  << " thr " << (double)ulDataRxed.at(i) / statsDuration << " ref "
361  << m_thrRefUl);
362  }
369  for (int i = 0; i < m_nUser; i++)
370  {
371  NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
372  m_thrRefUl,
373  m_thrRefUl * tolerance,
374  " Unfair Throughput!");
375  }
376  Simulator::Destroy();
377 }
378 
379 // --------------- T E S T - C A S E # 2 ------------------------------
380 
381 std::string
382 LenaFdBetFfMacSchedulerTestCase2::BuildNameString(uint16_t nUser, std::vector<double> dist)
383 {
384  std::ostringstream oss;
385  oss << "distances (m) = [ ";
386  for (auto it = dist.begin(); it != dist.end(); ++it)
387  {
388  oss << *it << " ";
389  }
390  oss << "]";
391  return oss.str();
392 }
393 
395  std::vector<double> dist,
396  std::vector<uint32_t> achievableRateDl,
397  std::vector<uint32_t> estThrFdBetUl,
398  bool errorModelEnabled)
399  : TestCase(BuildNameString(dist.size(), dist)),
400  m_nUser(dist.size()),
401  m_dist(dist),
402  m_achievableRateDl(achievableRateDl),
403  m_estThrFdBetUl(estThrFdBetUl),
404  m_errorModelEnabled(errorModelEnabled)
405 {
406 }
407 
409 {
410 }
411 
412 void
414 {
415  NS_LOG_FUNCTION(this);
416 
417  if (!m_errorModelEnabled)
418  {
419  Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
420  Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
421  }
422  Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(false));
423  Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
424  StringValue(CreateTempDirFilename("DlMacStats.txt")));
425  Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
426  StringValue(CreateTempDirFilename("UlMacStats.txt")));
427  Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
428  StringValue(CreateTempDirFilename("DlRlcStats.txt")));
429  Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
430  StringValue(CreateTempDirFilename("UlRlcStats.txt")));
431 
436  Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
437 
438  lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
439 
440  // Create Nodes: eNodeB and UE
441  NodeContainer enbNodes;
442  NodeContainer ueNodes;
443  enbNodes.Create(1);
444  ueNodes.Create(m_nUser);
445 
446  // Install Mobility Model
448  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
449  mobility.Install(enbNodes);
450  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
451  mobility.Install(ueNodes);
452 
453  // Create Devices and install them in the Nodes (eNB and UE)
454  NetDeviceContainer enbDevs;
455  NetDeviceContainer ueDevs;
456  lteHelper->SetSchedulerType("ns3::FdBetFfMacScheduler");
457  lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
458  enbDevs = lteHelper->InstallEnbDevice(enbNodes);
459  ueDevs = lteHelper->InstallUeDevice(ueNodes);
460 
461  // Attach a UE to a eNB
462  lteHelper->Attach(ueDevs, enbDevs.Get(0));
463 
464  // Activate an EPS bearer
465  EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
466  EpsBearer bearer(q);
467  lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
468 
469  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
470  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
471  enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
472  enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
473 
474  // Set UEs' position and power
475  for (int i = 0; i < m_nUser; i++)
476  {
479  mm->SetPosition(Vector(m_dist.at(i), 0.0, 0.0));
480  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
481  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
482  uePhy->SetAttribute("TxPower", DoubleValue(23.0));
483  uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
484  }
485 
486  double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
487  double statsDuration = 0.4;
488  double tolerance = 0.1;
489  Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.000001));
490 
491  lteHelper->EnableMacTraces();
492  lteHelper->EnableRlcTraces();
493  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
494  rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
495  rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
496 
497  Simulator::Run();
498 
499  NS_LOG_INFO("DL - Test with " << m_nUser << " user(s)");
500  std::vector<uint64_t> dlDataRxed;
501  double totalData = 0;
502  double estTotalThr = 0;
503  double estUeThr = 0;
504  for (int i = 0; i < m_nUser; i++)
505  {
506  // get the imsi
507  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
508  // get the lcId
509  uint8_t lcId = 3;
510  dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
511  totalData += (double)dlDataRxed.at(i);
512  estTotalThr += 1 / m_achievableRateDl.at(i);
513  NS_LOG_INFO("\tUser " << i << " dist " << m_dist.at(i) << " imsi " << imsi << " bytes rxed "
514  << (double)dlDataRxed.at(i) << " thr "
515  << (double)dlDataRxed.at(i) / statsDuration << " ref " << m_nUser);
516  }
517 
518  estTotalThr = m_nUser * (1 / estTotalThr);
519  estUeThr = estTotalThr / m_nUser;
524  for (int i = 0; i < m_nUser; i++)
525  {
526  double thrRatio = 1.0 / m_nUser;
527  double estThrRatio = (double)dlDataRxed.at(i) / totalData;
528  NS_LOG_INFO("\tUser " << i << " thrRatio " << thrRatio << " estThrRatio " << estThrRatio);
529  NS_TEST_ASSERT_MSG_EQ_TOL(estThrRatio, thrRatio, tolerance, " Unfair Throughput!");
530  NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
531  estUeThr,
532  estUeThr * tolerance,
533  " Unfair Throughput!");
534  }
535 
540  NS_LOG_INFO("UL - Test with " << m_nUser);
541  std::vector<uint64_t> ulDataRxed;
542  for (int i = 0; i < m_nUser; i++)
543  {
544  // get the imsi
545  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
546  // get the lcId
547  uint8_t lcId = 3;
548  ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
549  NS_LOG_INFO("\tUser " << i << " dist " << m_dist.at(i) << " bytes rxed "
550  << (double)ulDataRxed.at(i) << " thr "
551  << (double)ulDataRxed.at(i) / statsDuration << " ref "
552  << (double)m_estThrFdBetUl.at(i));
553  NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
554  (double)m_estThrFdBetUl.at(i),
555  (double)m_estThrFdBetUl.at(i) * tolerance,
556  " Unfair Throughput!");
557  }
558  Simulator::Destroy();
559 }
This system test program creates different test cases with a single eNB and several UEs,...
static std::string BuildNameString(uint16_t nUser, double dist)
Builds the test name string based on provided parameter values.
LenaFdBetFfMacSchedulerTestCase1(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
Constructor.
void DoRun() override
Implementation to actually run this TestCase.
double m_dist
distance between the nodes
Test case is similar to the one defined in LenaFdBetFfMacSchedulerTestCase1, with the difference that...
void DoRun() override
Implementation to actually run this TestCase.
bool m_errorModelEnabled
specifies whether the error model is enabled
std::vector< double > m_dist
distance between the nodes
static std::string BuildNameString(uint16_t nUser, std::vector< double > dist)
Builds the test name string based on provided parameter values.
std::vector< uint32_t > m_achievableRateDl
DL achievable rate.
std::vector< uint32_t > m_estThrFdBetUl
estimated throughput FDBET UL
LenaFdBetFfMacSchedulerTestCase2(std::vector< double > dist, std::vector< uint32_t > achievableRateDl, std::vector< uint32_t > estThrFdBetUl, bool errorModelEnabled)
Constructor.
Test suite for FDBetFfMacScheduler test case.
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 LenaTestFdBetFfMacSchedulerSuite lenaTestFdBetFfMacSchedulerSuite
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