A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
lte-test-tdtbfq-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 
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 
60 
61 NS_LOG_COMPONENT_DEFINE ("LenaTestTdTbfqFfMacScheduler");
62 
63 namespace ns3 {
64 
66  : TestSuite ("lte-tdtbfq-ff-mac-scheduler", SYSTEM)
67 {
68  NS_LOG_INFO ("creating LenaTestTdTbfqFfMacSchedulerSuite");
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 TDTBFQ (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 LenaTdTbfqFfMacSchedulerTestCase1 (1,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
95  AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (3,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
96  AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (6,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
97  //AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (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 LenaTdTbfqFfMacSchedulerTestCase1 (1,0,4800,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
115  AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (3,0,4800,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
116  AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (6,0,4800,150500,125000,200,1,errorModel), TestCase::EXTENSIVE);
117  //AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (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 LenaTdTbfqFfMacSchedulerTestCase1 (1,0,6000,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
136  AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (3,0,6000,232000,201000,200,1,errorModel), TestCase::EXTENSIVE);
137  AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (6,0,6000,129167,97000,200,1,errorModel), TestCase::EXTENSIVE);
138  //AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (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 LenaTdTbfqFfMacSchedulerTestCase1 (1,0,10000,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
156  AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (3,0,10000,140333,137000,200,1,errorModel), TestCase::EXTENSIVE);
157  AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (6,0,10000,70166,67000,200,1,errorModel), TestCase::EXTENSIVE);
158  //AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase1 (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 TDTBFQ (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> estThrTdTbfqDl1;
177  estThrTdTbfqDl1.push_back (132000); // User 0 estimated TTI throughput from TDTBFQ
178  estThrTdTbfqDl1.push_back (132000); // User 1 estimated TTI throughput from TDTBFQ
179  estThrTdTbfqDl1.push_back (132000); // User 2 estimated TTI throughput from TDTBFQ
180  estThrTdTbfqDl1.push_back (132000); // User 3 estimated TTI throughput from TDTBFQ
181  AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase2 (dist1,estThrTdTbfqDl1,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> estThrTdTbfqDl2;
199  estThrTdTbfqDl2.push_back (180232); // User 0 estimated TTI throughput from TDTBFQ
200  estThrTdTbfqDl2.push_back (180232); // User 1 estimated TTI throughput from TDTBFQ
201  estThrTdTbfqDl2.push_back (180232); // User 2 estimated TTI throughput from TDTBFQ
202  estThrTdTbfqDl2.push_back (180232); // User 3 estimated TTI throughput from TDTBFQ
203  AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase2 (dist2,estThrTdTbfqDl2,packetSize2,1,errorModel), TestCase::EXTENSIVE);
204 
205  // Test Case 3: heterogeneous flow test in TDTBFQ
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> estThrTdTbfqDl3;
219  estThrTdTbfqDl3.push_back (132000); // User 0 estimated TTI throughput from TDTBFQ
220  estThrTdTbfqDl3.push_back (232000); // User 1 estimated TTI throughput from TDTBFQ
221  estThrTdTbfqDl3.push_back (332000); // User 2 estimated TTI throughput from TDTBFQ
222  AddTestCase (new LenaTdTbfqFfMacSchedulerTestCase2 (dist3,estThrTdTbfqDl3,packetSize3,1,errorModel), TestCase::QUICK);
223 
224 }
225 
227 
228 // --------------- T E S T - C A S E # 1 ------------------------------
229 
230 
231 std::string
233 {
234  std::ostringstream oss;
235  oss << nUser << " UEs, distance " << dist << " m";
236  return oss.str ();
237 }
238 
239 
240 LenaTdTbfqFfMacSchedulerTestCase1::LenaTdTbfqFfMacSchedulerTestCase1 (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 
254 {
255 }
256 
257 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 ("TdTbfqFfMacScheduler", 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 
309  //LogComponentEnable ("LenaTestTdTbfqFfMacCheduler", 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::TdTbfqFfMacScheduler");
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 
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  }
468 
469 }
470 
471 
472 
473 // --------------- T E S T - C A S E # 2 ------------------------------
474 
475 
476 std::string
477 LenaTdTbfqFfMacSchedulerTestCase2::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 LenaTdTbfqFfMacSchedulerTestCase2::LenaTdTbfqFfMacSchedulerTestCase2 (std::vector<uint16_t> dist, std::vector<uint32_t> estThrTdTbfqDl, 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_estThrTdTbfqDl (estThrTdTbfqDl),
497  m_errorModelEnabled (errorModelEnabled)
498 {
499 }
500 
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 
549  //LogComponentEnable ("LenaTestTdTbfqFfMacCheduler", 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::TdTbfqFfMacScheduler");
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 
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_estThrTdTbfqDl.at (i), m_estThrTdTbfqDl.at (i) * tolerance, " Unfair Throughput!");
692  }
693 
695 
696 }
697 
698 
699 } // namespace ns3
700 
701 
702 
703