A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
lte-test-fdtbfq-ff-mac-scheduler.cc
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 
52 #include "ns3/epc-helper.h"
53 #include "ns3/network-module.h"
54 #include "ns3/ipv4-global-routing-helper.h"
55 #include "ns3/internet-module.h"
56 #include "ns3/applications-module.h"
57 #include "ns3/point-to-point-helper.h"
58 
59 #include "lte-test-fdtbfq-ff-mac-scheduler.h"
60 
61 NS_LOG_COMPONENT_DEFINE ("LenaTestFdTbfqFfMacScheduler");
62 
63 namespace ns3 {
64 
65 LenaTestFdTbfqFfMacSchedulerSuite::LenaTestFdTbfqFfMacSchedulerSuite ()
66  : TestSuite ("lte-fdtbfq-ff-mac-scheduler", SYSTEM)
67 {
68  NS_LOG_INFO ("creating LenaTestFdTbfqFfMacSchedulerSuite");
69 
70  bool errorModel = false;
71 
72  // General config
73  // Traffic: UDP traffic with fixed rate
74  // Token generation rate = traffic rate
75  // RLC header length = 2 bytes, PDCP header = 2 bytes
76  // Simulation time = 1.0 sec
77  // Throughput in this file is calculated in RLC layer
78 
79  //Test Case 1: homogeneous flow test in FDTBFQ (same distance)
80  // DOWNLINK -> DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.2 13)
81  // Traffic info
82  // UDP traffic: payload size = 200 bytes, interval = 1 ms
83  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000 byte/sec -> 232000 byte/rate
84  // Totol bandwidth: 24 PRB at Itbs 26 -> 2196 -> 2196000 byte/sec
85  // 1 user -> 232000 * 1 = 232000 < 2196000 -> throughput = 232000 byte/sec
86  // 3 user -> 232000 * 3 = 696000 < 2196000 -> througphut = 232000 byte/sec
87  // 6 user -> 232000 * 6 = 139200 < 2196000 -> throughput = 232000 byte/sec
88  // 12 user -> 232000 * 12 = 2784000 > 2196000 -> throughput = 2196000 / 12 = 183000 byte/sec
89  // UPLINK -> DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.2 13)
90  // 1 user -> 25 PRB at Itbs 26 -> 2292 -> 2292000 > 232000 -> throughput = 232000 bytes/sec
91  // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 > 232000 -> throughput = 232000 bytes/sec
92  // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 > 232000 -> throughput = 232000 bytes/sec
93  // 12 users -> 2 PRB at Itbs 26 -> 185 -> 185000 < 232000 -> throughput = 185000 bytes/sec
94  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (1,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
95  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (3,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
96  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (6,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
97  //AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (12,0,0,183000,185000,200,1,errorModel));// simulation time = 1.5, otherwise, ul test will fail
98 
99  // DOWNLINK - DISTANCE 4800 -> MCS 16 -> Itbs 15 (from table 7.1.7.2.1-1 of 36.213)
100  // Traffic info
101  // UDP traffic: payload size = 200 bytes, interval = 1 ms
102  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000 byte/sec -> 232000 byte/rate
103  // Totol bandwidth: 24 PRB at Itbs 15 -> 1383 -> 903000 byte/sec
104  // 1 user -> 903000 * 1 = 232000 < 903000 -> throughput = 232000 byte/sec
105  // 3 user -> 232000 * 3 = 696000 < 903000 -> througphut = 232000 byte/sec
106  // 6 user -> 232000 * 6 = 139200 > 903000 -> throughput = 903000 / 6 = 150500 byte/sec
107  // 12 user -> 232000 * 12 = 2784000 > 903000 -> throughput = 903000 / 12 = 75250 byte/sec
108  // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
109  // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 > 232000 -> throughput = 232000 bytes/sec
110  // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 > 232000 -> throughput = 232000 bytes/sec
111  // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 < 232000 -> throughput = 125000 bytes/sec
112  // after the patch enforcing min 3 PRBs per UE:
113  // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 < 232000 -> throughput = 62000 bytes/sec
114  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (1,0,4800,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
115  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (3,0,4800,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
116  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (6,0,4800,150500,125000,200,1,errorModel), TestCase::EXTENSIVE);
117  //AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (12,0,4800,75250,62000,200,1,errorModel)); // simulation time = 1.5, otherwise, ul test will fail
118 
119  // DOWNLINK - DISTANCE 6000 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
120  // Traffic info
121  // UDP traffic: payload size = 200 bytes, interval = 1 ms
122  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000 byte/sec -> 232000 byte/rate
123  // Totol bandwidth: 24 PRB at Itbs 13 -> 775 -> 775000 byte/sec
124  // 1 user -> 903000 * 1 = 232000 < 775000 -> throughput = 232000 byte/sec
125  // 3 user -> 232000 * 3 = 696000 < 775000 -> througphut = 232000 byte/sec
126  // 6 user -> 232000 * 6 = 139200 > 775000 -> throughput = 775000 / 6 = 129167 byte/sec
127  // 12 user -> 232000 * 12 = 2784000 > 775000 -> throughput = 775000 / 12 = 64583 byte/sec
128 
129  // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
130  // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 > 232000 -> throughput = 232000 bytes/sec
131  // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 < 232000 -> throughput = 201000 bytes/sec
132  // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 < 232000 -> throughput = 97000 bytes/sec
133  // after the patch enforcing min 3 PRBs per UE:
134  // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 < 232000 -> throughput = 48667 bytes/sec
135  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (1,0,6000,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
136  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (3,0,6000,232000,201000,200,1,errorModel), TestCase::EXTENSIVE);
137  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (6,0,6000,129167,97000,200,1,errorModel), TestCase::EXTENSIVE);
138  //AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (12,0,6000,64583,48667,200,1, errorModel)); // simulation time = 1.5, otherwise, ul test will fail
139 
140  // DOWNLINK - DISTANCE 10000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
141  // Traffic info
142  // UDP traffic: payload size = 200 bytes, interval = 1 ms
143  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000 byte/sec -> 232000 byte/rate
144  // Totol bandwidth: 24 PRB at Itbs 8 -> 421 -> 421000 byte/sec
145  // 1 user -> 903000 * 1 = 232000 < 421000 -> throughput = 232000 byte/sec
146  // 3 user -> 232000 * 3 = 696000 > 421000 -> througphut = 421000 / 3 = 140333 byte/sec
147  // 6 user -> 232000 * 6 = 139200 > 421000 -> throughput = 421000 / 6 = 70166 byte/sec
148  // 12 user -> 232000 * 12 = 2784000 > 421000 -> throughput = 421000 / 12 = 35083 byte/sec
149  // UPLINK - DISTANCE 10000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
150  // 1 user -> 24 PRB at Itbs 8 -> 437 -> 437000 > 232000 -> throughput = 232000 bytes/sec
151  // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 < 232000 -> throughput = 137000 bytes/sec
152  // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 < 232000 -> throughput = 67000 bytes/sec
153  // after the patch enforcing min 3 PRBs per UE:
154  // 12 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/12 UE/TTI -> 32667 < 232000 -> throughput = 32667 bytes/sec
155  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (1,0,10000,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
156  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (3,0,10000,140333,137000,200,1,errorModel), TestCase::EXTENSIVE);
157  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (6,0,10000,70166,67000,200,1,errorModel), TestCase::EXTENSIVE);
158  //AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (12,0,10000,35083,32667,200,1,errorModel));// simulation time = 1.5, otherwise, ul test will fail
159 
160  // Test Case 2: homogeneous flow test in FDTBFQ (different distance)
161  // Traffic1 info
162  // UDP traffic: payload size = 100 bytes, interval = 1 ms
163  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000 byte/sec -> 132000 byte/rate
164  // Maximum throughput = 4 / ( 1/2196000 + 1/903000 + 1/621000 + 1/421000 ) = 720930 byte/s
165  // 132000 * 4 = 528000 < 720930 -> estimated throughput in downlink = 132000 byte/sec
166  std::vector<uint16_t> dist1;
167  dist1.push_back (0); // User 0 distance --> MCS 28
168  dist1.push_back (4800); // User 1 distance --> MCS 16
169  dist1.push_back (6000); // User 2 distance --> MCS 14
170  dist1.push_back (10000); // User 3 distance --> MCS 8
171  std::vector<uint16_t> packetSize1;
172  packetSize1.push_back (100);
173  packetSize1.push_back (100);
174  packetSize1.push_back (100);
175  packetSize1.push_back (100);
176  std::vector<uint32_t> estThrFdTbfqDl1;
177  estThrFdTbfqDl1.push_back (132000); // User 0 estimated TTI throughput from FDTBFQ
178  estThrFdTbfqDl1.push_back (132000); // User 1 estimated TTI throughput from FDTBFQ
179  estThrFdTbfqDl1.push_back (132000); // User 2 estimated TTI throughput from FDTBFQ
180  estThrFdTbfqDl1.push_back (132000); // User 3 estimated TTI throughput from FDTBFQ
181  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase2 (dist1,estThrFdTbfqDl1,packetSize1,1,errorModel), TestCase::EXTENSIVE);
182 
183  // Traffic2 info
184  // UDP traffic: payload size = 200 bytes, interval = 1 ms
185  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000 byte/sec -> 232000 byte/rate
186  // Maximum throughput = 4 / ( 1/2196000 + 1/903000 + 1/621000 + 1/421000 ) = 720930 byte/s
187  // 232000 * 4 = 928000 > 720930 -> estimated throughput in downlink = 720930 / 4 = 180232 byte/sec
188  std::vector<uint16_t> dist2;
189  dist2.push_back (0); // User 0 distance --> MCS 28
190  dist2.push_back (4800); // User 1 distance --> MCS 16
191  dist2.push_back (6000); // User 2 distance --> MCS 14
192  dist2.push_back (10000); // User 3 distance --> MCS 8
193  std::vector<uint16_t> packetSize2;
194  packetSize2.push_back (200);
195  packetSize2.push_back (200);
196  packetSize2.push_back (200);
197  packetSize2.push_back (200);
198  std::vector<uint32_t> estThrFdTbfqDl2;
199  estThrFdTbfqDl2.push_back (180232); // User 0 estimated TTI throughput from FDTBFQ
200  estThrFdTbfqDl2.push_back (180232); // User 1 estimated TTI throughput from FDTBFQ
201  estThrFdTbfqDl2.push_back (180232); // User 2 estimated TTI throughput from FDTBFQ
202  estThrFdTbfqDl2.push_back (180232); // User 3 estimated TTI throughput from FDTBFQ
203  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase2 (dist2,estThrFdTbfqDl2,packetSize2,1,errorModel), TestCase::EXTENSIVE);
204 
205  // Test Case 3: heterogeneous flow test in FDTBFQ
206  // UDP traffic: payload size = [100,200,300] bytes, interval = 1 ms
207  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000 byte/sec -> [132000, 232000, 332000] byte/rate
208  // Maximum throughput = 3 / ( 1/2196000 + 1/903000 + 1/621000 ) = 945450 byte/s
209  // 132000 + 232000 + 332000 = 696000 < 945450 -> estimated throughput in downlink = [132000, 232000, 332000] byte/sec
210  std::vector<uint16_t> dist3;
211  dist3.push_back (0); // User 0 distance --> MCS 28
212  dist3.push_back (4800); // User 1 distance --> MCS 16
213  dist3.push_back (6000); // User 2 distance --> MCS 14
214  std::vector<uint16_t> packetSize3;
215  packetSize3.push_back (100);
216  packetSize3.push_back (200);
217  packetSize3.push_back (300);
218  std::vector<uint32_t> estThrFdTbfqDl3;
219  estThrFdTbfqDl3.push_back (132000); // User 0 estimated TTI throughput from FDTBFQ
220  estThrFdTbfqDl3.push_back (232000); // User 1 estimated TTI throughput from FDTBFQ
221  estThrFdTbfqDl3.push_back (332000); // User 2 estimated TTI throughput from FDTBFQ
222  AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase2 (dist3,estThrFdTbfqDl3,packetSize3,1,errorModel), TestCase::QUICK);
223 
224 }
225 
226 static LenaTestFdTbfqFfMacSchedulerSuite lenaTestFdTbfqFfMacSchedulerSuite;
227 
228 // --------------- T E S T - C A S E # 1 ------------------------------
229 
230 
231 std::string
232 LenaFdTbfqFfMacSchedulerTestCase1::BuildNameString (uint16_t nUser, uint16_t dist)
233 {
234  std::ostringstream oss;
235  oss << nUser << " UEs, distance " << dist << " m";
236  return oss.str ();
237 }
238 
239 
240 LenaFdTbfqFfMacSchedulerTestCase1::LenaFdTbfqFfMacSchedulerTestCase1 (uint16_t nUser, uint16_t nLc, uint16_t dist, double thrRefDl, double thrRefUl, uint16_t packetSize, uint16_t interval,bool errorModelEnabled)
241  : TestCase (BuildNameString (nUser, dist)),
242  m_nUser (nUser),
243  m_nLc (nLc),
244  m_dist (dist),
245  m_packetSize (packetSize),
246  m_interval (interval),
247  m_thrRefDl (thrRefDl),
248  m_thrRefUl (thrRefUl),
249  m_errorModelEnabled (errorModelEnabled)
250 {
251 }
252 
253 LenaFdTbfqFfMacSchedulerTestCase1::~LenaFdTbfqFfMacSchedulerTestCase1 ()
254 {
255 }
256 
257 void
258 LenaFdTbfqFfMacSchedulerTestCase1::DoRun (void)
259 {
260  NS_LOG_FUNCTION (this << GetName ());
261 
262  if (!m_errorModelEnabled)
263  {
264  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
265  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
266  }
267 
268  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
269 
270  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
271  Ptr<EpcHelper> epcHelper = CreateObject<EpcHelper> ();
272  lteHelper->SetEpcHelper (epcHelper);
273 
274  //LogComponentEnable ("FdTbfqFfMacScheduler", LOG_DEBUG);
275 
276  Ptr<Node> pgw = epcHelper->GetPgwNode ();
277 
278  // Create a single RemoteHost
279  NodeContainer remoteHostContainer;
280  remoteHostContainer.Create (1);
281  Ptr<Node> remoteHost = remoteHostContainer.Get (0);
282  InternetStackHelper internet;
283  internet.Install (remoteHostContainer);
284 
285  // Create the Internet
286  PointToPointHelper p2ph;
287  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
288  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500));
289  p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.001)));
290  NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
291  Ipv4AddressHelper ipv4h;
292  ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
293  Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
294  // interface 0 is localhost, 1 is the p2p device
295  Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress (1);
296 
297  Ipv4StaticRoutingHelper ipv4RoutingHelper;
298  Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
299  remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
300 
301  //Config::SetDefault ("ns3::LteAmc::AmcModel", EnumValue (LteAmc::PiroEW2010));
302  //Config::SetDefault ("ns3::LteAmc::Ber", DoubleValue (0.00005));
303  //Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
304  //Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
305 
306  //Config::SetDefault ("ns3::LteEnbRrc::EpsBearerToRlcMapping", EnumValue (LteHelper::RLC_UM_ALWAYS));
307 
308  LogComponentDisableAll (LOG_LEVEL_ALL);
309  //LogComponentEnable ("LenaTestFdTbfqFfMacCheduler", LOG_LEVEL_ALL);
310 
311  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
312 
313  // Create Nodes: eNodeB and UE
314  NodeContainer enbNodes;
315  NodeContainer ueNodes;
316  enbNodes.Create (1);
317  ueNodes.Create (m_nUser);
318 
319  // Install Mobility Model
320  MobilityHelper mobility;
321  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
322  mobility.Install (enbNodes);
323  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
324  mobility.Install (ueNodes);
325 
326  // Create Devices and install them in the Nodes (eNB and UE)
327  NetDeviceContainer enbDevs;
328  NetDeviceContainer ueDevs;
329  lteHelper->SetSchedulerType ("ns3::FdTbfqFfMacScheduler");
330  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
331  ueDevs = lteHelper->InstallUeDevice (ueNodes);
332 
333 
334  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
335  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
336  enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
337  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
338 
339  // Set UEs' position and power
340  for (int i = 0; i < m_nUser; i++)
341  {
343  mm->SetPosition (Vector (m_dist, 0.0, 0.0));
344  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
345  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
346  uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
347  uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
348  }
349 
350  // Install the IP stack on the UEs
351  internet.Install (ueNodes);
352  Ipv4InterfaceContainer ueIpIface;
353  ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueDevs));
354 
355  // Assign IP address to UEs
356  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
357  {
358  Ptr<Node> ueNode = ueNodes.Get (u);
359  // Set the default gateway for the UE
360  Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
361  ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
362  }
363 
364  // Attach a UE to a eNB
365  lteHelper->Attach (ueDevs, enbDevs.Get (0));
366 
367  // Activate an EPS bearer on all UEs
368  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
369  {
370  Ptr<NetDevice> ueDevice = ueDevs.Get (u);
371  GbrQosInformation qos;
372  qos.gbrDl = (m_packetSize + 32) * (1000 / m_interval) * 8; // bit/s, considering IP, UDP, RLC, PDCP header size
373  qos.gbrUl = 0;
374  qos.mbrDl = qos.gbrDl;
375  qos.mbrUl = 0;
376 
377  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
378  EpsBearer bearer (q, qos);
379  lteHelper->ActivateDedicatedEpsBearer (ueDevice, bearer, EpcTft::Default ());
380  }
381 
382  // Install downlind and uplink applications
383  uint16_t dlPort = 1234;
384  uint16_t ulPort = 2000;
385  PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), dlPort));
386  PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), ulPort));
387  ApplicationContainer clientApps;
388  ApplicationContainer serverApps;
389  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
390  {
391  ++ulPort;
392  serverApps.Add (dlPacketSinkHelper.Install (ueNodes.Get (u))); // receive packets from remotehost
393  serverApps.Add (ulPacketSinkHelper.Install (remoteHost)); // receive packets from UEs
394 
395  UdpClientHelper dlClient (ueIpIface.GetAddress (u), dlPort); // uplink packets generator
396  dlClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
397  dlClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
398  dlClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize));
399 
400  UdpClientHelper ulClient (remoteHostAddr, ulPort); // downlink packets generator
401  ulClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
402  ulClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
403  ulClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize));
404 
405  clientApps.Add (dlClient.Install (remoteHost));
406  clientApps.Add (ulClient.Install (ueNodes.Get (u)));
407  }
408 
409  serverApps.Start (Seconds (0.001));
410  clientApps.Start (Seconds (0.001));
411 
412  double statsStartTime = 0.001; // need to allow for RRC connection establishment + SRS
413  double statsDuration = 1;
414  double tolerance = 0.1;
415  Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.0001));
416 
417  lteHelper->EnableRlcTraces ();
418  lteHelper->EnableMacTraces ();
419  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
420  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
421  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
422 
423  Simulator::Run ();
424 
429  NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
430  std::vector <uint64_t> dlDataRxed;
431  for (int i = 0; i < m_nUser; i++)
432  {
433  // get the imsi
434  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
435  // get the lcId
436  uint8_t lcId = 4;
437  uint64_t data = rlcStats->GetDlRxData (imsi, lcId);
438  dlDataRxed.push_back (data);
439  NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at (i) << " thr " << (double)dlDataRxed.at (i) / statsDuration << " ref " << m_thrRefDl);
440  }
441 
442  for (int i = 0; i < m_nUser; i++)
443  {
444  NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataRxed.at (i) / statsDuration, m_thrRefDl, m_thrRefDl * tolerance, " Unfair Throughput!");
445  }
446 
451  NS_LOG_INFO ("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
452  std::vector <uint64_t> ulDataRxed;
453  for (int i = 0; i < m_nUser; i++)
454  {
455  // get the imsi
456  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
457  // get the lcId
458  uint8_t lcId = 4;
459  ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
460  NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)ulDataRxed.at (i) << " thr " << (double)ulDataRxed.at (i) / statsDuration << " ref " << m_thrRefUl);
461  }
462 
463  for (int i = 0; i < m_nUser; i++)
464  {
465  NS_TEST_ASSERT_MSG_EQ_TOL ((double)ulDataRxed.at (i) / statsDuration, m_thrRefUl, m_thrRefUl * tolerance, " Unfair Throughput!");
466  }
467  Simulator::Destroy ();
468 
469 }
470 
471 
472 
473 // --------------- T E S T - C A S E # 2 ------------------------------
474 
475 
476 std::string
477 LenaFdTbfqFfMacSchedulerTestCase2::BuildNameString (uint16_t nUser, std::vector<uint16_t> dist)
478 {
479  std::ostringstream oss;
480  oss << "distances (m) = [ " ;
481  for (std::vector<uint16_t>::iterator it = dist.begin (); it != dist.end (); ++it)
482  {
483  oss << *it << " ";
484  }
485  oss << "]";
486  return oss.str ();
487 }
488 
489 
490 LenaFdTbfqFfMacSchedulerTestCase2::LenaFdTbfqFfMacSchedulerTestCase2 (std::vector<uint16_t> dist, std::vector<uint32_t> estThrFdTbfqDl, std::vector<uint16_t> packetSize, uint16_t interval,bool errorModelEnabled)
491  : TestCase (BuildNameString (dist.size (), dist)),
492  m_nUser (dist.size ()),
493  m_dist (dist),
494  m_packetSize (packetSize),
495  m_interval (interval),
496  m_estThrFdTbfqDl (estThrFdTbfqDl),
497  m_errorModelEnabled (errorModelEnabled)
498 {
499 }
500 
501 LenaFdTbfqFfMacSchedulerTestCase2::~LenaFdTbfqFfMacSchedulerTestCase2 ()
502 {
503 }
504 
505 void
507 {
508 
509  if (!m_errorModelEnabled)
510  {
511  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
512  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
513  }
514 
515  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
516 
517 
518  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
519  Ptr<EpcHelper> epcHelper = CreateObject<EpcHelper> ();
520  lteHelper->SetEpcHelper (epcHelper);
521 
522  Ptr<Node> pgw = epcHelper->GetPgwNode ();
523 
524  // Create a single RemoteHost
525  NodeContainer remoteHostContainer;
526  remoteHostContainer.Create (1);
527  Ptr<Node> remoteHost = remoteHostContainer.Get (0);
528  InternetStackHelper internet;
529  internet.Install (remoteHostContainer);
530 
531  // Create the Internet
532  PointToPointHelper p2ph;
533  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
534  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500));
535  p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.001)));
536  NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
537  Ipv4AddressHelper ipv4h;
538  ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
539  Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
540  // interface 0 is localhost, 1 is the p2p device
541  Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress (1);
542 
543  Ipv4StaticRoutingHelper ipv4RoutingHelper;
544  Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
545  remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
546 
547 
548  LogComponentDisableAll (LOG_LEVEL_ALL);
549  //LogComponentEnable ("LenaTestFdTbfqFfMacCheduler", LOG_LEVEL_ALL);
550 
551  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
552 
553  // Create Nodes: eNodeB and UE
554  NodeContainer enbNodes;
555  NodeContainer ueNodes;
556  enbNodes.Create (1);
557  ueNodes.Create (m_nUser);
558 
559  // Install Mobility Model
560  MobilityHelper mobility;
561  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
562  mobility.Install (enbNodes);
563  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
564  mobility.Install (ueNodes);
565 
566  // Create Devices and install them in the Nodes (eNB and UE)
567  NetDeviceContainer enbDevs;
568  NetDeviceContainer ueDevs;
569  lteHelper->SetSchedulerType ("ns3::FdTbfqFfMacScheduler");
570  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
571  ueDevs = lteHelper->InstallUeDevice (ueNodes);
572 
573  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
574  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
575  enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
576  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
577 
578  // Set UEs' position and power
579  for (int i = 0; i < m_nUser; i++)
580  {
582  mm->SetPosition (Vector (m_dist.at (i), 0.0, 0.0));
583  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
584  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
585  uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
586  uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
587  }
588 
589  // Install the IP stack on the UEs
590  internet.Install (ueNodes);
591  Ipv4InterfaceContainer ueIpIface;
592  ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueDevs));
593 
594  // Assign IP address to UEs
595  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
596  {
597  Ptr<Node> ueNode = ueNodes.Get (u);
598  // Set the default gateway for the UE
599  Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
600  ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
601  }
602 
603  // Attach a UE to a eNB
604  lteHelper->Attach (ueDevs, enbDevs.Get (0));
605 
606  // Activate an EPS bearer on all UEs
607 
608  uint16_t mbrDl = 0;
609  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
610  {
611  mbrDl = mbrDl + m_packetSize.at (u);
612  }
613  mbrDl = mbrDl / ueNodes.GetN ();
614 
615  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
616  {
617  Ptr<NetDevice> ueDevice = ueDevs.Get (u);
618  GbrQosInformation qos;
619  qos.gbrDl = (mbrDl + 32) * (1000 / m_interval) * 8; // bit/s, considering IP, UDP, RLC, PDCP header size
620  qos.gbrUl = 0;
621  qos.mbrDl = qos.gbrDl;
622  qos.mbrUl = 0;
623 
624  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
625  EpsBearer bearer (q, qos);
626  lteHelper->ActivateDedicatedEpsBearer (ueDevice, bearer, EpcTft::Default ());
627  }
628 
629 
630  // Install downlind and uplink applications
631  uint16_t dlPort = 1234;
632  uint16_t ulPort = 2000;
633  PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), dlPort));
634  PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), ulPort));
635  ApplicationContainer clientApps;
636  ApplicationContainer serverApps;
637  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
638  {
639  ++ulPort;
640  serverApps.Add (dlPacketSinkHelper.Install (ueNodes.Get (u))); // receive packets from remotehost
641  serverApps.Add (ulPacketSinkHelper.Install (remoteHost)); // receive packets from UEs
642 
643  UdpClientHelper dlClient (ueIpIface.GetAddress (u), dlPort); // uplink packets generator
644  dlClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
645  dlClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
646  dlClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize.at (u)));
647 
648  UdpClientHelper ulClient (remoteHostAddr, ulPort); // downlink packets generator
649  ulClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
650  ulClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
651  ulClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize.at (u)));
652 
653  clientApps.Add (dlClient.Install (remoteHost));
654  clientApps.Add (ulClient.Install (ueNodes.Get (u)));
655  }
656 
657  serverApps.Start (Seconds (0.001));
658  clientApps.Start (Seconds (0.001));
659 
660  double statsStartTime = 0.001; // need to allow for RRC connection establishment + SRS
661  double statsDuration = 1.0;
662  double tolerance = 0.1;
663  Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.0001));
664 
665  lteHelper->EnableRlcTraces ();
666  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
667  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
668  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
669 
670 
671  Simulator::Run ();
672 
677  NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s)");
678  std::vector <uint64_t> dlDataRxed;
679  for (int i = 0; i < m_nUser; i++)
680  {
681  // get the imsi
682  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
683  // get the lcId
684  uint8_t lcId = 4;
685  dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
686  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);
687  }
688 
689  for (int i = 0; i < m_nUser; i++)
690  {
691  NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataRxed.at (i) / statsDuration, m_estThrFdTbfqDl.at (i), m_estThrFdTbfqDl.at (i) * tolerance, " Unfair Throughput!");
692  }
693 
695 
696 }
697 
698 
699 } // namespace ns3
700 
701 
702 
703 
holds a vector of ns3::Application pointers.
an Inet address class
static Ipv4Address GetAny(void)
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
#define NS_LOG_FUNCTION(parameters)
Definition: log.h:311
void LogComponentDisableAll(enum LogLevel level)
Definition: log.cc:363
Hold a bool native type.
Definition: boolean.h:38
holds a vector of std::pair of Ptr<Ipv4> and interface index.
hold variables of type string
Definition: string.h:19
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
NetDeviceContainer Install(NodeContainer c)
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:210
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container. ...
Mobility model for which the current position does not change once it has been set and until it is se...
static Ptr< EpcTft > Default()
Definition: epc-tft.cc:141
static void Run(void)
Definition: simulator.cc:157
#define NS_LOG_COMPONENT_DEFINE(name)
Definition: log.h:122
aggregate IP/TCP/UDP functionality to existing Nodes.
#define NS_LOG_INFO(msg)
Definition: log.h:264
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes...
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
a 3d vector
Definition: vector.h:31
ApplicationContainer Install(NodeContainer c)
uint32_t GetN(void) const
Get the number of Ptr<Node> stored in this container.
Class for representing data rates.
Definition: data-rate.h:71
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
Create a client application which sends udp packets carrying a 32bit sequence number and a 64 bit tim...
hold objects of type ns3::Time
Definition: nstime.h:700
Hold an unsigned integer type.
Definition: uinteger.h:46
holds a vector of ns3::NetDevice pointers
virtual void DoRun(void)
Implementation to actually run this test case.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
static void Destroy(void)
Definition: simulator.cc:121
Access to the Ipv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:75
void SetAttribute(std::string name, const AttributeValue &value)
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 Install(std::string nodeName) const
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual test case to this test suite.
Definition: test.cc:172
void SetChannelAttribute(std::string name, const AttributeValue &value)
Helper class used to assign positions and mobility models to nodes.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:38
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
Definition: nstime.h:586
Ptr< Ipv4StaticRouting > GetStaticRouting(Ptr< Ipv4 > ipv4) const
Helper class that adds ns3::Ipv4StaticRouting objects.
hold objects of type ns3::DataRate
static void Stop(void)
Definition: simulator.cc:164
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
ApplicationContainer Install(NodeContainer c) const
Time MilliSeconds(uint64_t ms)
create ns3::Time instances in units of milliseconds.
Definition: nstime.h:601
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Hold an floating point type.
Definition: double.h:41
Ptr< T > GetObject(void) const
Definition: object.h:332
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const