A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
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
61using namespace ns3;
62
63NS_LOG_COMPONENT_DEFINE("LenaTestFdTbfqFfMacScheduler");
64
66 : TestSuite("lte-fdtbfq-ff-mac-scheduler", Type::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::Duration::EXTENSIVE);
97 AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(3, 0, 232000, 232000, 200, 1, errorModel),
98 TestCase::Duration::EXTENSIVE);
99 AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(6, 0, 232000, 232000, 200, 1, errorModel),
100 TestCase::Duration::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::Duration::EXTENSIVE);
123 AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(3, 4800, 232000, 232000, 200, 1, errorModel),
124 TestCase::Duration::EXTENSIVE);
125 AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(6, 4800, 230500, 125000, 200, 1, errorModel),
126 TestCase::Duration::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::Duration::EXTENSIVE);
150 AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(3, 6000, 232000, 201000, 200, 1, errorModel),
151 TestCase::Duration::EXTENSIVE);
152 AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(6, 6000, 198500, 97000, 200, 1, errorModel),
153 TestCase::Duration::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::Duration::EXTENSIVE);
176 AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(3, 10000, 232000, 137000, 200, 1, errorModel),
177 TestCase::Duration::EXTENSIVE);
178 AddTestCase(new LenaFdTbfqFfMacSchedulerTestCase1(6, 10000, 129166, 67000, 200, 1, errorModel),
179 TestCase::Duration::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::Duration::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
212 new LenaFdTbfqFfMacSchedulerTestCase2(dist1, estThrFdTbfqDl1, packetSize1, 1, errorModel),
213 TestCase::Duration::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
238 new LenaFdTbfqFfMacSchedulerTestCase2(dist2, estThrFdTbfqDl2, packetSize2, 1, errorModel),
239 TestCase::Duration::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
261 new LenaFdTbfqFfMacSchedulerTestCase2(dist3, estThrFdTbfqDl3, packetSize3, 1, errorModel),
262 TestCase::Duration::QUICK);
263}
264
270
271// --------------- T E S T - C A S E # 1 ------------------------------
272
273std::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
303void
305{
306 NS_LOG_FUNCTION(this << GetName());
307
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);
336 InternetStackHelper internet;
337 internet.Install(remoteHostContainer);
338
339 // Create the Internet
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
376 MobilityHelper mobility;
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);
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
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",
446 ApplicationContainer clientApps;
447 ApplicationContainer serverApps;
448
449 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
450 {
451 ++ulPort;
452 PacketSinkHelper ulPacketSinkHelper("ns3::UdpSocketFactory",
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
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,
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,
538 m_thrRefUl * tolerance,
539 " Unfair Throughput!");
540 }
542}
543
544// --------------- T E S T - C A S E # 2 ------------------------------
545
546std::string
547LenaFdTbfqFfMacSchedulerTestCase2::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
579void
581{
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);
608 InternetStackHelper internet;
609 internet.Install(remoteHostContainer);
610
611 // Create the Internet
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
640 MobilityHelper mobility;
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);
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
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",
718 ApplicationContainer clientApps;
719 ApplicationContainer serverApps;
720
721 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
722 {
723 ++ulPort;
724 PacketSinkHelper ulPacketSinkHelper("ns3::UdpSocketFactory",
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
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
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.
ApplicationContainer Install(NodeContainer c)
Install an application on each node of the input container configured with all the attributes set wit...
void SetAttribute(const std::string &name, const AttributeValue &value)
Helper function used to set the underlying application attributes.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Mobility model for which the current position does not change once it has been set and until it is se...
Class for representing data rates.
Definition: data-rate.h:89
AttributeValue implementation for DataRate.
Definition: data-rate.h:296
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
static Ptr< EpcTft > Default()
creates a TFT matching any traffic
Definition: epc-tft.cc:229
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:91
Qci
QoS Class Indicator.
Definition: eps-bearer.h:106
@ GBR_CONV_VOICE
GBR Conversational Voice.
Definition: eps-bearer.h:107
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
static Ipv4Address GetAny()
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.
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.
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.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:522
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)
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)
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:142
static void Run()
Run the simulation.
Definition: simulator.cc:178
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:186
Hold variables of type string.
Definition: string.h:56
encapsulates test code
Definition: test.h:1061
void AddTestCase(TestCase *testCase, Duration duration=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:1268
Type
Type of test.
Definition: test.h:1275
AttributeValue implementation for Time.
Definition: nstime.h:1413
Create a client application which sends UDP packets carrying a 32bit sequence number and a 64 bit tim...
Hold an unsigned integer type.
Definition: uinteger.h:45
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:894
#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.
#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:338
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
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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.