A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
lte-test-rr-ff-mac-scheduler.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Marco Miozzo <marco.miozzo@cttc.es>
19  * Nicola Baldo <nbaldo@cttc.es>
20  */
21 
22 #include <ns3/object.h>
23 #include <ns3/spectrum-interference.h>
24 #include <ns3/spectrum-error-model.h>
25 #include <ns3/log.h>
26 #include <ns3/test.h>
27 #include <ns3/simulator.h>
28 #include <ns3/packet.h>
29 #include <ns3/ptr.h>
30 #include <iostream>
31 #include "ns3/radio-bearer-stats-calculator.h"
32 #include <ns3/constant-position-mobility-model.h>
33 #include <ns3/eps-bearer.h>
34 #include <ns3/node-container.h>
35 #include <ns3/mobility-helper.h>
36 #include <ns3/net-device-container.h>
37 #include <ns3/lte-ue-net-device.h>
38 #include <ns3/lte-enb-net-device.h>
39 #include <ns3/lte-ue-rrc.h>
40 #include <ns3/lte-helper.h>
41 #include "ns3/string.h"
42 #include "ns3/double.h"
43 #include <ns3/lte-enb-phy.h>
44 #include <ns3/lte-ue-phy.h>
45 #include <ns3/boolean.h>
46 #include <ns3/enum.h>
47 #include <ns3/config-store-module.h>
48 
50 
51 NS_LOG_COMPONENT_DEFINE ("LenaTestRrFfMacScheduler");
52 
53 namespace ns3 {
54 
55 
57  : TestSuite ("lte-rr-ff-mac-scheduler", SYSTEM)
58 {
59  NS_LOG_INFO ("creating LenaRrFfMacSchedulerTestCase");
60 
61  bool errorModel = true;
62 
63 
64  // DOWNLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
65  // 1 user -> 24 PRB at Itbs 26 -> 2196 -> 2196000 bytes/sec
66  // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
67  // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
68  // 9 user -> 2 PRB at Itbs 26 -> 185 -> 185000 bytes/sec
69  // 12 users -> 2 PRB at Itbs 26 -> 185 -> 185000 bytes/sec
70  // 15 users -> 2 PRB at Itbs 26 * 0.8 -> 148 -> 148000 bytes/sec
71  // UPLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
72  // 1 user -> 25 PRB at Itbs 26 -> 2292 -> 2292000 bytes/sec
73  // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
74  // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
75  // after the patch enforcing min 3 PRBs per UE:
76  // 9 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/9 UE/TTI -> 246220 bytes/sec
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 LenaRrFfMacSchedulerTestCase (1,0,2196000,2292000,errorModel), TestCase::EXTENSIVE);
80  AddTestCase (new LenaRrFfMacSchedulerTestCase (3,0,749000,749000,errorModel), TestCase::QUICK);
81  AddTestCase (new LenaRrFfMacSchedulerTestCase (6,0,373000,373000,errorModel), TestCase::EXTENSIVE);
82  AddTestCase (new LenaRrFfMacSchedulerTestCase (9,0,185000,246220,errorModel), TestCase::EXTENSIVE);
83  AddTestCase (new LenaRrFfMacSchedulerTestCase (12,0,185000,184670,errorModel), TestCase::EXTENSIVE);
84  AddTestCase (new LenaRrFfMacSchedulerTestCase (15,0,148000,147730,errorModel), TestCase::EXTENSIVE);
85 
86  // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
87  // 1 user -> 24 PRB at Itbs 20 -> 1383 -> 1383000 bytes/sec
88  // 3 users -> 8 PRB at Itbs 20 -> 469 -> 469000 bytes/sec
89  // 6 users -> 4 PRB at Itbs 20 -> 233 -> 233000 bytes/sec
90  // 9 user -> 2 PRB at Itbs 20 -> 113 -> 113000 bytes/sec
91  // 12 users -> 2 PRB at Itbs 20 -> 113 -> 113000 bytes/sec
92  // 15 users -> 2 PRB at Itbs 20 * 0.8 -> 90.4 -> 90400 bytes/sec
93  // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
94  // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 bytes/sec
95  // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 bytes/sec
96  // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 bytes/sec
97  // after the patch enforcing min 3 PRBs per UE:
98  // 9 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/9 UE/TTI -> 82667 bytes/sec
99  // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 bytes/sec
100  // 15 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/15 UE/TTI -> 49600 bytes/sec
101  AddTestCase (new LenaRrFfMacSchedulerTestCase (1,4800,1383000,807000,errorModel), TestCase::EXTENSIVE);
102  AddTestCase (new LenaRrFfMacSchedulerTestCase (3,4800,469000,253000,errorModel), TestCase::EXTENSIVE);
103  AddTestCase (new LenaRrFfMacSchedulerTestCase (6,4800,233000,125000,errorModel), TestCase::EXTENSIVE);
104  AddTestCase (new LenaRrFfMacSchedulerTestCase (9,4800,113000,82667,errorModel), TestCase::EXTENSIVE);
105  AddTestCase (new LenaRrFfMacSchedulerTestCase (12,4800,113000,62000,errorModel), TestCase::EXTENSIVE);
106  AddTestCase (new LenaRrFfMacSchedulerTestCase (15,4800,90400,49600,errorModel), TestCase::EXTENSIVE);
107 
108  // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
109  // 1 user -> 24 PRB at Itbs 15 -> 1191 -> 1191000 bytes/sec
110  // 3 users -> 8 PRB at Itbs 15 -> 389 -> 389000 bytes/sec
111  // 6 users -> 4 PRB at Itbs 15 -> 193 -> 193000 bytes/sec
112  // 9 user -> 2 PRB at Itbs 15 -> 97 -> 97000 bytes/sec
113  // 12 users -> 2 PRB at Itbs 15 -> 97 -> 97000 bytes/sec
114  // 15 users -> 2 PRB at Itbs 15 * 0.8 -> 77.6 -> 77600 bytes/sec
115  // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
116  // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 bytes/sec
117  // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 bytes/sec
118  // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 bytes/sec
119  // 9 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/9 UE/TTI -> 64889 bytes/sec
120  // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 bytes/sec
121  // 15 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/15 UE/TTI -> 38993 bytes/sec
122  AddTestCase (new LenaRrFfMacSchedulerTestCase (1,6000,1191000,621000,errorModel), TestCase::EXTENSIVE);
123  AddTestCase (new LenaRrFfMacSchedulerTestCase (3,6000,389000,201000,errorModel), TestCase::EXTENSIVE);
124  AddTestCase (new LenaRrFfMacSchedulerTestCase (6,6000,193000,97000,errorModel), TestCase::EXTENSIVE);
125  AddTestCase (new LenaRrFfMacSchedulerTestCase (9,6000,97000,64889,errorModel), TestCase::EXTENSIVE);
126  AddTestCase (new LenaRrFfMacSchedulerTestCase (12,6000,97000,48667,errorModel), TestCase::EXTENSIVE);
127  AddTestCase (new LenaRrFfMacSchedulerTestCase (15,6000,77600,38993,errorModel), TestCase::EXTENSIVE);
128 
129  // DOWNLINK - DISTANCE 20000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
130  // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 bytes/sec
131  // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
132  // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
133  // 9 user -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
134  // 12 users -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
135  // 15 users -> 2 PRB at Itbs 8 * 0.8 -> 25.6 -> 25600 bytes/sec
136  // UPLINK - DISTANCE 20000 -> MCS 2 -> Itbs 2 (from table 7.1.7.2.1-1 of 36.213)
137  // 1 user -> 25 PRB at Itbs 2 -> 137 -> 137000 bytes/sec
138  // 3 users -> 8 PRB at Itbs 2 -> 41 -> 41000 bytes/sec
139  // 6 users -> 4 PRB at Itbs 2 -> 22 -> 22000 bytes/sec
140  // after the patch enforcing min 3 PRBs per UE:
141  // 9 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/9 UE/TTI -> 16000 bytes/sec
142  // 12 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/12 UE/TTI -> 12000 bytes/sec
143  // 15 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/15 UE/TTI -> 9600 bytes/sec
144  AddTestCase (new LenaRrFfMacSchedulerTestCase (1,20000,421000,137000,errorModel), TestCase::EXTENSIVE);
145  AddTestCase (new LenaRrFfMacSchedulerTestCase (3,20000,137000,41000,errorModel), TestCase::EXTENSIVE);
146  AddTestCase (new LenaRrFfMacSchedulerTestCase (6,20000,67000,22000,errorModel), TestCase::EXTENSIVE);
147  AddTestCase (new LenaRrFfMacSchedulerTestCase (9,20000,32000,16000,errorModel), TestCase::EXTENSIVE);
148  AddTestCase (new LenaRrFfMacSchedulerTestCase (12,20000,32000,12000,errorModel), TestCase::EXTENSIVE);
149  AddTestCase (new LenaRrFfMacSchedulerTestCase (15,20000,25600,9600,errorModel), TestCase::EXTENSIVE);
150 
151 }
152 
154 
155 std::string
156 LenaRrFfMacSchedulerTestCase::BuildNameString (uint16_t nUser, uint16_t dist)
157 {
158  std::ostringstream oss;
159  oss << nUser << " UEs, distance " << dist << " m";
160  return oss.str ();
161 }
162 
163 LenaRrFfMacSchedulerTestCase::LenaRrFfMacSchedulerTestCase (uint16_t nUser, uint16_t dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
164  : TestCase (BuildNameString (nUser, dist)),
165  m_nUser (nUser),
166  m_dist (dist),
167  m_thrRefDl (thrRefDl),
168  m_thrRefUl (thrRefUl),
169  m_errorModelEnabled (errorModelEnabled)
170 {
171 }
172 
174 {
175 }
176 
177 void
179 {
180  NS_LOG_FUNCTION (this << m_nUser << m_dist);
181  if (!m_errorModelEnabled)
182  {
183  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
184  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
185  }
186  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (false));
187 
188  // This is needed as the RR scheduler does not allocate resources properly for retransmission
189  Config::SetDefault ("ns3::LteRlcAm::TxOpportunityForRetxAlwaysBigEnough", BooleanValue (true));
190 
195  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
196 
197  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
198 
199  // Create Nodes: eNodeB and UE
200  NodeContainer enbNodes;
201  NodeContainer ueNodes;
202  enbNodes.Create (1);
203  ueNodes.Create (m_nUser);
204 
205  // Install Mobility Model
206  MobilityHelper mobility;
207  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
208  mobility.Install (enbNodes);
209  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
210  mobility.Install (ueNodes);
211 
212  // Create Devices and install them in the Nodes (eNB and UE)
213  NetDeviceContainer enbDevs;
214  NetDeviceContainer ueDevs;
215  lteHelper->SetSchedulerType ("ns3::RrFfMacScheduler");
216  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
217  ueDevs = lteHelper->InstallUeDevice (ueNodes);
218 
219  // Attach a UE to a eNB
220  lteHelper->Attach (ueDevs, enbDevs.Get (0));
221 
222  // Activate an EPS bearer
224  EpsBearer bearer (q);
225  lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
226 
227 
228  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
229  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
230  enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
231  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
232 
233  // Set UEs' position and power
234  for (int i = 0; i < m_nUser; i++)
235  {
237  mm->SetPosition (Vector (m_dist, 0.0, 0.0));
238  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
239  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
240  uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
241  uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
242  }
243 
244 
245  double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
246  double statsDuration = 0.4;
247  double tolerance = 0.1;
248  Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.0001));
249 
250  lteHelper->EnableRlcTraces ();
251  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
252  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
253  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
254 
255  Simulator::Run ();
256 
260  NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
261  std::vector <uint64_t> dlDataRxed;
263  {
264  m_thrRefDl *= 0.95; // for couting the Vienna AMC behavior: BLER between 0% and 10%
265  }
266  for (int i = 0; i < m_nUser; i++)
267  {
268  // get the imsi
269  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
270  uint8_t lcId = 3;
271  dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
272  NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t) lcId << " bytes rxed " << (double)dlDataRxed.at (i) << " thr " << (double)dlDataRxed.at (i) / statsDuration << " ref " << m_thrRefDl);
273  NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataRxed.at (i) / statsDuration, m_thrRefDl, m_thrRefDl * tolerance, " Unfair Throughput!");
274  }
275 
276  NS_LOG_INFO ("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
277  std::vector <uint64_t> ulDataRxed;
279  {
280  m_thrRefUl *= 0.95; // for couting the Vienna AMC behavior: BLER between 0% and 10%
281  }
282  for (int i = 0; i < m_nUser; i++)
283  {
284  // get the imsi
285  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
286  // get the lcId
287  uint8_t lcId = 3;
288  ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
289  NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t) lcId << " bytes rxed " << (double)ulDataRxed.at (i) << " thr " << (double)ulDataRxed.at (i) / statsDuration << " ref " << m_thrRefUl << " txed " << rlcStats->GetUlTxData (imsi, lcId) / statsDuration);
290  NS_TEST_ASSERT_MSG_EQ_TOL ((double)ulDataRxed.at (i) / statsDuration, m_thrRefUl, m_thrRefUl * tolerance, " Unfair Throughput!");
291  }
292 
294 }
295 
296 
297 } // namespace ns3
298 
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
#define NS_LOG_FUNCTION(parameters)
Definition: log.h:345
Hold a bool native type.
Definition: boolean.h:38
hold variables of type string
Definition: string.h:19
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
#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:326
static std::string BuildNameString(uint16_t nUser, uint16_t dist)
A suite of tests to run.
Definition: test.h:1025
Mobility model for which the current position does not change once it has been set and until it is se...
static void Run(void)
Run the simulation until one of:
Definition: simulator.cc:157
#define NS_LOG_INFO(msg)
Definition: log.h:298
encapsulates test code
Definition: test.h:849
This system test program creates different test cases with a single eNB and several UEs...
a 3d vector
Definition: vector.h:31
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.
static LenaTestRrFfMacSchedulerSuite lenaTestRrFfMacSchedulerSuite
hold objects of type ns3::Time
Definition: nstime.h:961
Medium length test.
Definition: test.h:858
holds a vector of ns3::NetDevice pointers
static void Destroy(void)
Every event scheduled by the Simulator::insertAtDestroy method is invoked.
Definition: simulator.cc:121
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:667
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())
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
Definition: test.cc:173
Fast test.
Definition: test.h:857
Helper class used to assign positions and mobility models to nodes.
static void Stop(void)
If an event invokes this method, it will be the last event scheduled by the Simulator::run method bef...
Definition: simulator.cc:165
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
virtual void DoRun(void)
Implementation to actually run this TestCase.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
NS_LOG_COMPONENT_DEFINE("LenaTestRrFfMacScheduler")
Hold a floating point type.
Definition: double.h:41
The eNodeB device implementation.
Ptr< T > GetObject(void) const
Definition: object.h:361
Qci
QoS Class Indicator.
Definition: eps-bearer.h:77
LenaRrFfMacSchedulerTestCase(uint16_t nUser, uint16_t dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
The LteUeNetDevice class implements the UE net device.