A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
lte-test-pss-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("LenaTestPssFfMacScheduler");
64
66 : TestSuite("lte-pss-ff-mac-scheduler", Type::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) *
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 LenaPssFfMacSchedulerTestCase1(1, 0, 232000, 232000, 200, 1, errorModel),
96 TestCase::Duration::EXTENSIVE);
97 AddTestCase(new LenaPssFfMacSchedulerTestCase1(3, 0, 232000, 232000, 200, 1, errorModel),
98 TestCase::Duration::EXTENSIVE);
99 AddTestCase(new LenaPssFfMacSchedulerTestCase1(6, 0, 232000, 232000, 200, 1, errorModel),
100 TestCase::Duration::EXTENSIVE);
101
102 // AddTestCase (new LenaPssFfMacSchedulerTestCase1 (12,0,183000,185000,200,1,errorModel));//
103 // simulation time = 1.5, otherwise, ul test will fail
104
105 // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
106 // Traffic info
107 // UDP traffic: payload size = 200 bytes, interval = 1 ms
108 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
109 // byte/sec -> 232000 byte/rate
110 // Total bandwidth: 24 PRB at Itbs 20 -> 1383 -> 1383000 byte/sec
111 // 1 user -> 903000 * 1 = 232000 < 1383000 -> throughput = 232000 byte/sec
112 // 3 user -> 232000 * 3 = 696000 < 1383000 -> througphut = 232000 byte/sec
113 // 6 user -> 232000 * 6 = 139200 > 1383000 -> throughput = 1383000 / 6 = 230500 byte/sec
114 // 12 user -> 232000 * 12 = 2784000 > 1383000 -> throughput = 1383000 / 12 = 115250 byte/sec
115 // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
116 // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 > 232000 -> throughput = 232000 bytes/sec
117 // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 > 232000 -> throughput = 232000 bytes/sec
118 // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 < 232000 -> throughput = 125000 bytes/sec
119 // after the patch enforcing min 3 PRBs per UE:
120 // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 < 232000 -> throughput =
121 // 62000 bytes/sec
122 AddTestCase(new LenaPssFfMacSchedulerTestCase1(1, 4800, 232000, 232000, 200, 1, errorModel),
123 TestCase::Duration::EXTENSIVE);
124 AddTestCase(new LenaPssFfMacSchedulerTestCase1(3, 4800, 232000, 232000, 200, 1, errorModel),
125 TestCase::Duration::EXTENSIVE);
126 AddTestCase(new LenaPssFfMacSchedulerTestCase1(6, 4800, 230500, 125000, 200, 1, errorModel),
127 TestCase::Duration::EXTENSIVE);
128 // AddTestCase (new LenaPssFfMacSchedulerTestCase1 (12,4800,115250,62000,200,1,errorModel)); //
129 // simulation time = 1.5, otherwise, ul test will fail
130
131 // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
132 // Traffic info
133 // UDP traffic: payload size = 200 bytes, interval = 1 ms
134 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
135 // byte/sec -> 232000 byte/rate
136 // Total bandwidth: 24 PRB at Itbs 18 -> 1191 -> 1191000 byte/sec
137 // 1 user -> 903000 * 1 = 232000 < 1191000 -> throughput = 232000 byte/sec
138 // 3 user -> 232000 * 3 = 696000 < 1191000 -> througphut = 232000 byte/sec
139 // 6 user -> 232000 * 6 = 1392000 > 1191000 -> throughput = 1191000 / 6 = 198500 byte/sec
140 // 12 user -> 232000 * 12 = 2784000 > 1191000 -> throughput = 1191000 / 12 = 99250 byte/sec
141
142 // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
143 // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 > 232000 -> throughput = 232000 bytes/sec
144 // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 < 232000 -> throughput = 201000 bytes/sec
145 // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 < 232000 -> throughput = 97000 bytes/sec
146 // after the patch enforcing min 3 PRBs per UE:
147 // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 < 232000 -> throughput =
148 // 48667 bytes/sec
149 AddTestCase(new LenaPssFfMacSchedulerTestCase1(1, 6000, 232000, 232000, 200, 1, errorModel),
150 TestCase::Duration::EXTENSIVE);
151 AddTestCase(new LenaPssFfMacSchedulerTestCase1(3, 6000, 232000, 201000, 200, 1, errorModel),
152 TestCase::Duration::EXTENSIVE);
153 AddTestCase(new LenaPssFfMacSchedulerTestCase1(6, 6000, 198500, 97000, 200, 1, errorModel),
154 TestCase::Duration::EXTENSIVE);
155 // AddTestCase (new LenaPssFfMacSchedulerTestCase1 (12,6000,99250,48667,200,1, errorModel)); //
156 // simulation time = 1.5, otherwise, ul test will fail
157
158 // DOWNLINK - DISTANCE 10000 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
159 // Traffic info
160 // UDP traffic: payload size = 200 bytes, interval = 1 ms
161 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
162 // byte/sec -> 232000 byte/rate
163 // Total bandwidth: 24 PRB at Itbs 13 -> 775 -> 775000 byte/sec
164 // 1 user -> 903000 * 1 = 232000 < 775000 -> throughput = 232000 byte/sec
165 // 3 user -> 232000 * 3 = 696000 > 775000 -> througphut = 232000 byte/sec
166 // 6 user -> 232000 * 6 = 139200 > 775000 -> throughput = 775000 / 6 = 129166 byte/sec
167 // 12 user -> 232000 * 12 = 2784000 > 775000 -> throughput = 775000 / 12 = 64583 byte/sec
168 // UPLINK - DISTANCE 10000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
169 // 1 user -> 24 PRB at Itbs 8 -> 437 -> 437000 > 232000 -> throughput = 232000 bytes/sec
170 // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 < 232000 -> throughput = 137000 bytes/sec
171 // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 < 232000 -> throughput = 67000 bytes/sec
172 // after the patch enforcing min 3 PRBs per UE:
173 // 12 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/12 UE/TTI -> 32667 < 232000 -> throughput = 32667
174 // bytes/sec
175 AddTestCase(new LenaPssFfMacSchedulerTestCase1(1, 10000, 232000, 232000, 200, 1, errorModel),
176 TestCase::Duration::EXTENSIVE);
177 AddTestCase(new LenaPssFfMacSchedulerTestCase1(3, 10000, 232000, 137000, 200, 1, errorModel),
178 TestCase::Duration::EXTENSIVE);
179 AddTestCase(new LenaPssFfMacSchedulerTestCase1(6, 10000, 129166, 67000, 200, 1, errorModel),
180 TestCase::Duration::EXTENSIVE);
181 // AddTestCase (new LenaPssFfMacSchedulerTestCase1 (12,10000,64583,32667,200,1,errorModel));//
182 // simulation time = 1.5, otherwise, ul test will 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 LenaPssFfMacSchedulerTestCase1(1, 100000, 0, 0, 200, 1, errorModel),
187 TestCase::Duration::QUICK);
188
189 // Test Case 2: homogeneous flow test in PSS (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> estThrPssDl1;
207 estThrPssDl1.push_back(132000); // User 0 estimated TTI throughput from PSS
208 estThrPssDl1.push_back(132000); // User 1 estimated TTI throughput from PSS
209 estThrPssDl1.push_back(132000); // User 2 estimated TTI throughput from PSS
210 estThrPssDl1.push_back(132000); // User 3 estimated TTI throughput from PSS
211 AddTestCase(new LenaPssFfMacSchedulerTestCase2(dist1, estThrPssDl1, packetSize1, 1, errorModel),
212 TestCase::Duration::QUICK);
213
214 // Traffic2 info
215 // UDP traffic: payload size = 200 bytes, interval = 1 ms
216 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
217 // byte/sec -> 232000 byte/rate
218 // Maximum throughput = 4 / ( 1/2196000 + 1/1191000 + 1/1383000 + 1/775000 ) = 1209046 byte/s
219 // 232000 * 4 = 928000 < 1209046 -> estimated throughput in downlink = 928000 / 4 = 230000
220 // byte/sec
221 std::vector<double> dist2;
222 dist2.push_back(0); // User 0 distance --> MCS 28
223 dist2.push_back(4800); // User 1 distance --> MCS 22
224 dist2.push_back(6000); // User 2 distance --> MCS 20
225 dist2.push_back(10000); // User 3 distance --> MCS 14
226 std::vector<uint16_t> packetSize2;
227 packetSize2.push_back(200);
228 packetSize2.push_back(200);
229 packetSize2.push_back(200);
230 packetSize2.push_back(200);
231 std::vector<uint32_t> estThrPssDl2;
232 estThrPssDl2.push_back(230000); // User 0 estimated TTI throughput from PSS
233 estThrPssDl2.push_back(230000); // User 1 estimated TTI throughput from PSS
234 estThrPssDl2.push_back(230000); // User 2 estimated TTI throughput from PSS
235 estThrPssDl2.push_back(230000); // User 3 estimated TTI throughput from PSS
236 AddTestCase(new LenaPssFfMacSchedulerTestCase2(dist2, estThrPssDl2, packetSize2, 1, errorModel),
237 TestCase::Duration::QUICK);
238
239 // Test Case 3: heterogeneous flow test in PSS
240 // UDP traffic: payload size = [100,200,300] bytes, interval = 1 ms
241 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
242 // byte/sec -> [132000, 232000, 332000] byte/rate
243 // Maximum throughput = 3 / ( 1/2196000 + 1/1191000 + 1/1383000) = 1486569 byte/s
244 // 132000 + 232000 + 332000 = 696000 < 1486569 -> estimated throughput in downlink = [132000,
245 // 232000, 332000] byte/sec
246 std::vector<double> dist3;
247 dist3.push_back(0); // User 0 distance --> MCS 28
248 dist3.push_back(4800); // User 1 distance --> MCS 22
249 dist3.push_back(6000); // User 2 distance --> MCS 20
250 std::vector<uint16_t> packetSize3;
251 packetSize3.push_back(100);
252 packetSize3.push_back(200);
253 packetSize3.push_back(300);
254 std::vector<uint32_t> estThrPssDl3;
255 estThrPssDl3.push_back(132000); // User 0 estimated TTI throughput from PSS
256 estThrPssDl3.push_back(232000); // User 1 estimated TTI throughput from PSS
257 estThrPssDl3.push_back(332000); // User 2 estimated TTI throughput from PSS
258 AddTestCase(new LenaPssFfMacSchedulerTestCase2(dist3, estThrPssDl3, packetSize3, 1, errorModel),
259 TestCase::Duration::QUICK);
260}
261
262/**
263 * \ingroup lte-test
264 * Static variable for test initialization
265 */
267
268// --------------- T E S T - C A S E # 1 ------------------------------
269
270std::string
272{
273 std::ostringstream oss;
274 oss << nUser << " UEs, distance " << dist << " m";
275 return oss.str();
276}
277
279 double dist,
280 double thrRefDl,
281 double thrRefUl,
282 uint16_t packetSize,
283 uint16_t interval,
284 bool errorModelEnabled)
285 : TestCase(BuildNameString(nUser, dist)),
286 m_nUser(nUser),
287 m_dist(dist),
288 m_packetSize(packetSize),
289 m_interval(interval),
290 m_thrRefDl(thrRefDl),
291 m_thrRefUl(thrRefUl),
292 m_errorModelEnabled(errorModelEnabled)
293{
294}
295
297{
298}
299
300void
302{
303 NS_LOG_FUNCTION(this << GetName());
304
306 {
307 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
308 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
309 }
310
311 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
312 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
313 StringValue(CreateTempDirFilename("DlMacStats.txt")));
314 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
315 StringValue(CreateTempDirFilename("UlMacStats.txt")));
316 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
317 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
318 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
319 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
320
321 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
322 Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper>();
323 lteHelper->SetEpcHelper(epcHelper);
324
325 // LogComponentEnable ("PssFfMacScheduler", LOG_DEBUG);
326
327 Ptr<Node> pgw = epcHelper->GetPgwNode();
328
329 // Create a single RemoteHost
330 NodeContainer remoteHostContainer;
331 remoteHostContainer.Create(1);
332 Ptr<Node> remoteHost = remoteHostContainer.Get(0);
333 InternetStackHelper internet;
334 internet.Install(remoteHostContainer);
335
336 // Create the Internet
338 p2ph.SetDeviceAttribute("DataRate", DataRateValue(DataRate("100Gb/s")));
339 p2ph.SetDeviceAttribute("Mtu", UintegerValue(1500));
340 p2ph.SetChannelAttribute("Delay", TimeValue(Seconds(0.001)));
341 NetDeviceContainer internetDevices = p2ph.Install(pgw, remoteHost);
342 Ipv4AddressHelper ipv4h;
343 ipv4h.SetBase("1.0.0.0", "255.0.0.0");
344 Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign(internetDevices);
345 // interface 0 is localhost, 1 is the p2p device
346 Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress(1);
347
348 Ipv4StaticRoutingHelper ipv4RoutingHelper;
349 Ptr<Ipv4StaticRouting> remoteHostStaticRouting =
350 ipv4RoutingHelper.GetStaticRouting(remoteHost->GetObject<Ipv4>());
351 remoteHostStaticRouting->AddNetworkRouteTo(Ipv4Address("7.0.0.0"), Ipv4Mask("255.0.0.0"), 1);
352
353 // Config::SetDefault ("ns3::LteAmc::AmcModel", EnumValue (LteAmc::PiroEW2010));
354 // Config::SetDefault ("ns3::LteAmc::Ber", DoubleValue (0.00005));
355 // Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
356 // Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
357
358 // Config::SetDefault ("ns3::LteEnbRrc::EpsBearerToRlcMapping", EnumValue
359 // (LteHelper::RLC_UM_ALWAYS));
360
361 // LogComponentDisableAll (LOG_LEVEL_ALL);
362 // LogComponentEnable ("LenaTestPssFfMacScheduler", LOG_LEVEL_ALL);
363
364 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
365
366 // Create Nodes: eNodeB and UE
367 NodeContainer enbNodes;
368 NodeContainer ueNodes;
369 enbNodes.Create(1);
370 ueNodes.Create(m_nUser);
371
372 // Install Mobility Model
373 MobilityHelper mobility;
374 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
375 mobility.Install(enbNodes);
376 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
377 mobility.Install(ueNodes);
378
379 // Create Devices and install them in the Nodes (eNB and UE)
380 NetDeviceContainer enbDevs;
381 NetDeviceContainer ueDevs;
382 lteHelper->SetSchedulerType("ns3::PssFfMacScheduler");
383 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
384 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
385 ueDevs = lteHelper->InstallUeDevice(ueNodes);
386
387 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
388 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
389 enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
390 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
391
392 // Set UEs' position and power
393 for (int i = 0; i < m_nUser; i++)
394 {
397 mm->SetPosition(Vector(m_dist, 0.0, 0.0));
398 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
399 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
400 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
401 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
402 }
403
404 // Install the IP stack on the UEs
405 internet.Install(ueNodes);
406 Ipv4InterfaceContainer ueIpIface;
407 ueIpIface = epcHelper->AssignUeIpv4Address(NetDeviceContainer(ueDevs));
408
409 // Assign IP address to UEs
410 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
411 {
412 Ptr<Node> ueNode = ueNodes.Get(u);
413 // Set the default gateway for the UE
414 Ptr<Ipv4StaticRouting> ueStaticRouting =
415 ipv4RoutingHelper.GetStaticRouting(ueNode->GetObject<Ipv4>());
416 ueStaticRouting->SetDefaultRoute(epcHelper->GetUeDefaultGatewayAddress(), 1);
417 }
418
419 // Attach a UE to a eNB
420 lteHelper->Attach(ueDevs, enbDevs.Get(0));
421
422 // Activate an EPS bearer on all UEs
423 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
424 {
425 Ptr<NetDevice> ueDevice = ueDevs.Get(u);
427 qos.gbrDl = (m_packetSize + 32) * (1000 / m_interval) *
428 8; // bit/s, considering IP, UDP, RLC, PDCP header size
429 qos.gbrUl = (m_packetSize + 32) * (1000 / m_interval) * 8;
430 qos.mbrDl = 0;
431 qos.mbrUl = 0;
432
434 EpsBearer bearer(q, qos);
435 lteHelper->ActivateDedicatedEpsBearer(ueDevice, bearer, EpcTft::Default());
436 }
437
438 // Install downlink and uplink applications
439 uint16_t dlPort = 1234;
440 uint16_t ulPort = 2000;
441 ApplicationContainer clientApps;
442 ApplicationContainer serverApps;
443 PacketSinkHelper dlPacketSinkHelper("ns3::UdpSocketFactory",
445
446 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
447 {
448 ++ulPort;
449 PacketSinkHelper ulPacketSinkHelper("ns3::UdpSocketFactory",
451 serverApps.Add(ulPacketSinkHelper.Install(remoteHost)); // receive packets from UEs
452 serverApps.Add(
453 dlPacketSinkHelper.Install(ueNodes.Get(u))); // receive packets from remotehost
454
455 UdpClientHelper dlClient(ueIpIface.GetAddress(u), dlPort); // downlink packets generator
456 dlClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
457 dlClient.SetAttribute("MaxPackets", UintegerValue(1000000));
458 dlClient.SetAttribute("PacketSize", UintegerValue(m_packetSize));
459
460 UdpClientHelper ulClient(remoteHostAddr, ulPort); // uplink packets generator
461 ulClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
462 ulClient.SetAttribute("MaxPackets", UintegerValue(1000000));
463 ulClient.SetAttribute("PacketSize", UintegerValue(m_packetSize));
464
465 clientApps.Add(dlClient.Install(remoteHost));
466 clientApps.Add(ulClient.Install(ueNodes.Get(u)));
467 }
468
469 serverApps.Start(Seconds(0.030));
470 clientApps.Start(Seconds(0.030));
471
472 double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
473 double statsDuration = 0.6;
474 double tolerance = 0.1;
475 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.0001));
476
477 lteHelper->EnableRlcTraces();
478 lteHelper->EnableMacTraces();
479 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
480 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
481 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
482
484
485 /**
486 * Check that the downlink assignment is done in a "token bank fair queue" manner
487 */
488
489 NS_LOG_INFO("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
490 std::vector<uint64_t> dlDataRxed;
491 for (int i = 0; i < m_nUser; i++)
492 {
493 // get the imsi
494 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
495 // get the lcId
496 uint8_t lcId = 4;
497 uint64_t data = rlcStats->GetDlRxData(imsi, lcId);
498 dlDataRxed.push_back(data);
499 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at(i)
500 << " thr " << (double)dlDataRxed.at(i) / statsDuration << " ref "
501 << m_thrRefDl);
502 }
503
504 for (int i = 0; i < m_nUser; i++)
505 {
506 NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
508 m_thrRefDl * tolerance,
509 " Unfair Throughput!");
510 }
511
512 /**
513 * Check that the uplink assignment is done in a "round robin" manner
514 */
515
516 NS_LOG_INFO("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
517 std::vector<uint64_t> ulDataRxed;
518 for (int i = 0; i < m_nUser; i++)
519 {
520 // get the imsi
521 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
522 // get the lcId
523 uint8_t lcId = 4;
524 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
525 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)ulDataRxed.at(i)
526 << " thr " << (double)ulDataRxed.at(i) / statsDuration << " ref "
527 << m_thrRefUl);
528 }
529
530 for (int i = 0; i < m_nUser; i++)
531 {
532 NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
534 m_thrRefUl * tolerance,
535 " Unfair Throughput!");
536 }
538}
539
540// --------------- T E S T - C A S E # 2 ------------------------------
541
542std::string
543LenaPssFfMacSchedulerTestCase2::BuildNameString(uint16_t nUser, std::vector<double> dist)
544{
545 std::ostringstream oss;
546 oss << "distances (m) = [ ";
547 for (auto it = dist.begin(); it != dist.end(); ++it)
548 {
549 oss << *it << " ";
550 }
551 oss << "]";
552 return oss.str();
553}
554
556 std::vector<uint32_t> estThrPssDl,
557 std::vector<uint16_t> packetSize,
558 uint16_t interval,
559 bool errorModelEnabled)
560 : TestCase(BuildNameString(dist.size(), dist)),
561 m_nUser(dist.size()),
562 m_dist(dist),
563 m_packetSize(packetSize),
564 m_interval(interval),
565 m_estThrPssDl(estThrPssDl),
566 m_errorModelEnabled(errorModelEnabled)
567{
568}
569
571{
572}
573
574void
576{
578 {
579 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
580 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
581 }
582
583 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
584 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
585 StringValue(CreateTempDirFilename("DlMacStats.txt")));
586 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
587 StringValue(CreateTempDirFilename("UlMacStats.txt")));
588 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
589 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
590 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
591 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
592
593 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
594 Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper>();
595 lteHelper->SetEpcHelper(epcHelper);
596
597 Ptr<Node> pgw = epcHelper->GetPgwNode();
598
599 // Create a single RemoteHost
600 NodeContainer remoteHostContainer;
601 remoteHostContainer.Create(1);
602 Ptr<Node> remoteHost = remoteHostContainer.Get(0);
603 InternetStackHelper internet;
604 internet.Install(remoteHostContainer);
605
606 // Create the Internet
608 p2ph.SetDeviceAttribute("DataRate", DataRateValue(DataRate("100Gb/s")));
609 p2ph.SetDeviceAttribute("Mtu", UintegerValue(1500));
610 p2ph.SetChannelAttribute("Delay", TimeValue(Seconds(0.001)));
611 NetDeviceContainer internetDevices = p2ph.Install(pgw, remoteHost);
612 Ipv4AddressHelper ipv4h;
613 ipv4h.SetBase("1.0.0.0", "255.0.0.0");
614 Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign(internetDevices);
615 // interface 0 is localhost, 1 is the p2p device
616 Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress(1);
617
618 Ipv4StaticRoutingHelper ipv4RoutingHelper;
619 Ptr<Ipv4StaticRouting> remoteHostStaticRouting =
620 ipv4RoutingHelper.GetStaticRouting(remoteHost->GetObject<Ipv4>());
621 remoteHostStaticRouting->AddNetworkRouteTo(Ipv4Address("7.0.0.0"), Ipv4Mask("255.0.0.0"), 1);
622
623 // LogComponentDisableAll (LOG_LEVEL_ALL);
624 // LogComponentEnable ("LenaTestPssFfMacScheduler", LOG_LEVEL_ALL);
625
626 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
627
628 // Create Nodes: eNodeB and UE
629 NodeContainer enbNodes;
630 NodeContainer ueNodes;
631 enbNodes.Create(1);
632 ueNodes.Create(m_nUser);
633
634 // Install Mobility Model
635 MobilityHelper mobility;
636 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
637 mobility.Install(enbNodes);
638 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
639 mobility.Install(ueNodes);
640
641 // Create Devices and install them in the Nodes (eNB and UE)
642 NetDeviceContainer enbDevs;
643 NetDeviceContainer ueDevs;
644 lteHelper->SetSchedulerType("ns3::PssFfMacScheduler");
645 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
646 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
647 ueDevs = lteHelper->InstallUeDevice(ueNodes);
648
649 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
650 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
651 enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
652 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
653
654 // Set UEs' position and power
655 for (int i = 0; i < m_nUser; i++)
656 {
659 mm->SetPosition(Vector(m_dist.at(i), 0.0, 0.0));
660 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
661 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
662 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
663 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
664 }
665
666 // Install the IP stack on the UEs
667 internet.Install(ueNodes);
668 Ipv4InterfaceContainer ueIpIface;
669 ueIpIface = epcHelper->AssignUeIpv4Address(NetDeviceContainer(ueDevs));
670
671 // Assign IP address to UEs
672 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
673 {
674 Ptr<Node> ueNode = ueNodes.Get(u);
675 // Set the default gateway for the UE
676 Ptr<Ipv4StaticRouting> ueStaticRouting =
677 ipv4RoutingHelper.GetStaticRouting(ueNode->GetObject<Ipv4>());
678 ueStaticRouting->SetDefaultRoute(epcHelper->GetUeDefaultGatewayAddress(), 1);
679 }
680
681 // Attach a UE to a eNB
682 lteHelper->Attach(ueDevs, enbDevs.Get(0));
683
684 // Activate an EPS bearer on all UEs
685
686 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
687 {
688 Ptr<NetDevice> ueDevice = ueDevs.Get(u);
690 qos.gbrDl = (m_packetSize.at(u) + 32) * (1000 / m_interval) *
691 8; // bit/s, considering IP, UDP, RLC, PDCP header size
692 qos.gbrUl = (m_packetSize.at(u) + 32) * (1000 / m_interval) * 8;
693 qos.mbrDl = qos.gbrDl;
694 qos.mbrUl = qos.gbrUl;
695
697 EpsBearer bearer(q, qos);
698 lteHelper->ActivateDedicatedEpsBearer(ueDevice, bearer, EpcTft::Default());
699 }
700
701 // Install downlink and uplink applications
702 uint16_t dlPort = 1234;
703 uint16_t ulPort = 2000;
704 ApplicationContainer clientApps;
705 ApplicationContainer serverApps;
706 PacketSinkHelper dlPacketSinkHelper("ns3::UdpSocketFactory",
708
709 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
710 {
711 ++ulPort;
712 PacketSinkHelper ulPacketSinkHelper("ns3::UdpSocketFactory",
714 serverApps.Add(ulPacketSinkHelper.Install(remoteHost)); // receive packets from UEs
715 serverApps.Add(
716 dlPacketSinkHelper.Install(ueNodes.Get(u))); // receive packets from remotehost
717
718 UdpClientHelper dlClient(ueIpIface.GetAddress(u), dlPort); // downlink packets generator
719 dlClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
720 dlClient.SetAttribute("MaxPackets", UintegerValue(1000000));
721 dlClient.SetAttribute("PacketSize", UintegerValue(m_packetSize.at(u)));
722
723 UdpClientHelper ulClient(remoteHostAddr, ulPort); // uplink packets generator
724 ulClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
725 ulClient.SetAttribute("MaxPackets", UintegerValue(1000000));
726 ulClient.SetAttribute("PacketSize", UintegerValue(m_packetSize.at(u)));
727
728 clientApps.Add(dlClient.Install(remoteHost));
729 clientApps.Add(ulClient.Install(ueNodes.Get(u)));
730 }
731
732 serverApps.Start(Seconds(0.030));
733 clientApps.Start(Seconds(0.030));
734
735 double statsStartTime = 0.04; // need to allow for RRC connection establishment + SRS
736 double statsDuration = 0.5;
737 double tolerance = 0.1;
738 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.0001));
739
740 lteHelper->EnableRlcTraces();
741 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
742 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
743 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
744
746
747 /**
748 * Check that the downlink assignment is done in a "token bank fair queue" manner
749 */
750
751 NS_LOG_INFO("DL - Test with " << m_nUser << " user(s)");
752 std::vector<uint64_t> dlDataRxed;
753 for (int i = 0; i < m_nUser; i++)
754 {
755 // get the imsi
756 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
757 // get the lcId
758 uint8_t lcId = 4;
759 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
760 NS_LOG_INFO("\tUser " << i << " dist " << m_dist.at(i) << " imsi " << imsi << " bytes rxed "
761 << (double)dlDataRxed.at(i) << " thr "
762 << (double)dlDataRxed.at(i) / statsDuration << " ref "
763 << m_estThrPssDl.at(i));
764 }
765
766 for (int i = 0; i < m_nUser; i++)
767 {
768 NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
769 m_estThrPssDl.at(i),
770 m_estThrPssDl.at(i) * tolerance,
771 " Unfair Throughput!");
772 }
773
775}
This system test program creates different test cases with a single eNB and several UEs,...
uint16_t m_interval
the interval time in ms
uint16_t m_packetSize
the packet size in bytes
bool m_errorModelEnabled
indicates whether the error model is enabled
double m_thrRefDl
the DL throughput reference value
static std::string BuildNameString(uint16_t nUser, double dist)
Builds the test name string based on provided parameter values.
double m_thrRefUl
the UL throughput reference value
double m_dist
the distance between nodes
LenaPssFfMacSchedulerTestCase1(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.
Similar to the LenaPssFfMacSchedulerTestCase1 with the difference that UEs are places in such a way t...
bool m_errorModelEnabled
indicates whether the error model is enabled
std::vector< double > m_dist
the distance between nodes
uint16_t m_interval
the interval time in ms
std::vector< uint16_t > m_packetSize
the packet size in bytes
static std::string BuildNameString(uint16_t nUser, std::vector< double > dist)
Builds the test name string based on provided parameter values.
LenaPssFfMacSchedulerTestCase2(std::vector< double > dist, std::vector< uint32_t > estThrPssDl, std::vector< uint16_t > packetSize, uint16_t interval, bool errorModelEnabled)
Constructor.
void DoRun() override
Implementation to actually run this TestCase.
std::vector< uint32_t > m_estThrPssDl
the DL estimated throughput PSS
Lena Pss Ff Mac Scheduler Test Suite.
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:1406
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 LenaTestPssFfMacSchedulerSuite lenaTestPssFfMacSchedulerSuite
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:1319
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1331
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.