A Discrete-Event Network Simulator
API
lte-test-fdbet-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 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  * Dizhi Zhou <dizhi.zhou@gmail.com>
21  */
22 
23 #include <iostream>
24 #include <sstream>
25 #include <string>
26 
27 #include <ns3/object.h>
28 #include <ns3/spectrum-interference.h>
29 #include <ns3/spectrum-error-model.h>
30 #include <ns3/log.h>
31 #include <ns3/test.h>
32 #include <ns3/simulator.h>
33 #include <ns3/packet.h>
34 #include <ns3/ptr.h>
35 #include "ns3/radio-bearer-stats-calculator.h"
36 #include <ns3/constant-position-mobility-model.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 
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), TestCase::EXTENSIVE);
81  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (3,0,749000,749000, errorModel), TestCase::EXTENSIVE);
82  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (6,0,373000,373000, errorModel), TestCase::EXTENSIVE);
83  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (12,0,185000,184670, errorModel), TestCase::EXTENSIVE);
84 
85  // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
86  // 1 user -> 24 PRB at Itbs 20 -> 1383 -> 1383000 bytes/sec
87  // 3 users -> 8 PRB at Itbs 20 -> 469 -> 469000 bytes/sec
88  // 6 users -> 4 PRB at Itbs 20 -> 233 -> 233000 bytes/sec
89  // 12 users -> 2 PRB at Itbs 20 -> 113 -> 113000 bytes/sec
90  // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
91  // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 bytes/sec
92  // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 bytes/sec
93  // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 bytes/sec
94  // after the patch enforcing min 3 PRBs per UE:
95  // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 bytes/sec
96  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (1,4800,1383000,807000, errorModel), TestCase::EXTENSIVE);
97  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (3,4800,469000,253000, errorModel), TestCase::EXTENSIVE);
98  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (6,4800,233500,125000, errorModel), TestCase::EXTENSIVE);
99  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (12,4800,113000,62000, errorModel), TestCase::EXTENSIVE);
100 
101  // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
102  // 1 user -> 24 PRB at Itbs 18 -> 1191 -> 1191000 byte/sec
103  // 3 users -> 8 PRB at Itbs 18 -> 389 -> 389000 bytes/sec
104  // 6 users -> 4 PRB at Itbs 18 -> 193 -> 193000 bytes/sec
105  // 12 users -> 2 PRB at Itbs 18 -> 97 -> 97000 bytes/sec
106  // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
107  // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 bytes/sec
108  // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 bytes/sec
109  // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 bytes/sec
110  // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 bytes/sec
111  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (1,6000,1191000,621000,errorModel), TestCase::EXTENSIVE);
112  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (3,6000,389000,201000,errorModel), TestCase::EXTENSIVE);
113  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (6,6000,193000,97000,errorModel), TestCase::EXTENSIVE);
114  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (12,6000,97000,48667,errorModel), TestCase::EXTENSIVE);
115 
116  // DOWNLINK - DISTANCE 10000 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
117  // 1 user -> 24 PRB at Itbs 13 -> 775 -> 775000 byte/sec
118  // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 bytes/sec
119  // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 bytes/sec
120  // 12 users -> 2 PRB at Itbs 13 -> 61 -> 61000 bytes/sec
121  // UPLINK - DISTANCE 9000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
122  // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 bytes/sec
123  // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
124  // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
125  // after the patch enforcing min 3 PRBs per UE:
126  // 12 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/12 UE/TTI -> 32667 bytes/sec
127  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (1,10000,775000,421000,errorModel), TestCase::EXTENSIVE);
128  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (3,10000,253000,137000,errorModel), TestCase::EXTENSIVE);
129  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (6,10000,125000,67000,errorModel), TestCase::EXTENSIVE);
130  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (12,10000,61000,32667,errorModel), TestCase::EXTENSIVE);
131 
132  // DOWNLINK - DISTANCE 20000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
133  // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 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  // 12 users -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
137  // UPLINK - DISTANCE 20000 -> MCS 2 -> Itbs 2 (from table 7.1.7.2.1-1 of 36.213)
138  // 1 user -> 25 PRB at Itbs 2 -> 137 -> 137000 bytes/sec
139  // 3 users -> 8 PRB at Itbs 2 -> 41 -> 41000 bytes/sec
140  // 6 users -> 4 PRB at Itbs 2 -> 22 -> 22000 bytes/sec
141  // after the patch enforcing min 3 PRBs per UE:
142  // 12 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/12 UE/TTI -> 12000 bytes/sec
143  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (1,20000,421000,137000,errorModel), TestCase::EXTENSIVE);
144  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (3,20000,137000,41000,errorModel), TestCase::EXTENSIVE);
145  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (6,20000,67000,22000,errorModel), TestCase::EXTENSIVE);
146  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (12,20000,32000,12000,errorModel), TestCase::EXTENSIVE);
147 
148  // DOWNLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
149  // UPLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
150  AddTestCase (new LenaFdBetFfMacSchedulerTestCase1 (1,100000,0,0,errorModel), TestCase::QUICK);
151 
152  // Test Case 2: fairness check
153 
154  std::vector<double> dist;
155  dist.push_back (0); // User 0 distance --> MCS 28
156  dist.push_back (4800); // User 1 distance --> MCS 22
157  dist.push_back (6000); // User 2 distance --> MCS 14
158  dist.push_back (10000); // User 3 distance --> MCS 8
159  dist.push_back (20000); // User 4 distance --> MCS 8
160  std::vector<uint32_t> estAchievableRateDl;
161  estAchievableRateDl.push_back (2196000);
162  estAchievableRateDl.push_back (1383000);
163  estAchievableRateDl.push_back (775000);
164  estAchievableRateDl.push_back (421000);
165  estAchievableRateDl.push_back (421000);
166  std::vector<uint32_t> estThrFdBetUl;
167  estThrFdBetUl.push_back (469000); // User 0 estimated TTI throughput from FDBET
168  estThrFdBetUl.push_back (157000); // User 1 estimated TTI throughput from FDBET
169  estThrFdBetUl.push_back (125000); // User 2 estimated TTI throughput from FDBET
170  estThrFdBetUl.push_back (85000); // User 3 estimated TTI throughput from FDBET
171  estThrFdBetUl.push_back (26000); // User 4 estimated TTI throughput from FDBET
172  AddTestCase (new LenaFdBetFfMacSchedulerTestCase2 (dist, estAchievableRateDl, estThrFdBetUl, errorModel), TestCase::QUICK);
173 }
174 
176 
177 
178 // --------------- T E S T - C A S E # 1 ------------------------------
179 
180 
181 std::string
183 {
184  std::ostringstream oss;
185  oss << nUser << " UEs, distance " << dist << " m";
186  return oss.str ();
187 }
188 
189 LenaFdBetFfMacSchedulerTestCase1::LenaFdBetFfMacSchedulerTestCase1 (uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
190  : TestCase (BuildNameString (nUser, dist)),
191  m_nUser (nUser),
192  m_dist (dist),
193  m_thrRefDl (thrRefDl),
194  m_thrRefUl (thrRefUl),
195  m_errorModelEnabled (errorModelEnabled)
196 {
197 }
198 
200 {
201 }
202 
203 void
205 {
206  if (!m_errorModelEnabled)
207  {
208  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
209  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
210  }
211 
212  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
213 
214  //Disable Uplink Power Control
215  Config::SetDefault ("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue (false));
216 
221  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
222 
223  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
224 
225  // Create Nodes: eNodeB and UE
226  NodeContainer enbNodes;
227  NodeContainer ueNodes;
228  enbNodes.Create (1);
229  ueNodes.Create (m_nUser);
230 
231  // Install Mobility Model
233  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
234  mobility.Install (enbNodes);
235  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
236  mobility.Install (ueNodes);
237 
238  // Create Devices and install them in the Nodes (eNB and UE)
239  NetDeviceContainer enbDevs;
240  NetDeviceContainer ueDevs;
241  lteHelper->SetSchedulerType ("ns3::FdBetFfMacScheduler");
242  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
243  ueDevs = lteHelper->InstallUeDevice (ueNodes);
244 
245  // Attach a UE to a eNB
246  lteHelper->Attach (ueDevs, enbDevs.Get (0));
247 
248  // Activate an EPS bearer
249  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
250  EpsBearer bearer (q);
251  lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
252 
253  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
254  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
255  enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
256  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
257 
258  // Set UEs' position and power
259  for (int i = 0; i < m_nUser; i++)
260  {
262  mm->SetPosition (Vector (m_dist, 0.0, 0.0));
263  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
264  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
265  uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
266  uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
267  }
268 
269  double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
270  double statsDuration = 0.6;
271  double tolerance = 0.1;
272  Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.000001));
273 
274  lteHelper->EnableMacTraces ();
275  lteHelper->EnableRlcTraces ();
276  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
277  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
278  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
279 
280  Simulator::Run ();
281 
285  NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
286  std::vector <uint64_t> dlDataRxed;
287  for (int i = 0; i < m_nUser; i++)
288  {
289  // get the imsi
290  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
291  // get the lcId
292  uint8_t lcId = 3;
293  dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
294  NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at (i) << " thr " << (double)dlDataRxed.at (i) / statsDuration << " ref " << m_thrRefDl);
295  }
302  for (int i = 0; i < m_nUser; i++)
303  {
304  NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataRxed.at (i) / statsDuration, m_thrRefDl, m_thrRefDl * tolerance, " Unfair Throughput!");
305  }
306 
310  NS_LOG_INFO ("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
311  std::vector <uint64_t> ulDataRxed;
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  // get the lcId
317  uint8_t lcId = 3;
318  ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
319  NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)ulDataRxed.at (i) << " thr " << (double)ulDataRxed.at (i) / statsDuration << " ref " << m_thrRefUl);
320  }
327  for (int i = 0; i < m_nUser; i++)
328  {
329  NS_TEST_ASSERT_MSG_EQ_TOL ((double)ulDataRxed.at (i) / statsDuration, m_thrRefUl, m_thrRefUl * tolerance, " Unfair Throughput!");
330  }
331  Simulator::Destroy ();
332 
333 }
334 
335 
336 
337 // --------------- T E S T - C A S E # 2 ------------------------------
338 
339 
340 std::string
341 LenaFdBetFfMacSchedulerTestCase2::BuildNameString (uint16_t nUser, std::vector<double> dist)
342 {
343  std::ostringstream oss;
344  oss << "distances (m) = [ " ;
345  for (std::vector<double>::iterator it = dist.begin (); it != dist.end (); ++it)
346  {
347  oss << *it << " ";
348  }
349  oss << "]";
350  return oss.str ();
351 }
352 
353 
354 LenaFdBetFfMacSchedulerTestCase2::LenaFdBetFfMacSchedulerTestCase2 (std::vector<double> dist, std::vector<uint32_t> achievableRateDl, std::vector<uint32_t> estThrFdBetUl, bool errorModelEnabled)
355  : TestCase (BuildNameString (dist.size (), dist)),
356  m_nUser (dist.size ()),
357  m_dist (dist),
358  m_achievableRateDl (achievableRateDl),
359  m_estThrFdBetUl (estThrFdBetUl),
360  m_errorModelEnabled (errorModelEnabled)
361 {
362 }
363 
365 {
366 }
367 
368 void
370 {
371 
372  NS_LOG_FUNCTION (this);
373 
374  if (!m_errorModelEnabled)
375  {
376  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
377  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
378  }
379  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (false));
380 
385  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
386 
387  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
388 
389  // Create Nodes: eNodeB and UE
390  NodeContainer enbNodes;
391  NodeContainer ueNodes;
392  enbNodes.Create (1);
393  ueNodes.Create (m_nUser);
394 
395  // Install Mobility Model
397  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
398  mobility.Install (enbNodes);
399  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
400  mobility.Install (ueNodes);
401 
402  // Create Devices and install them in the Nodes (eNB and UE)
403  NetDeviceContainer enbDevs;
404  NetDeviceContainer ueDevs;
405  lteHelper->SetSchedulerType ("ns3::FdBetFfMacScheduler");
406  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
407  ueDevs = lteHelper->InstallUeDevice (ueNodes);
408 
409  // Attach a UE to a eNB
410  lteHelper->Attach (ueDevs, enbDevs.Get (0));
411 
412  // Activate an EPS bearer
413  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
414  EpsBearer bearer (q);
415  lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
416 
417  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
418  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
419  enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
420  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
421 
422  // Set UEs' position and power
423  for (int i = 0; i < m_nUser; i++)
424  {
426  mm->SetPosition (Vector (m_dist.at (i), 0.0, 0.0));
427  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
428  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
429  uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
430  uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
431  }
432 
433 
434  double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
435  double statsDuration = 0.4;
436  double tolerance = 0.1;
437  Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.000001));
438 
439  lteHelper->EnableMacTraces ();
440  lteHelper->EnableRlcTraces ();
441  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
442  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
443  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
444 
445  Simulator::Run ();
446 
447  NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s)");
448  std::vector <uint64_t> dlDataRxed;
449  double totalData = 0;
450  double estTotalThr = 0;
451  double estUeThr = 0;
452  for (int i = 0; i < m_nUser; i++)
453  {
454  // get the imsi
455  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
456  // get the lcId
457  uint8_t lcId = 3;
458  dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
459  totalData += (double)dlDataRxed.at (i);
460  estTotalThr += 1 / m_achievableRateDl.at (i);
461  NS_LOG_INFO ("\tUser " << i << " dist " << m_dist.at (i) << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at (i) << " thr " << (double)dlDataRxed.at (i) / statsDuration << " ref " << m_nUser);
462  }
463 
464  estTotalThr = m_nUser * (1 / estTotalThr);
465  estUeThr = estTotalThr / m_nUser;
470  for (int i = 0; i < m_nUser; i++)
471  {
472  double thrRatio = (double) 1 / m_nUser;
473  double estThrRatio = (double)dlDataRxed.at (i) / totalData;
474  NS_LOG_INFO ("\tUser " << i << " thrRatio " << thrRatio << " estThrRatio " << estThrRatio);
475  NS_TEST_ASSERT_MSG_EQ_TOL (estThrRatio, thrRatio, tolerance, " Unfair Throughput!");
476  NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataRxed.at (i) / statsDuration, estUeThr, estUeThr * tolerance, " Unfair Throughput!");
477 
478  }
479 
484  NS_LOG_INFO ("UL - Test with " << m_nUser);
485  std::vector <uint64_t> ulDataRxed;
486  for (int i = 0; i < m_nUser; i++)
487  {
488  // get the imsi
489  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
490  // get the lcId
491  uint8_t lcId = 3;
492  ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
493  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_estThrFdBetUl.at (i));
494  NS_TEST_ASSERT_MSG_EQ_TOL ((double)ulDataRxed.at (i) / statsDuration, (double)m_estThrFdBetUl.at (i), (double)m_estThrFdBetUl.at (i) * tolerance, " Unfair Throughput!");
495  }
496  Simulator::Destroy ();
497 
498 }
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
AttributeValue implementation for Boolean.
Definition: boolean.h:36
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:484
bool m_errorModelEnabled
specifies whether the error model is enabled
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:459
Hold variables of type string.
Definition: string.h:41
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
A suite of tests to run.
Definition: test.h:1342
LenaFdBetFfMacSchedulerTestCase2(std::vector< double > dist, std::vector< uint32_t > achievableRateDl, std::vector< uint32_t > estThrFdBetUl, bool errorModelEnabled)
Constructor.
Ptr< LteEnbPhy > GetPhy(void) const
Mobility model for which the current position does not change once it has been set and until it is se...
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:943
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
void EnableRlcTraces(void)
Enable trace sinks for RLC layer.
Definition: lte-helper.cc:1350
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:277
encapsulates test code
Definition: test.h:1155
static std::string BuildNameString(uint16_t nUser, double dist)
Builds the test name string based on provided parameter values.
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1294
This system test program creates different test cases with a single eNB and several UEs...
LenaFdBetFfMacSchedulerTestCase1(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
Constructor.
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:282
double m_dist
distance between the nodes
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:71
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
tuple mobility
Definition: third.py:101
AttributeValue implementation for Time.
Definition: nstime.h:1055
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
uint64_t GetDlRxData(uint64_t imsi, uint8_t lcid)
Gets the number of received downlink data bytes.
holds a vector of ns3::NetDevice pointers
Test case is simillar to the one defined in LenaFdBetFfMacSchedulerTestCase1, with the difference tha...
#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:380
virtual void DoRun(void)
Implementation to actually run this TestCase.
static LenaTestFdBetFfMacSchedulerSuite lenaTestFdBetFfMacSchedulerSuite
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
std::vector< double > m_dist
distance between the nodes
void SetPosition(const Vector &position)
double m_thrRefDl
DL throughput reference.
Ptr< RadioBearerStatsCalculator > GetRlcStats(void)
Definition: lte-helper.cc:1487
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:499
Helper class used to assign positions and mobility models to nodes.
uint64_t GetUlRxData(uint64_t imsi, uint8_t lcid)
Gets the number of received uplink data bytes.
Test suite for FDBetFfMacScheduler test case.
double m_thrRefUl
UL throughput reference.
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:993
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:782
std::vector< uint32_t > m_achievableRateDl
DL achievable rate.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void EnableMacTraces(void)
Enable trace sinks for MAC layer.
Definition: lte-helper.cc:1444
Ptr< LteUePhy > GetPhy(void) const
Get the Phy.
virtual void DoRun(void)
Implementation to actually run this TestCase.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
Definition: double.h:41
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:185
The eNodeB device implementation.
static std::string BuildNameString(uint16_t nUser, std::vector< double > dist)
Builds the test name string based on provided parameter values.
Qci
QoS Class Indicator.
Definition: eps-bearer.h:77
std::vector< uint32_t > m_estThrFdBetUl
estimated throughput FDBET UL
The LteUeNetDevice class implements the UE net device.