A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
lte-test-pss-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-pss-ff-mac-scheduler.h"
60 
61 NS_LOG_COMPONENT_DEFINE ("LenaTestPssFfMacScheduler");
62 
63 namespace ns3 {
64 
65 LenaTestPssFfMacSchedulerSuite::LenaTestPssFfMacSchedulerSuite ()
66  : TestSuite ("lte-pss-ff-mac-scheduler", SYSTEM)
67 {
68  NS_LOG_INFO ("creating LenaTestPssFfMacSchedulerSuite");
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 PSS (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 LenaPssFfMacSchedulerTestCase1 (1,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
95  AddTestCase (new LenaPssFfMacSchedulerTestCase1 (3,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
96  AddTestCase (new LenaPssFfMacSchedulerTestCase1 (6,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
97  //AddTestCase (new LenaPssFfMacSchedulerTestCase1 (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 LenaPssFfMacSchedulerTestCase1 (1,0,4800,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
115  AddTestCase (new LenaPssFfMacSchedulerTestCase1 (3,0,4800,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
116  AddTestCase (new LenaPssFfMacSchedulerTestCase1 (6,0,4800,150500,125000,200,1,errorModel), TestCase::EXTENSIVE);
117  //AddTestCase (new LenaPssFfMacSchedulerTestCase1 (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 LenaPssFfMacSchedulerTestCase1 (1,0,6000,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
136  AddTestCase (new LenaPssFfMacSchedulerTestCase1 (3,0,6000,232000,201000,200,1,errorModel), TestCase::EXTENSIVE);
137  AddTestCase (new LenaPssFfMacSchedulerTestCase1 (6,0,6000,129167,97000,200,1,errorModel), TestCase::EXTENSIVE);
138  //AddTestCase (new LenaPssFfMacSchedulerTestCase1 (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 LenaPssFfMacSchedulerTestCase1 (1,0,10000,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
156  AddTestCase (new LenaPssFfMacSchedulerTestCase1 (3,0,10000,140333,137000,200,1,errorModel), TestCase::EXTENSIVE);
157  AddTestCase (new LenaPssFfMacSchedulerTestCase1 (6,0,10000,70166,67000,200,1,errorModel), TestCase::EXTENSIVE);
158  //AddTestCase (new LenaPssFfMacSchedulerTestCase1 (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 PSS (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> estThrPssDl1;
177  estThrPssDl1.push_back (132000); // User 0 estimated TTI throughput from PSS
178  estThrPssDl1.push_back (132000); // User 1 estimated TTI throughput from PSS
179  estThrPssDl1.push_back (132000); // User 2 estimated TTI throughput from PSS
180  estThrPssDl1.push_back (132000); // User 3 estimated TTI throughput from PSS
181  AddTestCase (new LenaPssFfMacSchedulerTestCase2 (dist1,estThrPssDl1,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> estThrPssDl2;
199  estThrPssDl2.push_back (180232); // User 0 estimated TTI throughput from PSS
200  estThrPssDl2.push_back (180232); // User 1 estimated TTI throughput from PSS
201  estThrPssDl2.push_back (180232); // User 2 estimated TTI throughput from PSS
202  estThrPssDl2.push_back (180232); // User 3 estimated TTI throughput from PSS
203  AddTestCase (new LenaPssFfMacSchedulerTestCase2 (dist2,estThrPssDl2,packetSize2,1,errorModel), TestCase::EXTENSIVE);
204 
205  // Test Case 3: heterogeneous flow test in PSS
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> estThrPssDl3;
219  estThrPssDl3.push_back (132000); // User 0 estimated TTI throughput from PSS
220  estThrPssDl3.push_back (232000); // User 1 estimated TTI throughput from PSS
221  estThrPssDl3.push_back (332000); // User 2 estimated TTI throughput from PSS
222  AddTestCase (new LenaPssFfMacSchedulerTestCase2 (dist3,estThrPssDl3,packetSize3,1,errorModel), TestCase::QUICK);
223 
224 }
225 
226 static LenaTestPssFfMacSchedulerSuite lenaTestPssFfMacSchedulerSuite;
227 
228 // --------------- T E S T - C A S E # 1 ------------------------------
229 
230 
231 std::string
232 LenaPssFfMacSchedulerTestCase1::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 LenaPssFfMacSchedulerTestCase1::LenaPssFfMacSchedulerTestCase1 (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 LenaPssFfMacSchedulerTestCase1::~LenaPssFfMacSchedulerTestCase1 ()
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 ("PssFfMacScheduler", 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 ("LenaTestPssFfMacCheduler", 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::PssFfMacScheduler");
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 = (m_packetSize + 32) * (1000 / m_interval) * 8;
374  qos.mbrDl = 0;
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  }
468 
469 }
470 
471 
472 
473 // --------------- T E S T - C A S E # 2 ------------------------------
474 
475 
476 std::string
477 LenaPssFfMacSchedulerTestCase2::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 LenaPssFfMacSchedulerTestCase2::LenaPssFfMacSchedulerTestCase2 (std::vector<uint16_t> dist, std::vector<uint32_t> estThrPssDl, 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_estThrPssDl (estThrPssDl),
497  m_errorModelEnabled (errorModelEnabled)
498 {
499 }
500 
501 LenaPssFfMacSchedulerTestCase2::~LenaPssFfMacSchedulerTestCase2 ()
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 ("LenaTestPssFfMacCheduler", 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::PssFfMacScheduler");
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  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
609  {
610  Ptr<NetDevice> ueDevice = ueDevs.Get (u);
611  GbrQosInformation qos;
612  qos.gbrDl = (m_packetSize.at (u) + 32) * (1000 / m_interval) * 8; // bit/s, considering IP, UDP, RLC, PDCP header size
613  qos.gbrUl = (m_packetSize.at (u) + 32) * (1000 / m_interval) * 8;
614  qos.mbrDl = qos.gbrDl;
615  qos.mbrUl = qos.gbrUl;
616 
617  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
618  EpsBearer bearer (q, qos);
619  lteHelper->ActivateDedicatedEpsBearer (ueDevice, bearer, EpcTft::Default ());
620  }
621 
622 
623  // Install downlind and uplink applications
624  uint16_t dlPort = 1234;
625  uint16_t ulPort = 2000;
626  PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), dlPort));
627  PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), ulPort));
628  ApplicationContainer clientApps;
629  ApplicationContainer serverApps;
630  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
631  {
632  ++ulPort;
633  serverApps.Add (dlPacketSinkHelper.Install (ueNodes.Get (u))); // receive packets from remotehost
634  serverApps.Add (ulPacketSinkHelper.Install (remoteHost)); // receive packets from UEs
635 
636  UdpClientHelper dlClient (ueIpIface.GetAddress (u), dlPort); // uplink packets generator
637  dlClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
638  dlClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
639  dlClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize.at (u)));
640 
641  UdpClientHelper ulClient (remoteHostAddr, ulPort); // downlink packets generator
642  ulClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
643  ulClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
644  ulClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize.at (u)));
645 
646  clientApps.Add (dlClient.Install (remoteHost));
647  clientApps.Add (ulClient.Install (ueNodes.Get (u)));
648  }
649 
650  serverApps.Start (Seconds (0.001));
651  clientApps.Start (Seconds (0.001));
652 
653  double statsStartTime = 0.001; // need to allow for RRC connection establishment + SRS
654  double statsDuration = 1.0;
655  double tolerance = 0.1;
656  Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.0001));
657 
658  lteHelper->EnableRlcTraces ();
659  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
660  rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
661  rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
662 
663 
664  Simulator::Run ();
665 
670  NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s)");
671  std::vector <uint64_t> dlDataRxed;
672  for (int i = 0; i < m_nUser; i++)
673  {
674  // get the imsi
675  uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
676  // get the lcId
677  uint8_t lcId = 4;
678  dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
679  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);
680  }
681 
682  for (int i = 0; i < m_nUser; i++)
683  {
684  NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataRxed.at (i) / statsDuration, m_estThrPssDl.at (i), m_estThrPssDl.at (i) * tolerance, " Unfair Throughput!");
685  }
686 
688 
689 }
690 
691 
692 } // namespace ns3
693 
694 
695 
696 
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
virtual void DoRun(void)
Implementation to actually run this test case.
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
Fast test.
Definition: test.h:843
holds a vector of ns3::NetDevice pointers
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.
virtual void DoRun(void)
Implementation to actually run this test case.
ApplicationContainer Install(NodeContainer c) const
Time MilliSeconds(uint64_t ms)
create ns3::Time instances in units of milliseconds.
Definition: nstime.h:601
std::string GetName(void) const
Definition: test.cc:241
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