A Discrete-Event Network Simulator
API
lte-test-fdtbfq-ff-mac-scheduler.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Marco Miozzo <marco.miozzo@cttc.es>,
18  * Nicola Baldo <nbaldo@cttc.es>
19  * Dizhi Zhou <dizhi.zhou@gmail.com>
20  */
21 
23 
24 #include "ns3/double.h"
25 #include "ns3/internet-module.h"
26 #include "ns3/ipv4-global-routing-helper.h"
27 #include "ns3/network-module.h"
28 #include "ns3/packet-sink-helper.h"
29 #include "ns3/point-to-point-epc-helper.h"
30 #include "ns3/point-to-point-helper.h"
31 #include "ns3/radio-bearer-stats-calculator.h"
32 #include "ns3/string.h"
33 #include "ns3/udp-client-server-helper.h"
34 #include <ns3/boolean.h>
35 #include <ns3/constant-position-mobility-model.h>
36 #include <ns3/enum.h>
37 #include <ns3/eps-bearer.h>
38 #include <ns3/ff-mac-scheduler.h>
39 #include <ns3/log.h>
40 #include <ns3/lte-enb-net-device.h>
41 #include <ns3/lte-enb-phy.h>
42 #include <ns3/lte-helper.h>
43 #include <ns3/lte-ue-net-device.h>
44 #include <ns3/lte-ue-phy.h>
45 #include <ns3/lte-ue-rrc.h>
46 #include <ns3/mobility-helper.h>
47 #include <ns3/net-device-container.h>
48 #include <ns3/node-container.h>
49 #include <ns3/object.h>
50 #include <ns3/packet.h>
51 #include <ns3/ptr.h>
52 #include <ns3/simulator.h>
53 #include <ns3/spectrum-error-model.h>
54 #include <ns3/spectrum-interference.h>
55 #include <ns3/test.h>
56 
57 #include <iostream>
58 #include <sstream>
59 #include <string>
60 
61 using namespace ns3;
62 
63 NS_LOG_COMPONENT_DEFINE("LenaTestFdTbfqFfMacScheduler");
64 
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) *
84  // 1000 byte/sec -> 232000 byte/rate
85  // Total bandwidth: 24 PRB at Itbs 26 -> 2196 -> 2196000 byte/sec
86  // 1 user -> 232000 * 1 = 232000 < 2196000 -> throughput = 232000 byte/sec
87  // 3 user -> 232000 * 3 = 696000 < 2196000 -> througphut = 232000 byte/sec
88  // 6 user -> 232000 * 6 = 139200 < 2196000 -> throughput = 232000 byte/sec
89  // 12 user -> 232000 * 12 = 2784000 > 2196000 -> throughput = 2196000 / 12 = 183000 byte/sec
90  // UPLINK -> DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.2 13)
91  // 1 user -> 25 PRB at Itbs 26 -> 2292 -> 2292000 > 232000 -> throughput = 232000 bytes/sec
92  // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 > 232000 -> throughput = 232000 bytes/sec
93  // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 > 232000 -> throughput = 232000 bytes/sec
94  // 12 users -> 2 PRB at Itbs 26 -> 185 -> 185000 < 232000 -> throughput = 185000 bytes/sec
95  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(1, 0, 232000, 232000, 200, 1, errorModel),
96  TestCase::EXTENSIVE);
97  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(3, 0, 232000, 232000, 200, 1, errorModel),
98  TestCase::EXTENSIVE);
99  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(6, 0, 232000, 232000, 200, 1, errorModel),
100  TestCase::EXTENSIVE);
101  // AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (12,0,183000,185000,200,1,errorModel));//
102  // simulation time = 1.5, otherwise, ul test will fail
103 
104  // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
105  // Traffic info
106  // UDP traffic: payload size = 200 bytes, interval = 1 ms
107  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
108  // byte/sec -> 232000 byte/rate
109  // Total bandwidth: 24 PRB at Itbs 20 -> 1383 -> 1383000 byte/sec
110  // 1 user -> 903000 * 1 = 232000 < 1383000 -> throughput = 232000 byte/sec
111  // 3 user -> 232000 * 3 = 696000 < 1383000 -> througphut = 232000 byte/sec
112  // 6 user -> 232000 * 6 = 139200 > 1383000 -> throughput = 1383000 / 6 = 230500 byte/sec
113  // 12 user -> 232000 * 12 = 2784000 > 1383000 -> throughput = 1383000 / 12 = 115250 byte/sec
114  // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
115  // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 > 232000 -> throughput = 232000 bytes/sec
116  // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 > 232000 -> throughput = 232000 bytes/sec
117  // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 < 232000 -> throughput = 125000 bytes/sec
118  // after the patch enforcing min 3 PRBs per UE:
119  // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 < 232000 -> throughput =
120  // 62000 bytes/sec
121  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(1, 4800, 232000, 232000, 200, 1, errorModel),
122  TestCase::EXTENSIVE);
123  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(3, 4800, 232000, 232000, 200, 1, errorModel),
124  TestCase::EXTENSIVE);
125  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(6, 4800, 230500, 125000, 200, 1, errorModel),
126  TestCase::EXTENSIVE);
127  // AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (12,4800,75250,62000,200,1,errorModel));
128  // // simulation time = 1.5, otherwise, ul test will fail
129 
130  // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
131  // Traffic info
132  // UDP traffic: payload size = 200 bytes, interval = 1 ms
133  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
134  // byte/sec -> 232000 byte/rate
135  // Total bandwidth: 24 PRB at Itbs 18 -> 1191 -> 1191000 byte/sec
136  // 1 user -> 903000 * 1 = 232000 < 1191000 -> throughput = 232000 byte/sec
137  // 3 user -> 232000 * 3 = 696000 < 1191000 -> througphut = 232000 byte/sec
138  // 6 user -> 232000 * 6 = 1392000 > 1191000 -> throughput = 1191000 / 6 = 198500 byte/sec
139  // 12 user -> 232000 * 12 = 2784000 > 1191000 -> throughput = 1191000 / 12 = 99250 byte/sec
140 
141  // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
142  // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 > 232000 -> throughput = 232000 bytes/sec
143  // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 < 232000 -> throughput = 201000 bytes/sec
144  // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 < 232000 -> throughput = 97000 bytes/sec
145  // after the patch enforcing min 3 PRBs per UE:
146  // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 < 232000 -> throughput =
147  // 48667 bytes/sec
148  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(1, 6000, 232000, 232000, 200, 1, errorModel),
149  TestCase::EXTENSIVE);
150  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(3, 6000, 232000, 201000, 200, 1, errorModel),
151  TestCase::EXTENSIVE);
152  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(6, 6000, 198500, 97000, 200, 1, errorModel),
153  TestCase::EXTENSIVE);
154  // AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1 (12,6000,99250,48667,200,1, errorModel));
155  // // simulation time = 1.5, otherwise, ul test will fail
156 
157  // DOWNLINK - DISTANCE 10000 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
158  // Traffic info
159  // UDP traffic: payload size = 200 bytes, interval = 1 ms
160  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
161  // byte/sec -> 232000 byte/rate
162  // Total bandwidth: 24 PRB at Itbs 13 -> 775 -> 775000 byte/sec
163  // 1 user -> 903000 * 1 = 232000 < 775000 -> throughput = 232000 byte/sec
164  // 3 user -> 232000 * 3 = 696000 < 775000 -> througphut = 232000 byte/sec
165  // 6 user -> 232000 * 6 = 139200 > 775000 -> throughput = 775000 / 6 = 129166 byte/sec
166  // 12 user -> 232000 * 12 = 2784000 > 775000 -> throughput = 775000 / 12 = 64583 byte/sec
167  // UPLINK - DISTANCE 10000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
168  // 1 user -> 24 PRB at Itbs 8 -> 437 -> 437000 > 232000 -> throughput = 232000 bytes/sec
169  // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 < 232000 -> throughput = 137000 bytes/sec
170  // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 < 232000 -> throughput = 67000 bytes/sec
171  // after the patch enforcing min 3 PRBs per UE:
172  // 12 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/12 UE/TTI -> 32667 < 232000 -> throughput = 32667
173  // bytes/sec
174  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(1, 10000, 232000, 232000, 200, 1, errorModel),
175  TestCase::EXTENSIVE);
176  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(3, 10000, 232000, 137000, 200, 1, errorModel),
177  TestCase::EXTENSIVE);
178  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(6, 10000, 129166, 67000, 200, 1, errorModel),
179  TestCase::EXTENSIVE);
180  // AddTestCase (new LenaFdTbfqFfMacSchedulerTestCase1
181  // (12,10000,64583,32667,200,1,errorModel));// simulation time = 1.5, otherwise, ul test will
182  // fail
183 
184  // DOWNLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
185  // UPLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
186  AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(1, 100000, 0, 0, 200, 1, errorModel),
187  TestCase::QUICK);
188 
189  // Test Case 2: homogeneous flow test in FDTBFQ (different distance)
190  // Traffic1 info
191  // UDP traffic: payload size = 100 bytes, interval = 1 ms
192  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
193  // byte/sec -> 132000 byte/rate
194  // Maximum throughput = 4 / ( 1/2196000 + 1/1191000 + 1/1383000 + 1/775000 ) = 1209046 byte/s
195  // 132000 * 4 = 528000 < 1209046 -> estimated throughput in downlink = 132000 byte/sec
196  std::vector<double> dist1;
197  dist1.push_back(0); // User 0 distance --> MCS 28
198  dist1.push_back(4800); // User 1 distance --> MCS 22
199  dist1.push_back(6000); // User 2 distance --> MCS 20
200  dist1.push_back(10000); // User 3 distance --> MCS 14
201  std::vector<uint16_t> packetSize1;
202  packetSize1.push_back(100);
203  packetSize1.push_back(100);
204  packetSize1.push_back(100);
205  packetSize1.push_back(100);
206  std::vector<uint32_t> estThrFdTbfqDl1;
207  estThrFdTbfqDl1.push_back(132000); // User 0 estimated TTI throughput from FDTBFQ
208  estThrFdTbfqDl1.push_back(132000); // User 1 estimated TTI throughput from FDTBFQ
209  estThrFdTbfqDl1.push_back(132000); // User 2 estimated TTI throughput from FDTBFQ
210  estThrFdTbfqDl1.push_back(132000); // User 3 estimated TTI throughput from FDTBFQ
211  AddTestCase(
212  new LenaFdTbfqFfMacSchedulerTestCase2(dist1, estThrFdTbfqDl1, packetSize1, 1, errorModel),
213  TestCase::EXTENSIVE);
214 
215  // Traffic2 info
216  // UDP traffic: payload size = 300 bytes, interval = 1 ms
217  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
218  // byte/sec -> 332000 byte/rate
219  // Maximum throughput = 4 / ( 1/2196000 + 1/1191000 + 1/1383000 + 1/775000 ) = 1209046 byte/s
220  // 232000 * 4 = 1328000 > 1209046 -> estimated throughput in downlink = 1209046 / 4 = 302266
221  // byte/sec
222  std::vector<double> dist2;
223  dist2.push_back(0); // User 0 distance --> MCS 28
224  dist2.push_back(4800); // User 1 distance --> MCS 22
225  dist2.push_back(6000); // User 2 distance --> MCS 20
226  dist2.push_back(10000); // User 3 distance --> MCS 14
227  std::vector<uint16_t> packetSize2;
228  packetSize2.push_back(300);
229  packetSize2.push_back(300);
230  packetSize2.push_back(300);
231  packetSize2.push_back(300);
232  std::vector<uint32_t> estThrFdTbfqDl2;
233  estThrFdTbfqDl2.push_back(302266); // User 0 estimated TTI throughput from FDTBFQ
234  estThrFdTbfqDl2.push_back(302266); // User 1 estimated TTI throughput from FDTBFQ
235  estThrFdTbfqDl2.push_back(302266); // User 2 estimated TTI throughput from FDTBFQ
236  estThrFdTbfqDl2.push_back(302266); // User 3 estimated TTI throughput from FDTBFQ
237  AddTestCase(
238  new LenaFdTbfqFfMacSchedulerTestCase2(dist2, estThrFdTbfqDl2, packetSize2, 1, errorModel),
239  TestCase::EXTENSIVE);
240 
241  // Test Case 3: heterogeneous flow test in FDTBFQ
242  // UDP traffic: payload size = [100,200,300] bytes, interval = 1 ms
243  // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
244  // byte/sec -> [132000, 232000, 332000] byte/rate
245  // Maximum throughput = 3 / ( 1/2196000 + 1/1191000 + 1/1383000) = 1486569 byte/s
246  // 132000 + 232000 + 332000 = 696000 < 1486569 -> estimated throughput in downlink = [132000,
247  // 232000, 332000] byte/sec
248  std::vector<double> dist3;
249  dist3.push_back(0); // User 0 distance --> MCS 28
250  dist3.push_back(4800); // User 1 distance --> MCS 22
251  dist3.push_back(6000); // User 2 distance --> MCS 20
252  std::vector<uint16_t> packetSize3;
253  packetSize3.push_back(100);
254  packetSize3.push_back(200);
255  packetSize3.push_back(300);
256  std::vector<uint32_t> estThrFdTbfqDl3;
257  estThrFdTbfqDl3.push_back(132000); // User 0 estimated TTI throughput from FDTBFQ
258  estThrFdTbfqDl3.push_back(232000); // User 1 estimated TTI throughput from FDTBFQ
259  estThrFdTbfqDl3.push_back(332000); // User 2 estimated TTI throughput from FDTBFQ
260  AddTestCase(
261  new LenaFdTbfqFfMacSchedulerTestCase2(dist3, estThrFdTbfqDl3, packetSize3, 1, errorModel),
262  TestCase::QUICK);
263 }
264 
270 
271 // --------------- T E S T - C A S E # 1 ------------------------------
272 
273 std::string
275 {
276  std::ostringstream oss;
277  oss << nUser << " UEs, distance " << dist << " m";
278  return oss.str();
279 }
280 
282  double dist,
283  double thrRefDl,
284  double thrRefUl,
285  uint16_t packetSize,
286  uint16_t interval,
287  bool errorModelEnabled)
288  : TestCase(BuildNameString(nUser, dist)),
289  m_nUser(nUser),
290  m_dist(dist),
291  m_packetSize(packetSize),
292  m_interval(interval),
293  m_thrRefDl(thrRefDl),
294  m_thrRefUl(thrRefUl),
295  m_errorModelEnabled(errorModelEnabled)
296 {
297 }
298 
300 {
301 }
302 
303 void
305 {
306  NS_LOG_FUNCTION(this << GetName());
307 
308  if (!m_errorModelEnabled)
309  {
310  Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
311  Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
312  }
313 
314  Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
315  Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
316  StringValue(CreateTempDirFilename("DlMacStats.txt")));
317  Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
318  StringValue(CreateTempDirFilename("UlMacStats.txt")));
319  Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
320  StringValue(CreateTempDirFilename("DlRlcStats.txt")));
321  Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
322  StringValue(CreateTempDirFilename("UlRlcStats.txt")));
323 
324  Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
325  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper>();
326  lteHelper->SetEpcHelper(epcHelper);
327 
328  // LogComponentEnable ("FdTbfqFfMacScheduler", LOG_DEBUG);
329 
330  Ptr<Node> pgw = epcHelper->GetPgwNode();
331 
332  // Create a single RemoteHost
333  NodeContainer remoteHostContainer;
334  remoteHostContainer.Create(1);
335  Ptr<Node> remoteHost = remoteHostContainer.Get(0);
337  internet.Install(remoteHostContainer);
338 
339  // Create the Internet
340  PointToPointHelper p2ph;
341  p2ph.SetDeviceAttribute("DataRate", DataRateValue(DataRate("100Gb/s")));
342  p2ph.SetDeviceAttribute("Mtu", UintegerValue(1500));
343  p2ph.SetChannelAttribute("Delay", TimeValue(Seconds(0.001)));
344  NetDeviceContainer internetDevices = p2ph.Install(pgw, remoteHost);
345  Ipv4AddressHelper ipv4h;
346  ipv4h.SetBase("1.0.0.0", "255.0.0.0");
347  Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign(internetDevices);
348  // interface 0 is localhost, 1 is the p2p device
349  Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress(1);
350 
351  Ipv4StaticRoutingHelper ipv4RoutingHelper;
352  Ptr<Ipv4StaticRouting> remoteHostStaticRouting =
353  ipv4RoutingHelper.GetStaticRouting(remoteHost->GetObject<Ipv4>());
354  remoteHostStaticRouting->AddNetworkRouteTo(Ipv4Address("7.0.0.0"), Ipv4Mask("255.0.0.0"), 1);
355 
356  // Config::SetDefault ("ns3::LteAmc::AmcModel", EnumValue (LteAmc::PiroEW2010));
357  // Config::SetDefault ("ns3::LteAmc::Ber", DoubleValue (0.00005));
358  // Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
359  // Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
360 
361  // Config::SetDefault ("ns3::LteEnbRrc::EpsBearerToRlcMapping", EnumValue
362  // (LteHelper::RLC_UM_ALWAYS));
363 
364  // LogComponentDisableAll (LOG_LEVEL_ALL);
365  // LogComponentEnable ("LenaTestFdTbfqFfMacScheduler", LOG_LEVEL_ALL);
366 
367  lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
368 
369  // Create Nodes: eNodeB and UE
370  NodeContainer enbNodes;
371  NodeContainer ueNodes;
372  enbNodes.Create(1);
373  ueNodes.Create(m_nUser);
374 
375  // Install Mobility Model
377  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
378  mobility.Install(enbNodes);
379  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
380  mobility.Install(ueNodes);
381 
382  // Create Devices and install them in the Nodes (eNB and UE)
383  NetDeviceContainer enbDevs;
384  NetDeviceContainer ueDevs;
385  lteHelper->SetSchedulerType("ns3::FdTbfqFfMacScheduler");
386  lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
387  enbDevs = lteHelper->InstallEnbDevice(enbNodes);
388  ueDevs = lteHelper->InstallUeDevice(ueNodes);
389 
390  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
391  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
392  enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
393  enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
394 
395  // Set UEs' position and power
396  for (int i = 0; i < m_nUser; i++)
397  {
400  mm->SetPosition(Vector(m_dist, 0.0, 0.0));
401  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
402  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
403  uePhy->SetAttribute("TxPower", DoubleValue(23.0));
404  uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
405  }
406 
407  // Install the IP stack on the UEs
408  internet.Install(ueNodes);
409  Ipv4InterfaceContainer ueIpIface;
410  ueIpIface = epcHelper->AssignUeIpv4Address(NetDeviceContainer(ueDevs));
411 
412  // Assign IP address to UEs
413  for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
414  {
415  Ptr<Node> ueNode = ueNodes.Get(u);
416  // Set the default gateway for the UE
417  Ptr<Ipv4StaticRouting> ueStaticRouting =
418  ipv4RoutingHelper.GetStaticRouting(ueNode->GetObject<Ipv4>());
419  ueStaticRouting->SetDefaultRoute(epcHelper->GetUeDefaultGatewayAddress(), 1);
420  }
421 
422  // Attach a UE to a eNB
423  lteHelper->Attach(ueDevs, enbDevs.Get(0));
424 
425  // Activate an EPS bearer on all UEs
426  for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
427  {
428  Ptr<NetDevice> ueDevice = ueDevs.Get(u);
429  GbrQosInformation qos;
430  qos.gbrDl = (m_packetSize + 32) * (1000 / m_interval) *
431  8; // bit/s, considering IP, UDP, RLC, PDCP header size
432  qos.gbrUl = 0;
433  qos.mbrDl = qos.gbrDl;
434  qos.mbrUl = 0;
435 
436  EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
437  EpsBearer bearer(q, qos);
438  lteHelper->ActivateDedicatedEpsBearer(ueDevice, bearer, EpcTft::Default());
439  }
440 
441  // Install downlink and uplink applications
442  uint16_t dlPort = 1234;
443  uint16_t ulPort = 2000;
444  PacketSinkHelper dlPacketSinkHelper("ns3::UdpSocketFactory",
445  InetSocketAddress(Ipv4Address::GetAny(), dlPort));
448 
449  for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
450  {
451  ++ulPort;
452  PacketSinkHelper ulPacketSinkHelper("ns3::UdpSocketFactory",
453  InetSocketAddress(Ipv4Address::GetAny(), ulPort));
454  serverApps.Add(ulPacketSinkHelper.Install(remoteHost)); // receive packets from UEs
455 
456  serverApps.Add(
457  dlPacketSinkHelper.Install(ueNodes.Get(u))); // receive packets from remotehost
458 
459  UdpClientHelper dlClient(ueIpIface.GetAddress(u), dlPort); // uplink packets generator
460  dlClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
461  dlClient.SetAttribute("MaxPackets", UintegerValue(1000000));
462  dlClient.SetAttribute("PacketSize", UintegerValue(m_packetSize));
463 
464  UdpClientHelper ulClient(remoteHostAddr, ulPort); // downlink packets generator
465  ulClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
466  ulClient.SetAttribute("MaxPackets", UintegerValue(1000000));
467  ulClient.SetAttribute("PacketSize", UintegerValue(m_packetSize));
468 
469  clientApps.Add(dlClient.Install(remoteHost));
470  clientApps.Add(ulClient.Install(ueNodes.Get(u)));
471  }
472 
473  serverApps.Start(Seconds(0.001));
474  clientApps.Start(Seconds(0.04));
475 
476  double statsStartTime = 0.04; // need to allow for RRC connection establishment + SRS
477  double statsDuration = 1;
478  double tolerance = 0.1;
479  Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.0001));
480 
481  lteHelper->EnableRlcTraces();
482  lteHelper->EnableMacTraces();
483  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
484  rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
485  rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
486 
487  Simulator::Run();
488 
493  NS_LOG_INFO("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
494  std::vector<uint64_t> dlDataRxed;
495  for (int i = 0; i < m_nUser; i++)
496  {
497  // get the imsi
498  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
499  // get the lcId
500  uint8_t lcId = 4;
501  uint64_t data = rlcStats->GetDlRxData(imsi, lcId);
502  dlDataRxed.push_back(data);
503  NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at(i)
504  << " thr " << (double)dlDataRxed.at(i) / statsDuration << " ref "
505  << m_thrRefDl);
506  }
507 
508  for (int i = 0; i < m_nUser; i++)
509  {
510  NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
511  m_thrRefDl,
512  m_thrRefDl * tolerance,
513  " Unfair Throughput!");
514  }
515 
520  NS_LOG_INFO("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
521  std::vector<uint64_t> ulDataRxed;
522  for (int i = 0; i < m_nUser; i++)
523  {
524  // get the imsi
525  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
526  // get the lcId
527  uint8_t lcId = 4;
528  ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
529  NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)ulDataRxed.at(i)
530  << " thr " << (double)ulDataRxed.at(i) / statsDuration << " ref "
531  << m_thrRefUl);
532  }
533 
534  for (int i = 0; i < m_nUser; i++)
535  {
536  NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
537  m_thrRefUl,
538  m_thrRefUl * tolerance,
539  " Unfair Throughput!");
540  }
541  Simulator::Destroy();
542 }
543 
544 // --------------- T E S T - C A S E # 2 ------------------------------
545 
546 std::string
547 LenaFdTbfqFfMacSchedulerTestCase2::BuildNameString(uint16_t nUser, std::vector<double> dist)
548 {
549  std::ostringstream oss;
550  oss << "distances (m) = [ ";
551  for (auto it = dist.begin(); it != dist.end(); ++it)
552  {
553  oss << *it << " ";
554  }
555  oss << "]";
556  return oss.str();
557 }
558 
560  std::vector<double> dist,
561  std::vector<uint32_t> estThrFdTbfqDl,
562  std::vector<uint16_t> packetSize,
563  uint16_t interval,
564  bool errorModelEnabled)
565  : TestCase(BuildNameString(dist.size(), dist)),
566  m_nUser(dist.size()),
567  m_dist(dist),
568  m_packetSize(packetSize),
569  m_interval(interval),
570  m_estThrFdTbfqDl(estThrFdTbfqDl),
571  m_errorModelEnabled(errorModelEnabled)
572 {
573 }
574 
576 {
577 }
578 
579 void
581 {
582  if (!m_errorModelEnabled)
583  {
584  Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
585  Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
586  }
587 
588  Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
589  Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
590  StringValue(CreateTempDirFilename("DlMacStats.txt")));
591  Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
592  StringValue(CreateTempDirFilename("UlMacStats.txt")));
593  Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
594  StringValue(CreateTempDirFilename("DlRlcStats.txt")));
595  Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
596  StringValue(CreateTempDirFilename("UlRlcStats.txt")));
597 
598  Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
599  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper>();
600  lteHelper->SetEpcHelper(epcHelper);
601 
602  Ptr<Node> pgw = epcHelper->GetPgwNode();
603 
604  // Create a single RemoteHost
605  NodeContainer remoteHostContainer;
606  remoteHostContainer.Create(1);
607  Ptr<Node> remoteHost = remoteHostContainer.Get(0);
609  internet.Install(remoteHostContainer);
610 
611  // Create the Internet
612  PointToPointHelper p2ph;
613  p2ph.SetDeviceAttribute("DataRate", DataRateValue(DataRate("100Gb/s")));
614  p2ph.SetDeviceAttribute("Mtu", UintegerValue(1500));
615  p2ph.SetChannelAttribute("Delay", TimeValue(Seconds(0.001)));
616  NetDeviceContainer internetDevices = p2ph.Install(pgw, remoteHost);
617  Ipv4AddressHelper ipv4h;
618  ipv4h.SetBase("1.0.0.0", "255.0.0.0");
619  Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign(internetDevices);
620  // interface 0 is localhost, 1 is the p2p device
621  Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress(1);
622 
623  Ipv4StaticRoutingHelper ipv4RoutingHelper;
624  Ptr<Ipv4StaticRouting> remoteHostStaticRouting =
625  ipv4RoutingHelper.GetStaticRouting(remoteHost->GetObject<Ipv4>());
626  remoteHostStaticRouting->AddNetworkRouteTo(Ipv4Address("7.0.0.0"), Ipv4Mask("255.0.0.0"), 1);
627 
628  // LogComponentDisableAll (LOG_LEVEL_ALL);
629  // LogComponentEnable ("LenaTestFdTbfqFfMacScheduler", LOG_LEVEL_ALL);
630 
631  lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
632 
633  // Create Nodes: eNodeB and UE
634  NodeContainer enbNodes;
635  NodeContainer ueNodes;
636  enbNodes.Create(1);
637  ueNodes.Create(m_nUser);
638 
639  // Install Mobility Model
641  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
642  mobility.Install(enbNodes);
643  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
644  mobility.Install(ueNodes);
645 
646  // Create Devices and install them in the Nodes (eNB and UE)
647  NetDeviceContainer enbDevs;
648  NetDeviceContainer ueDevs;
649  lteHelper->SetSchedulerType("ns3::FdTbfqFfMacScheduler");
650  lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
651  enbDevs = lteHelper->InstallEnbDevice(enbNodes);
652  ueDevs = lteHelper->InstallUeDevice(ueNodes);
653 
654  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
655  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
656  enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
657  enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
658 
659  // Set UEs' position and power
660  for (int i = 0; i < m_nUser; i++)
661  {
664  mm->SetPosition(Vector(m_dist.at(i), 0.0, 0.0));
665  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
666  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
667  uePhy->SetAttribute("TxPower", DoubleValue(23.0));
668  uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
669  }
670 
671  // Install the IP stack on the UEs
672  internet.Install(ueNodes);
673  Ipv4InterfaceContainer ueIpIface;
674  ueIpIface = epcHelper->AssignUeIpv4Address(NetDeviceContainer(ueDevs));
675 
676  // Assign IP address to UEs
677  for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
678  {
679  Ptr<Node> ueNode = ueNodes.Get(u);
680  // Set the default gateway for the UE
681  Ptr<Ipv4StaticRouting> ueStaticRouting =
682  ipv4RoutingHelper.GetStaticRouting(ueNode->GetObject<Ipv4>());
683  ueStaticRouting->SetDefaultRoute(epcHelper->GetUeDefaultGatewayAddress(), 1);
684  }
685 
686  // Attach a UE to a eNB
687  lteHelper->Attach(ueDevs, enbDevs.Get(0));
688 
689  // Activate an EPS bearer on all UEs
690 
691  uint16_t mbrDl = 0;
692  for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
693  {
694  mbrDl = mbrDl + m_packetSize.at(u);
695  }
696  mbrDl = mbrDl / ueNodes.GetN();
697 
698  for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
699  {
700  Ptr<NetDevice> ueDevice = ueDevs.Get(u);
701  GbrQosInformation qos;
702  qos.gbrDl = (mbrDl + 32) * (1000 / m_interval) *
703  8; // bit/s, considering IP, UDP, RLC, PDCP header size
704  qos.gbrUl = 0;
705  qos.mbrDl = qos.gbrDl;
706  qos.mbrUl = 0;
707 
708  EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
709  EpsBearer bearer(q, qos);
710  lteHelper->ActivateDedicatedEpsBearer(ueDevice, bearer, EpcTft::Default());
711  }
712 
713  // Install downlink and uplink applications
714  uint16_t dlPort = 1234;
715  uint16_t ulPort = 2000;
716  PacketSinkHelper dlPacketSinkHelper("ns3::UdpSocketFactory",
717  InetSocketAddress(Ipv4Address::GetAny(), dlPort));
720 
721  for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
722  {
723  ++ulPort;
724  PacketSinkHelper ulPacketSinkHelper("ns3::UdpSocketFactory",
725  InetSocketAddress(Ipv4Address::GetAny(), ulPort));
726  serverApps.Add(ulPacketSinkHelper.Install(remoteHost)); // receive packets from UEs
727  serverApps.Add(
728  dlPacketSinkHelper.Install(ueNodes.Get(u))); // receive packets from remotehost
729 
730  UdpClientHelper dlClient(ueIpIface.GetAddress(u), dlPort); // uplink packets generator
731  dlClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
732  dlClient.SetAttribute("MaxPackets", UintegerValue(1000000));
733  dlClient.SetAttribute("PacketSize", UintegerValue(m_packetSize.at(u)));
734 
735  UdpClientHelper ulClient(remoteHostAddr, ulPort); // downlink packets generator
736  ulClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
737  ulClient.SetAttribute("MaxPackets", UintegerValue(1000000));
738  ulClient.SetAttribute("PacketSize", UintegerValue(m_packetSize.at(u)));
739 
740  clientApps.Add(dlClient.Install(remoteHost));
741  clientApps.Add(ulClient.Install(ueNodes.Get(u)));
742  }
743 
744  serverApps.Start(Seconds(0.001));
745  clientApps.Start(Seconds(0.001));
746 
747  double statsStartTime = 0.001; // need to allow for RRC connection establishment + SRS
748  double statsDuration = 1.0;
749  double tolerance = 0.1;
750  Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.0001));
751 
752  lteHelper->EnableRlcTraces();
753  Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
754  rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
755  rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
756 
757  Simulator::Run();
758 
763  NS_LOG_INFO("DL - Test with " << m_nUser << " user(s)");
764  std::vector<uint64_t> dlDataRxed;
765  for (int i = 0; i < m_nUser; i++)
766  {
767  // get the imsi
768  uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
769  // get the lcId
770  uint8_t lcId = 4;
771  dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
772  NS_LOG_INFO("\tUser " << i << " dist " << m_dist.at(i) << " imsi " << imsi << " bytes rxed "
773  << (double)dlDataRxed.at(i) << " thr "
774  << (double)dlDataRxed.at(i) / statsDuration << " ref " << m_nUser);
775  }
776 
777  for (int i = 0; i < m_nUser; i++)
778  {
779  NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
780  m_estThrFdTbfqDl.at(i),
781  m_estThrFdTbfqDl.at(i) * tolerance,
782  " Unfair Throughput!");
783  }
784 
785  Simulator::Destroy();
786 }
This system test program creates different test cases with a single eNB and several UEs,...
static std::string BuildNameString(uint16_t nUser, double dist)
Builds the test name string based on provided parameter values.
LenaFdTbfqFfMacSchedulerTestCase1(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, uint16_t packetSize, uint16_t interval, bool errorModelEnabled)
Constructor.
void DoRun() override
Implementation to actually run this TestCase.
bool m_errorModelEnabled
whether the error model is enabled
Test case is similar to the one defined in LenaFdTbfqFfMacSchedulerTestCase1, with the difference tha...
void DoRun() override
Implementation to actually run this TestCase.
std::vector< uint32_t > m_estThrFdTbfqDl
estimated thrpughput FDTBFQ DL
static std::string BuildNameString(uint16_t nUser, std::vector< double > dist)
Builds the test name string based on provided parameter values.
std::vector< double > m_dist
distance between the nodes
std::vector< uint16_t > m_packetSize
packet size in bytes
LenaFdTbfqFfMacSchedulerTestCase2(std::vector< double > dist, std::vector< uint32_t > estThrFdTbfqDl, std::vector< uint16_t > packetSize, uint16_t interval, bool errorModelEnabled)
Constructor.
Test suit for FdTbfqFfMacScheduler test.
holds a vector of ns3::Application pointers.
Mobility model for which the current position does not change once it has been set and until it is se...
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:42
Hold variables of type enum.
Definition: enum.h:62
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:91
Qci
QoS Class Indicator.
Definition: eps-bearer.h:106
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:42
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:80
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:257
Helper class that adds ns3::Ipv4StaticRouting objects.
Ptr< Ipv4StaticRouting > GetStaticRouting(Ptr< Ipv4 > ipv4) const
Try and find the static routing protocol as either the main routing protocol or in the list of routin...
The eNodeB device implementation.
Ptr< LteEnbPhy > GetPhy() const
void SetEpcHelper(Ptr< EpcHelper > h)
Set the EpcHelper to be used to setup the EPC network in conjunction with the setup of the LTE radio ...
Definition: lte-helper.cc:285
Ptr< RadioBearerStatsCalculator > GetRlcStats()
Definition: lte-helper.cc:1701
void SetSchedulerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the scheduler to be created.
Definition: lte-helper.cc:306
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:485
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:292
void Attach(NetDeviceContainer ueDevices)
Enables automatic attachment of a set of UE devices to a suitable cell using Idle mode initial cell s...
Definition: lte-helper.cc:1039
void EnableRlcTraces()
Enable trace sinks for RLC layer.
Definition: lte-helper.cc:1558
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:500
void EnableMacTraces()
Enable trace sinks for MAC layer.
Definition: lte-helper.cc:1659
uint8_t ActivateDedicatedEpsBearer(NetDeviceContainer ueDevices, EpsBearer bearer, Ptr< EpcTft > tft)
Activate a dedicated EPS bearer on a given set of UE devices.
Definition: lte-helper.cc:1154
The LteUeNetDevice class implements the UE net device.
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
Ptr< Node > GetPgwNode() const override
Get the PGW node.
Ipv4Address GetUeDefaultGatewayAddress() override
Ipv4InterfaceContainer AssignUeIpv4Address(NetDeviceContainer ueDevices) override
Assign IPv4 addresses to UE devices.
keep track of a set of node pointers.
uint32_t GetN() const
Get the number of Ptr<Node> stored in this container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:204
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::PacketSinkApplication on each node of the input container configured with all the att...
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
NetDeviceContainer Install(NodeContainer c)
Hold variables of type string.
Definition: string.h:56
encapsulates test code
Definition: test.h:1060
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:438
std::string GetName() const
Definition: test.cc:373
A suite of tests to run.
Definition: test.h:1256
Create a client application which sends UDP packets carrying a 32bit sequence number and a 64 bit tim...
void SetAttribute(std::string name, const AttributeValue &value)
Record an attribute to be set in each Application after it is is created.
ApplicationContainer Install(NodeContainer c)
Hold an unsigned integer type.
Definition: uinteger.h:45
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:890
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:275
static LenaTestFdTbfqFfMacSchedulerSuite lenaTestFdTbfqFfMacSchedulerSuite
Static variable for test initialization.
void(* DataRate)(DataRate oldValue, DataRate newValue)
TracedValue callback signature for DataRate.
Definition: data-rate.h:327
#define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report and...
Definition: test.h:337
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1326
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1338
serverApps
Definition: first.py:54
clientApps
Definition: first.py:64
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mobility
Definition: third.py:105
uint8_t data[writeSize]
3GPP TS 36.413 9.2.1.18 GBR QoS Information
Definition: eps-bearer.h:36
uint64_t gbrDl
Guaranteed Bit Rate (bit/s) in downlink.
Definition: eps-bearer.h:42
uint64_t gbrUl
Guaranteed Bit Rate (bit/s) in uplink.
Definition: eps-bearer.h:43
uint64_t mbrDl
Maximum Bit Rate (bit/s) in downlink.
Definition: eps-bearer.h:44
uint64_t mbrUl
Maximum Bit Rate (bit/s) in uplink.
Definition: eps-bearer.h:45
static const uint32_t packetSize
Packet size generated at the AP.