A Discrete-Event Network Simulator
API
lte-test-tdbet-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("LenaTestTdBetFfMacScheduler");
57 
59  : TestSuite("lte-tdbet-ff-mac-scheduler", SYSTEM)
60 {
61  NS_LOG_INFO("creating LenaTestTdBetFfMacSchedulerSuite");
62 
63  bool errorModel = false;
64 
65  // Test Case 1: AMC works in TDBET
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 -> 2196000 among 3 users -> 732000 bytes/sec
72  // 6 users -> 2196000 among 6 users -> 366000 bytes/sec
73  // 12 users -> 2196000 among 12 users -> 183000 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 LenaTdBetFfMacSchedulerTestCase1(1, 0, 2196000, 2292000, errorModel),
81  TestCase::EXTENSIVE);
82  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(3, 0, 732000, 749000, errorModel),
83  TestCase::EXTENSIVE);
84  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(6, 0, 366000, 373000, errorModel),
85  TestCase::EXTENSIVE);
86  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(12, 0, 183000, 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 -> 1383000 among 3 users ->461000 bytes/sec
92  // 6 users -> 1383000 among 6 users ->230500 bytes/sec
93  // 12 users -> 1383000 among 12 users ->115250 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 LenaTdBetFfMacSchedulerTestCase1(1, 4800, 1383000, 807000, errorModel),
101  TestCase::EXTENSIVE);
102  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(3, 4800, 461000, 253000, errorModel),
103  TestCase::EXTENSIVE);
104  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(6, 4800, 230500, 125000, errorModel),
105  TestCase::EXTENSIVE);
106  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(12, 4800, 115250, 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 -> 1191000 among 3 users ->397000 bytes/sec
112  // 6 users -> 1191000 among 6 users ->198500 bytes/sec
113  // 12 users -> 1191000 among 12 users ->99250 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 LenaTdBetFfMacSchedulerTestCase1(1, 6000, 1191000, 621000, errorModel),
120  TestCase::EXTENSIVE);
121  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(3, 6000, 397000, 201000, errorModel),
122  TestCase::EXTENSIVE);
123  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(6, 6000, 198500, 97000, errorModel),
124  TestCase::EXTENSIVE);
125  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(12, 6000, 99250, 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 -> 775000 among 3 users -> 258333 bytes/sec
131  // 6 users -> 775000 among 6 users -> 129166 bytes/sec
132  // 12 users -> 775000 among 12 users ->64583 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 LenaTdBetFfMacSchedulerTestCase1(1, 10000, 775000, 421000, errorModel),
140  TestCase::EXTENSIVE);
141  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(3, 10000, 258333, 137000, errorModel),
142  TestCase::EXTENSIVE);
143  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(6, 10000, 129166, 67000, errorModel),
144  TestCase::EXTENSIVE);
145  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(12, 10000, 64583, 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 -> 421000 among 3 users ->140333 bytes/sec
151  // 6 users -> 421000 among 6 users ->70166 bytes/sec
152  // 12 users -> 421000 among 12 users ->35083 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 LenaTdBetFfMacSchedulerTestCase1(1, 20000, 421000, 137000, errorModel),
160  TestCase::EXTENSIVE);
161  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(3, 20000, 140333, 41000, errorModel),
162  TestCase::EXTENSIVE);
163  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(6, 20000, 70166, 22000, errorModel),
164  TestCase::EXTENSIVE);
165  AddTestCase(new LenaTdBetFfMacSchedulerTestCase1(12, 20000, 35083, 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 LenaTdBetFfMacSchedulerTestCase1(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> estThrTdBetUl;
187  estThrTdBetUl.push_back(469000); // User 0 estimated TTI throughput from TDBET
188  estThrTdBetUl.push_back(157000); // User 1 estimated TTI throughput from TDBET
189  estThrTdBetUl.push_back(125000); // User 2 estimated TTI throughput from TDBET
190  estThrTdBetUl.push_back(85000); // User 3 estimated TTI throughput from TDBET
191  estThrTdBetUl.push_back(26000); // User 4 estimated TTI throughput from TDBET
192  AddTestCase(
193  new LenaTdBetFfMacSchedulerTestCase2(dist, estAchievableRateDl, estThrTdBetUl, 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 
250  // Disable Uplink Power Control
251  Config::SetDefault("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue(false));
252 
257  Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
258 
259  lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
260 
261  // Create Nodes: eNodeB and UE
262  NodeContainer enbNodes;
263  NodeContainer ueNodes;
264  enbNodes.Create(1);
265  ueNodes.Create(m_nUser);
266 
267  // Install Mobility Model
269  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
270  mobility.Install(enbNodes);
271  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
272  mobility.Install(ueNodes);
273 
274  // Create Devices and install them in the Nodes (eNB and UE)
275  NetDeviceContainer enbDevs;
276  NetDeviceContainer ueDevs;
277  lteHelper->SetSchedulerType("ns3::TdBetFfMacScheduler");
278  lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
279  enbDevs = lteHelper->InstallEnbDevice(enbNodes);
280  ueDevs = lteHelper->InstallUeDevice(ueNodes);
281 
282  // Attach a UE to a eNB
283  lteHelper->Attach(ueDevs, enbDevs.Get(0));
284 
285  // Activate an EPS bearer
286  EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
287  EpsBearer bearer(q);
288  lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
289 
290  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
291  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
292  enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
293  enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
294 
295  // Set UEs' position and power
296  for (int i = 0; i < m_nUser; i++)
297  {
300  mm->SetPosition(Vector(m_dist, 0.0, 0.0));
301  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
302  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
303  uePhy->SetAttribute("TxPower", DoubleValue(23.0));
304  uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
305  }
306 
307  double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
308  double statsDuration = 0.6;
309  double tolerance = 0.1;
310  Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.000001));
311 
312  lteHelper->EnableMacTraces();
313  lteHelper->EnableRlcTraces();
314  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
315  rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
316  rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
317 
318  NS_LOG_DEBUG("Start ");
319 
320  Simulator::Run();
321 
325  NS_LOG_INFO("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
326  std::vector<uint64_t> dlDataRxed;
327  for (int i = 0; i < m_nUser; i++)
328  {
329  // get the imsi
330  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
331  // get the lcId
332  uint8_t lcId = 3;
333  dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
334  NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at(i)
335  << " thr " << (double)dlDataRxed.at(i) / statsDuration << " ref "
336  << m_thrRefDl);
337  }
344  for (int i = 0; i < m_nUser; i++)
345  {
346  NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
347  m_thrRefDl,
348  m_thrRefDl * tolerance,
349  " Unfair Throughput!");
350  }
351 
355  NS_LOG_INFO("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
356  std::vector<uint64_t> ulDataRxed;
357  for (int i = 0; i < m_nUser; i++)
358  {
359  // get the imsi
360  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
361  // get the lcId
362  uint8_t lcId = 3;
363  ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
364  NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)ulDataRxed.at(i)
365  << " thr " << (double)ulDataRxed.at(i) / statsDuration << " ref "
366  << m_thrRefUl);
367  }
374  for (int i = 0; i < m_nUser; i++)
375  {
376  NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
377  m_thrRefUl,
378  m_thrRefUl * tolerance,
379  " Unfair Throughput!");
380  }
381  Simulator::Destroy();
382 }
383 
384 // --------------- T E S T - C A S E # 2 ------------------------------
385 
386 std::string
387 LenaTdBetFfMacSchedulerTestCase2::BuildNameString(uint16_t nUser, std::vector<double> dist)
388 {
389  std::ostringstream oss;
390  oss << "distances (m) = [ ";
391  for (auto it = dist.begin(); it != dist.end(); ++it)
392  {
393  oss << *it << " ";
394  }
395  oss << "]";
396  return oss.str();
397 }
398 
400  std::vector<double> dist,
401  std::vector<uint32_t> estAchievableRateDl,
402  std::vector<uint32_t> estThrTdBetUl,
403  bool errorModelEnabled)
404  : TestCase(BuildNameString(dist.size(), dist)),
405  m_nUser(dist.size()),
406  m_dist(dist),
407  m_achievableRateDl(estAchievableRateDl),
408  m_estThrTdBetUl(estThrTdBetUl),
409  m_errorModelEnabled(errorModelEnabled)
410 {
411 }
412 
414 {
415 }
416 
417 void
419 {
420  NS_LOG_FUNCTION(this);
421 
422  if (!m_errorModelEnabled)
423  {
424  Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
425  Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
426  }
427  Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(false));
428  Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
429  StringValue(CreateTempDirFilename("DlMacStats.txt")));
430  Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
431  StringValue(CreateTempDirFilename("UlMacStats.txt")));
432  Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
433  StringValue(CreateTempDirFilename("DlRlcStats.txt")));
434  Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
435  StringValue(CreateTempDirFilename("UlRlcStats.txt")));
436 
441  Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
442 
443  lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
444 
445  // Create Nodes: eNodeB and UE
446  NodeContainer enbNodes;
447  NodeContainer ueNodes;
448  enbNodes.Create(1);
449  ueNodes.Create(m_nUser);
450 
451  // Install Mobility Model
453  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
454  mobility.Install(enbNodes);
455  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
456  mobility.Install(ueNodes);
457 
458  // Create Devices and install them in the Nodes (eNB and UE)
459  NetDeviceContainer enbDevs;
460  NetDeviceContainer ueDevs;
461  lteHelper->SetSchedulerType("ns3::TdBetFfMacScheduler");
462  lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
463  enbDevs = lteHelper->InstallEnbDevice(enbNodes);
464  ueDevs = lteHelper->InstallUeDevice(ueNodes);
465 
466  // Attach a UE to a eNB
467  lteHelper->Attach(ueDevs, enbDevs.Get(0));
468 
469  // Activate an EPS bearer
470  EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
471  EpsBearer bearer(q);
472  lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
473 
474  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
475  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
476  enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
477  enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
478 
479  // Set UEs' position and power
480  for (int i = 0; i < m_nUser; i++)
481  {
484  mm->SetPosition(Vector(m_dist.at(i), 0.0, 0.0));
485  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
486  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
487  uePhy->SetAttribute("TxPower", DoubleValue(23.0));
488  uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
489  }
490 
491  double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
492  double statsDuration = 0.4;
493  double tolerance = 0.1;
494  Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.000001));
495 
496  lteHelper->EnableMacTraces();
497  lteHelper->EnableRlcTraces();
498  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
499  rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
500  rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
501 
502  Simulator::Run();
503 
504  NS_LOG_INFO("DL - Test with " << m_nUser << " user(s)");
505  std::vector<uint64_t> dlDataRxed;
506  double totalData = 0;
507  double estTotalThr = 0;
508  double estUeThr = 0;
509  for (int i = 0; i < m_nUser; i++)
510  {
511  // get the imsi
512  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
513  // get the lcId
514  uint8_t lcId = 3;
515  dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
516  totalData += (double)dlDataRxed.at(i);
517  estTotalThr += 1 / m_achievableRateDl.at(i);
518  NS_LOG_INFO("\tUser " << i << " dist " << m_dist.at(i) << " imsi " << imsi << " bytes rxed "
519  << (double)dlDataRxed.at(i) << " thr "
520  << (double)dlDataRxed.at(i) / statsDuration << " ref " << m_nUser);
521  }
522 
523  estTotalThr = m_nUser * (1 / estTotalThr);
524  estUeThr = estTotalThr / m_nUser;
529  for (int i = 0; i < m_nUser; i++)
530  {
531  double thrRatio = 1.0 / m_nUser;
532  double estThrRatio = (double)dlDataRxed.at(i) / totalData;
533  NS_LOG_INFO("\tUser " << i << " thrRatio " << thrRatio << " estThrRatio " << estThrRatio);
534  NS_TEST_ASSERT_MSG_EQ_TOL(estThrRatio, thrRatio, tolerance, " Unfair Throughput!");
535  NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
536  estUeThr,
537  estUeThr * tolerance,
538  " Unfair Throughput!");
539  }
540 
545  NS_LOG_INFO("UL - Test with " << m_nUser);
546  std::vector<uint64_t> ulDataRxed;
547  for (int i = 0; i < m_nUser; i++)
548  {
549  // get the imsi
550  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
551  // get the lcId
552  uint8_t lcId = 3;
553  ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
554  NS_LOG_INFO("\tUser " << i << " dist " << m_dist.at(i) << " bytes rxed "
555  << (double)ulDataRxed.at(i) << " thr "
556  << (double)ulDataRxed.at(i) / statsDuration << " ref "
557  << (double)m_estThrTdBetUl.at(i));
558  NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
559  (double)m_estThrTdBetUl.at(i),
560  (double)m_estThrTdBetUl.at(i) * tolerance,
561  " Unfair Throughput!");
562  }
563  Simulator::Destroy();
564 }
This system test program creates different test cases with a single eNB and several UEs,...
bool m_errorModelEnabled
indicates whether the error model is enabled
static std::string BuildNameString(uint16_t nUser, double dist)
Builds the test name string based on provided parameter values.
void DoRun() override
Implementation to actually run this TestCase.
double m_thrRefUl
the UL throughput reference
double m_thrRefDl
the DL throughput reference
LenaTdBetFfMacSchedulerTestCase1(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
Constructor.
double m_dist
the distance between UE nodes and eNodeB
Lena TdBet Ff Mac Scheduler Test Case.
static std::string BuildNameString(uint16_t nUser, std::vector< double > dist)
Build name string.
void DoRun() override
Implementation to actually run this TestCase.
std::vector< double > m_dist
the distance between nodes
LenaTdBetFfMacSchedulerTestCase2(std::vector< double > dist, std::vector< uint32_t > achievableRateDl, std::vector< uint32_t > estThrTdBetUl, bool errorModelEnabled)
Constructor.
std::vector< uint32_t > m_estThrTdBetUl
etimated TDBET UL throughput
bool m_errorModelEnabled
indicates whether the error model is enabled
std::vector< uint32_t > m_achievableRateDl
DL achievable rate.
Test suite for TdBetFfMacScheduler tests.
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_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:268
#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 LenaTestTdBetFfMacSchedulerSuite lenaTestTdBetFfMacSchedulerSuite
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