A Discrete-Event Network Simulator
API
lte-test-cqa-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: Biljana Bojovic<bbojovic@cttc.es>
18 * Dizhi Zhou <dizhi.zhou@gmail.com>
19 * Marco Miozzo <marco.miozzo@cttc.es>,
20 * Nicola Baldo <nbaldo@cttc.es>
21 *
22 */
23
25
26#include "ns3/applications-module.h"
27#include "ns3/double.h"
28#include "ns3/internet-module.h"
29#include "ns3/ipv4-global-routing-helper.h"
30#include "ns3/network-module.h"
31#include "ns3/point-to-point-epc-helper.h"
32#include "ns3/point-to-point-helper.h"
33#include "ns3/radio-bearer-stats-calculator.h"
34#include "ns3/string.h"
35#include <ns3/boolean.h>
36#include <ns3/constant-position-mobility-model.h>
37#include <ns3/enum.h>
38#include <ns3/eps-bearer.h>
39#include <ns3/ff-mac-scheduler.h>
40#include <ns3/log.h>
41#include <ns3/lte-enb-net-device.h>
42#include <ns3/lte-enb-phy.h>
43#include <ns3/lte-helper.h>
44#include <ns3/lte-ue-net-device.h>
45#include <ns3/lte-ue-phy.h>
46#include <ns3/lte-ue-rrc.h>
47#include <ns3/mobility-helper.h>
48#include <ns3/net-device-container.h>
49#include <ns3/node-container.h>
50#include <ns3/object.h>
51#include <ns3/packet.h>
52#include <ns3/ptr.h>
53#include <ns3/simulator.h>
54#include <ns3/spectrum-error-model.h>
55#include <ns3/spectrum-interference.h>
56#include <ns3/test.h>
57
58#include <iostream>
59#include <sstream>
60#include <string>
61
62using namespace ns3;
63
64NS_LOG_COMPONENT_DEFINE("LenaTestCqaFfMacScheduler");
65
67 : TestSuite("lte-cqa-ff-mac-scheduler", SYSTEM)
68{
69 NS_LOG_INFO("creating LenaTestCqaFfMacSchedulerSuite");
70
71 bool errorModel = false;
72
73 // General config
74 // Traffic: UDP traffic with fixed rate
75 // Token generation rate = traffic rate
76 // RLC header length = 2 bytes, PDCP header = 2 bytes
77 // Simulation time = 1.0 sec
78 // Throughput in this file is calculated in RLC layer
79
80 // Test Case 1: homogeneous flow test in CQA (same distance)
81 // DOWNLINK -> DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.2 13)
82 // Traffic info
83 // UDP traffic: payload size = 200 bytes, interval = 1 ms
84 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) *
85 // 1000 byte/sec -> 232000 byte/rate
86 // Totol bandwidth: 24 PRB at Itbs 26 -> 2196 -> 2196000 byte/sec
87 // 1 user -> 232000 * 1 = 232000 < 2196000 -> throughput = 232000 byte/sec
88 // 3 user -> 232000 * 3 = 696000 < 2196000 -> througphut = 232000 byte/sec
89 // 6 user -> 232000 * 6 = 139200 < 2196000 -> throughput = 232000 byte/sec
90 // 12 user -> 232000 * 12 = 2784000 > 2196000 -> throughput = 2196000 / 12 = 183000 byte/sec
91 // UPLINK -> DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.2 13)
92 // 1 user -> 25 PRB at Itbs 26 -> 2292 -> 2292000 > 232000 -> throughput = 232000 bytes/sec
93 // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 > 232000 -> throughput = 232000 bytes/sec
94 // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 > 232000 -> throughput = 232000 bytes/sec
95 // 12 users -> 2 PRB at Itbs 26 -> 185 -> 185000 < 232000 -> throughput = 185000 bytes/sec
96 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(1, 0, 232000, 232000, 200, 1, errorModel),
97 TestCase::EXTENSIVE);
98 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(3, 0, 232000, 232000, 200, 1, errorModel),
99 TestCase::EXTENSIVE);
100 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(6, 0, 232000, 232000, 200, 1, errorModel),
101 TestCase::EXTENSIVE);
102
103 // AddTestCase (new LenaCqaFfMacSchedulerTestCase1 (12,0,183000,185000,200,1,errorModel));//
104 // simulation time = 1.5, otherwise, ul test will fail
105
106 // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
107 // Traffic info
108 // UDP traffic: payload size = 200 bytes, interval = 1 ms
109 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
110 // byte/sec -> 232000 byte/rate
111 // Totol bandwidth: 24 PRB at Itbs 20 -> 1383 -> 1383000 byte/sec
112 // 1 user -> 903000 * 1 = 232000 < 1383000 -> throughput = 232000 byte/sec
113 // 3 user -> 232000 * 3 = 696000 < 1383000 -> througphut = 232000 byte/sec
114 // 6 user -> 232000 * 6 = 139200 > 1383000 -> throughput = 1383000 / 6 = 230500 byte/sec
115 // 12 user -> 232000 * 12 = 2784000 > 1383000 -> throughput = 1383000 / 12 = 115250 byte/sec
116 // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
117 // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 > 232000 -> throughput = 232000 bytes/sec
118 // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 > 232000 -> throughput = 232000 bytes/sec
119 // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 < 232000 -> throughput = 125000 bytes/sec
120 // after the patch enforcing min 3 PRBs per UE:
121 // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 < 232000 -> throughput =
122 // 62000 bytes/sec
123 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(1, 4800, 232000, 232000, 200, 1, errorModel),
124 TestCase::EXTENSIVE);
125 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(3, 4800, 232000, 232000, 200, 1, errorModel),
126 TestCase::EXTENSIVE);
127 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(6, 4800, 230500, 125000, 200, 1, errorModel),
128 TestCase::EXTENSIVE);
129 // AddTestCase (new LenaCqaFfMacSchedulerTestCase1 (12,4800,115250,62000,200,1,errorModel)); //
130 // simulation time = 1.5, otherwise, ul test will fail
131
132 // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
133 // Traffic info
134 // UDP traffic: payload size = 200 bytes, interval = 1 ms
135 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
136 // byte/sec -> 232000 byte/rate
137 // Totol bandwidth: 24 PRB at Itbs 18 -> 1191 -> 1191000 byte/sec
138 // 1 user -> 903000 * 1 = 232000 < 1191000 -> throughput = 232000 byte/sec
139 // 3 user -> 232000 * 3 = 696000 < 1191000 -> througphut = 232000 byte/sec
140 // 6 user -> 232000 * 6 = 1392000 > 1191000 -> throughput = 1191000 / 6 = 198500 byte/sec
141 // 12 user -> 232000 * 12 = 2784000 > 1191000 -> throughput = 1191000 / 12 = 99250 byte/sec
142
143 // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
144 // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 > 232000 -> throughput = 232000 bytes/sec
145 // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 < 232000 -> throughput = 201000 bytes/sec
146 // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 < 232000 -> throughput = 97000 bytes/sec
147 // after the patch enforcing min 3 PRBs per UE:
148 // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 < 232000 -> throughput =
149 // 48667 bytes/sec
150 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(1, 6000, 232000, 232000, 200, 1, errorModel),
151 TestCase::EXTENSIVE);
152 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(3, 6000, 232000, 201000, 200, 1, errorModel),
153 TestCase::EXTENSIVE);
154 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(6, 6000, 198500, 97000, 200, 1, errorModel),
155 TestCase::EXTENSIVE);
156 // AddTestCase (new LenaCqaFfMacSchedulerTestCase1 (12,6000,99250,48667,200,1, errorModel)); //
157 // simulation time = 1.5, otherwise, ul test will fail
158
159 // DOWNLINK - DISTANCE 10000 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
160 // Traffic info
161 // UDP traffic: payload size = 200 bytes, interval = 1 ms
162 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
163 // byte/sec -> 232000 byte/rate
164 // Totol bandwidth: 24 PRB at Itbs 13 -> 775 -> 775000 byte/sec
165 // 1 user -> 903000 * 1 = 232000 < 775000 -> throughput = 232000 byte/sec
166 // 3 user -> 232000 * 3 = 696000 > 775000 -> througphut = 232000 byte/sec
167 // 6 user -> 232000 * 6 = 139200 > 775000 -> throughput = 775000 / 6 = 129166 byte/sec
168 // 12 user -> 232000 * 12 = 2784000 > 775000 -> throughput = 775000 / 12 = 64583 byte/sec
169 // UPLINK - DISTANCE 10000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
170 // 1 user -> 24 PRB at Itbs 8 -> 437 -> 437000 > 232000 -> throughput = 232000 bytes/sec
171 // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 < 232000 -> throughput = 137000 bytes/sec
172 // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 < 232000 -> throughput = 67000 bytes/sec
173 // after the patch enforcing min 3 PRBs per UE:
174 // 12 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/12 UE/TTI -> 32667 < 232000 -> throughput = 32667
175 // bytes/sec
176 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(1, 10000, 232000, 232000, 200, 1, errorModel),
177 TestCase::EXTENSIVE);
178 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(3, 10000, 232000, 137000, 200, 1, errorModel),
179 TestCase::EXTENSIVE);
180 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(6, 10000, 129166, 67000, 200, 1, errorModel),
181 TestCase::EXTENSIVE);
182 // AddTestCase (new LenaCqaFfMacSchedulerTestCase1 (12,10000,64583,32667,200,1,errorModel));//
183 // simulation time = 1.5, otherwise, ul test will fail
184
185 // DOWNLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
186 // UPLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
187 AddTestCase(new LenaCqaFfMacSchedulerTestCase1(1, 100000, 0, 0, 200, 1, errorModel),
188 TestCase::QUICK);
189
190 // Test Case 2: homogeneous flow test in CQA (different distance)
191 // Traffic1 info
192 // UDP traffic: payload size = 100 bytes, interval = 1 ms
193 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
194 // byte/sec -> 132000 byte/rate
195 // Maximum throughput = 4 / ( 1/2196000 + 1/1191000 + 1/1383000 + 1/775000 ) = 1209046 byte/s
196 // 132000 * 4 = 528000 < 1209046 -> estimated throughput in downlink = 132000 byte/sec
197 std::vector<double> dist1;
198 dist1.push_back(0); // User 0 distance --> MCS 28
199 dist1.push_back(4800); // User 1 distance --> MCS 22
200 dist1.push_back(6000); // User 2 distance --> MCS 20
201 dist1.push_back(10000); // User 3 distance --> MCS 14
202 std::vector<uint16_t> packetSize1;
203 packetSize1.push_back(100);
204 packetSize1.push_back(100);
205 packetSize1.push_back(100);
206 packetSize1.push_back(100);
207 std::vector<uint32_t> estThrCqaDl1;
208 estThrCqaDl1.push_back(132000); // User 0 estimated TTI throughput from CQA
209 estThrCqaDl1.push_back(132000); // User 1 estimated TTI throughput from CQA
210 estThrCqaDl1.push_back(132000); // User 2 estimated TTI throughput from CQA
211 estThrCqaDl1.push_back(132000); // User 3 estimated TTI throughput from CQA
212 AddTestCase(new LenaCqaFfMacSchedulerTestCase2(dist1, estThrCqaDl1, packetSize1, 1, errorModel),
213 TestCase::QUICK);
214
215 // Traffic2 info
216 // UDP traffic: payload size = 200 bytes, interval = 1 ms
217 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
218 // byte/sec -> 232000 byte/rate
219 // Maximum throughput = 4 / ( 1/2196000 + 1/1191000 + 1/1383000 + 1/775000 ) = 1209046 byte/s
220 // 232000 * 4 = 928000 < 1209046 -> estimated throughput in downlink = 928000 / 4 = 230000
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(200);
229 packetSize2.push_back(200);
230 packetSize2.push_back(200);
231 packetSize2.push_back(200);
232 std::vector<uint32_t> estThrCqaDl2;
233 estThrCqaDl2.push_back(230000); // User 0 estimated TTI throughput from CQA
234 estThrCqaDl2.push_back(230000); // User 1 estimated TTI throughput from CQA
235 estThrCqaDl2.push_back(230000); // User 2 estimated TTI throughput from CQA
236 estThrCqaDl2.push_back(230000); // User 3 estimated TTI throughput from CQA
237 AddTestCase(new LenaCqaFfMacSchedulerTestCase2(dist2, estThrCqaDl2, packetSize2, 1, errorModel),
238 TestCase::QUICK);
239
240 // Test Case 3: heterogeneous flow test in CQA
241 // UDP traffic: payload size = [100,200,300] bytes, interval = 1 ms
242 // UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000
243 // byte/sec -> [132000, 232000, 332000] byte/rate
244 // Maximum throughput = 3 / ( 1/2196000 + 1/1191000 + 1/1383000) = 1486569 byte/s
245 // 132000 + 232000 + 332000 = 696000 < 1486569 -> estimated throughput in downlink = [132000,
246 // 232000, 332000] byte/sec
247 std::vector<double> dist3;
248 dist3.push_back(0); // User 0 distance --> MCS 28
249 dist3.push_back(4800); // User 1 distance --> MCS 22
250 dist3.push_back(6000); // User 2 distance --> MCS 20
251 std::vector<uint16_t> packetSize3;
252 packetSize3.push_back(100);
253 packetSize3.push_back(200);
254 packetSize3.push_back(300);
255 std::vector<uint32_t> estThrCqaDl3;
256 estThrCqaDl3.push_back(132000); // User 0 estimated TTI throughput from CQA
257 estThrCqaDl3.push_back(232000); // User 1 estimated TTI throughput from CQA
258 estThrCqaDl3.push_back(332000); // User 2 estimated TTI throughput from CQA
259 AddTestCase(new LenaCqaFfMacSchedulerTestCase2(dist3, estThrCqaDl3, packetSize3, 1, errorModel),
260 TestCase::QUICK);
261}
262
264
265// --------------- T E S T - C A S E # 1 ------------------------------
266
267std::string
269{
270 std::ostringstream oss;
271 oss << nUser << " UEs, distance " << dist << " m";
272 return oss.str();
273}
274
276 double dist,
277 double thrRefDl,
278 double thrRefUl,
279 uint16_t packetSize,
280 uint16_t interval,
281 bool errorModelEnabled)
282 : TestCase(BuildNameString(nUser, dist)),
283 m_nUser(nUser),
284 m_dist(dist),
285 m_packetSize(packetSize),
286 m_interval(interval),
287 m_thrRefDl(thrRefDl),
288 m_thrRefUl(thrRefUl),
289 m_errorModelEnabled(errorModelEnabled)
290{
291}
292
294{
295}
296
297void
299{
300 NS_LOG_FUNCTION(this << GetName());
301
303 {
304 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
305 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
306 }
307
308 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
309 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
310 StringValue(CreateTempDirFilename("DlMacStats.txt")));
311 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
312 StringValue(CreateTempDirFilename("UlMacStats.txt")));
313 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
314 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
315 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
316 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
317
318 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
319 Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper>();
320 lteHelper->SetEpcHelper(epcHelper);
321
322 // LogComponentEnable ("CqaFfMacScheduler", LOG_DEBUG);
323
324 Ptr<Node> pgw = epcHelper->GetPgwNode();
325
326 // Create a single RemoteHost
327 NodeContainer remoteHostContainer;
328 remoteHostContainer.Create(1);
329 Ptr<Node> remoteHost = remoteHostContainer.Get(0);
330 InternetStackHelper internet;
331 internet.Install(remoteHostContainer);
332
333 // Create the Internet
335 p2ph.SetDeviceAttribute("DataRate", DataRateValue(DataRate("100Gb/s")));
336 p2ph.SetDeviceAttribute("Mtu", UintegerValue(1500));
337 p2ph.SetChannelAttribute("Delay", TimeValue(Seconds(0.001)));
338 NetDeviceContainer internetDevices = p2ph.Install(pgw, remoteHost);
339 Ipv4AddressHelper ipv4h;
340 ipv4h.SetBase("1.0.0.0", "255.0.0.0");
341 Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign(internetDevices);
342 // interface 0 is localhost, 1 is the p2p device
343 Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress(1);
344
345 Ipv4StaticRoutingHelper ipv4RoutingHelper;
346 Ptr<Ipv4StaticRouting> remoteHostStaticRouting =
347 ipv4RoutingHelper.GetStaticRouting(remoteHost->GetObject<Ipv4>());
348 remoteHostStaticRouting->AddNetworkRouteTo(Ipv4Address("7.0.0.0"), Ipv4Mask("255.0.0.0"), 1);
349
350 // Config::SetDefault ("ns3::LteAmc::AmcModel", EnumValue (LteAmc::PiroEW2010));
351 // Config::SetDefault ("ns3::LteAmc::Ber", DoubleValue (0.00005));
352 // Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
353 // Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
354
355 // Config::SetDefault ("ns3::LteEnbRrc::EpsBearerToRlcMapping", EnumValue
356 // (LteHelper::RLC_UM_ALWAYS));
357
358 // LogComponentDisableAll (LOG_LEVEL_ALL);
359 // LogComponentEnable ("LenaTestCqaFfMacScheduler", LOG_LEVEL_ALL);
360
361 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
362
363 // Create Nodes: eNodeB and UE
364 NodeContainer enbNodes;
365 NodeContainer ueNodes;
366 enbNodes.Create(1);
367 ueNodes.Create(m_nUser);
368
369 // Install Mobility Model
371 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
372 mobility.Install(enbNodes);
373 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
374 mobility.Install(ueNodes);
375
376 // Create Devices and install them in the Nodes (eNB and UE)
377 NetDeviceContainer enbDevs;
378 NetDeviceContainer ueDevs;
379 lteHelper->SetSchedulerType("ns3::CqaFfMacScheduler");
380 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
381 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
382 ueDevs = lteHelper->InstallUeDevice(ueNodes);
383
384 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
385 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
386 enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
387 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
388
389 // Set UEs' position and power
390 for (int i = 0; i < m_nUser; i++)
391 {
394 mm->SetPosition(Vector(m_dist, 0.0, 0.0));
395 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
396 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
397 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
398 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
399 }
400
401 // Install the IP stack on the UEs
402 internet.Install(ueNodes);
403 Ipv4InterfaceContainer ueIpIface;
404 ueIpIface = epcHelper->AssignUeIpv4Address(NetDeviceContainer(ueDevs));
405
406 // Assign IP address to UEs
407 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
408 {
409 Ptr<Node> ueNode = ueNodes.Get(u);
410 // Set the default gateway for the UE
411 Ptr<Ipv4StaticRouting> ueStaticRouting =
412 ipv4RoutingHelper.GetStaticRouting(ueNode->GetObject<Ipv4>());
413 ueStaticRouting->SetDefaultRoute(epcHelper->GetUeDefaultGatewayAddress(), 1);
414 }
415
416 // Attach a UE to a eNB
417 lteHelper->Attach(ueDevs, enbDevs.Get(0));
418
419 // Activate an EPS bearer on all UEs
420 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
421 {
422 Ptr<NetDevice> ueDevice = ueDevs.Get(u);
424 qos.gbrDl = (m_packetSize + 32) * (1000 / m_interval) *
425 8; // bit/s, considering IP, UDP, RLC, PDCP header size
426 qos.gbrUl = (m_packetSize + 32) * (1000 / m_interval) * 8;
427 qos.mbrDl = 0;
428 qos.mbrUl = 0;
429
430 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
431 EpsBearer bearer(q, qos);
432 lteHelper->ActivateDedicatedEpsBearer(ueDevice, bearer, EpcTft::Default());
433 }
434
435 // Install downlink and uplink applications
436 uint16_t dlPort = 1234;
437 uint16_t ulPort = 2000;
440 PacketSinkHelper dlPacketSinkHelper("ns3::UdpSocketFactory",
441 InetSocketAddress(Ipv4Address::GetAny(), dlPort));
442
443 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
444 {
445 ++ulPort;
446 PacketSinkHelper ulPacketSinkHelper("ns3::UdpSocketFactory",
447 InetSocketAddress(Ipv4Address::GetAny(), ulPort));
448 serverApps.Add(ulPacketSinkHelper.Install(remoteHost)); // receive packets from UEs
449 serverApps.Add(
450 dlPacketSinkHelper.Install(ueNodes.Get(u))); // receive packets from remotehost
451
452 UdpClientHelper dlClient(ueIpIface.GetAddress(u), dlPort); // downlink packets generator
453 dlClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
454 dlClient.SetAttribute("MaxPackets", UintegerValue(1000000));
455 dlClient.SetAttribute("PacketSize", UintegerValue(m_packetSize));
456
457 UdpClientHelper ulClient(remoteHostAddr, ulPort); // uplink packets generator
458 ulClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
459 ulClient.SetAttribute("MaxPackets", UintegerValue(1000000));
460 ulClient.SetAttribute("PacketSize", UintegerValue(m_packetSize));
461
462 clientApps.Add(dlClient.Install(remoteHost));
463 clientApps.Add(ulClient.Install(ueNodes.Get(u)));
464 }
465
466 serverApps.Start(Seconds(0.030));
467 clientApps.Start(Seconds(0.030));
468
469 double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
470 double statsDuration = 0.6;
471 double tolerance = 0.1;
472 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.0001));
473
474 lteHelper->EnableRlcTraces();
475 lteHelper->EnableMacTraces();
476 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
477 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
478 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
479
480 Simulator::Run();
481
482 NS_LOG_INFO("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
483 std::vector<uint64_t> dlDataRxed;
484 for (int i = 0; i < m_nUser; i++)
485 {
486 // get the imsi
487 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
488 // get the lcId
489 uint8_t lcId = 4;
490 uint64_t data = rlcStats->GetDlRxData(imsi, lcId);
491 dlDataRxed.push_back(data);
492 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at(i)
493 << " thr " << (double)dlDataRxed.at(i) / statsDuration << " ref "
494 << m_thrRefDl);
495 }
496
497 for (int i = 0; i < m_nUser; i++)
498 {
499 NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
501 m_thrRefDl * tolerance,
502 " Unfair Throughput!");
503 }
504
509 NS_LOG_INFO("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
510 std::vector<uint64_t> ulDataRxed;
511 for (int i = 0; i < m_nUser; i++)
512 {
513 // get the imsi
514 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
515 // get the lcId
516 uint8_t lcId = 4;
517 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
518 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " bytes rxed " << (double)ulDataRxed.at(i)
519 << " thr " << (double)ulDataRxed.at(i) / statsDuration << " ref "
520 << m_thrRefUl);
521 }
522
523 for (int i = 0; i < m_nUser; i++)
524 {
525 NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
527 m_thrRefUl * tolerance,
528 " Unfair Throughput!");
529 }
530 Simulator::Destroy();
531}
532
533// --------------- T E S T - C A S E # 2 ------------------------------
534
535std::string
536LenaCqaFfMacSchedulerTestCase2::BuildNameString(uint16_t nUser, std::vector<double> dist)
537{
538 std::ostringstream oss;
539 oss << "distances (m) = [ ";
540 for (std::vector<double>::iterator it = dist.begin(); it != dist.end(); ++it)
541 {
542 oss << *it << " ";
543 }
544 oss << "]";
545 return oss.str();
546}
547
549 std::vector<uint32_t> estThrCqaDl,
550 std::vector<uint16_t> packetSize,
551 uint16_t interval,
552 bool errorModelEnabled)
553 : TestCase(BuildNameString(dist.size(), dist)),
554 m_nUser(dist.size()),
555 m_dist(dist),
556 m_packetSize(packetSize),
557 m_interval(interval),
558 m_estThrCqaDl(estThrCqaDl),
559 m_errorModelEnabled(errorModelEnabled)
560{
561}
562
564{
565}
566
567void
569{
571 {
572 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
573 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
574 }
575
576 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
577 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
578 StringValue(CreateTempDirFilename("DlMacStats.txt")));
579 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
580 StringValue(CreateTempDirFilename("UlMacStats.txt")));
581 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
582 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
583 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
584 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
585
586 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
587 Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper>();
588 lteHelper->SetEpcHelper(epcHelper);
589
590 Ptr<Node> pgw = epcHelper->GetPgwNode();
591
592 // Create a single RemoteHost
593 NodeContainer remoteHostContainer;
594 remoteHostContainer.Create(1);
595 Ptr<Node> remoteHost = remoteHostContainer.Get(0);
596 InternetStackHelper internet;
597 internet.Install(remoteHostContainer);
598
599 // Create the Internet
601 p2ph.SetDeviceAttribute("DataRate", DataRateValue(DataRate("100Gb/s")));
602 p2ph.SetDeviceAttribute("Mtu", UintegerValue(1500));
603 p2ph.SetChannelAttribute("Delay", TimeValue(Seconds(0.001)));
604 NetDeviceContainer internetDevices = p2ph.Install(pgw, remoteHost);
605 Ipv4AddressHelper ipv4h;
606 ipv4h.SetBase("1.0.0.0", "255.0.0.0");
607 Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign(internetDevices);
608 // interface 0 is localhost, 1 is the p2p device
609 Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress(1);
610
611 Ipv4StaticRoutingHelper ipv4RoutingHelper;
612 Ptr<Ipv4StaticRouting> remoteHostStaticRouting =
613 ipv4RoutingHelper.GetStaticRouting(remoteHost->GetObject<Ipv4>());
614 remoteHostStaticRouting->AddNetworkRouteTo(Ipv4Address("7.0.0.0"), Ipv4Mask("255.0.0.0"), 1);
615
616 // LogComponentDisableAll (LOG_LEVEL_ALL);
617 // LogComponentEnable ("LenaTestCqaFfMacScheduler", LOG_LEVEL_ALL);
618
619 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
620
621 // Create Nodes: eNodeB and UE
622 NodeContainer enbNodes;
623 NodeContainer ueNodes;
624 enbNodes.Create(1);
625 ueNodes.Create(m_nUser);
626
627 // Install Mobility Model
629 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
630 mobility.Install(enbNodes);
631 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
632 mobility.Install(ueNodes);
633
634 // Create Devices and install them in the Nodes (eNB and UE)
635 NetDeviceContainer enbDevs;
636 NetDeviceContainer ueDevs;
637 lteHelper->SetSchedulerType("ns3::CqaFfMacScheduler");
638 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
639 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
640 ueDevs = lteHelper->InstallUeDevice(ueNodes);
641
642 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
643 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
644 enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
645 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
646
647 // Set UEs' position and power
648 for (int i = 0; i < m_nUser; i++)
649 {
652 mm->SetPosition(Vector(m_dist.at(i), 0.0, 0.0));
653 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
654 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
655 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
656 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
657 }
658
659 // Install the IP stack on the UEs
660 internet.Install(ueNodes);
661 Ipv4InterfaceContainer ueIpIface;
662 ueIpIface = epcHelper->AssignUeIpv4Address(NetDeviceContainer(ueDevs));
663
664 // Assign IP address to UEs
665 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
666 {
667 Ptr<Node> ueNode = ueNodes.Get(u);
668 // Set the default gateway for the UE
669 Ptr<Ipv4StaticRouting> ueStaticRouting =
670 ipv4RoutingHelper.GetStaticRouting(ueNode->GetObject<Ipv4>());
671 ueStaticRouting->SetDefaultRoute(epcHelper->GetUeDefaultGatewayAddress(), 1);
672 }
673
674 // Attach a UE to a eNB
675 lteHelper->Attach(ueDevs, enbDevs.Get(0));
676
677 // Activate an EPS bearer on all UEs
678
679 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
680 {
681 Ptr<NetDevice> ueDevice = ueDevs.Get(u);
683 qos.gbrDl = (m_packetSize.at(u) + 32) * (1000 / m_interval) *
684 8; // bit/s, considering IP, UDP, RLC, PDCP header size
685 qos.gbrUl = (m_packetSize.at(u) + 32) * (1000 / m_interval) * 8;
686 qos.mbrDl = qos.gbrDl;
687 qos.mbrUl = qos.gbrUl;
688
689 enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
690 EpsBearer bearer(q, qos);
691 lteHelper->ActivateDedicatedEpsBearer(ueDevice, bearer, EpcTft::Default());
692 }
693
694 // Install downlink and uplink applications
695 uint16_t dlPort = 1234;
696 uint16_t ulPort = 2000;
699 PacketSinkHelper dlPacketSinkHelper("ns3::UdpSocketFactory",
700 InetSocketAddress(Ipv4Address::GetAny(), dlPort));
701
702 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
703 {
704 ++ulPort;
705 PacketSinkHelper ulPacketSinkHelper("ns3::UdpSocketFactory",
706 InetSocketAddress(Ipv4Address::GetAny(), ulPort));
707 serverApps.Add(ulPacketSinkHelper.Install(remoteHost)); // receive packets from UEs
708 serverApps.Add(
709 dlPacketSinkHelper.Install(ueNodes.Get(u))); // receive packets from remotehost
710
711 UdpClientHelper dlClient(ueIpIface.GetAddress(u), dlPort); // downlink packets generator
712 dlClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
713 dlClient.SetAttribute("MaxPackets", UintegerValue(1000000));
714 dlClient.SetAttribute("PacketSize", UintegerValue(m_packetSize.at(u)));
715
716 UdpClientHelper ulClient(remoteHostAddr, ulPort); // uplink packets generator
717 ulClient.SetAttribute("Interval", TimeValue(MilliSeconds(m_interval)));
718 ulClient.SetAttribute("MaxPackets", UintegerValue(1000000));
719 ulClient.SetAttribute("PacketSize", UintegerValue(m_packetSize.at(u)));
720
721 clientApps.Add(dlClient.Install(remoteHost));
722 clientApps.Add(ulClient.Install(ueNodes.Get(u)));
723 }
724
725 serverApps.Start(Seconds(0.030));
726 clientApps.Start(Seconds(0.030));
727
728 double statsStartTime = 0.04; // need to allow for RRC connection establishment + SRS
729 double statsDuration = 0.5;
730 double tolerance = 0.1;
731 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.0001));
732
733 lteHelper->EnableRlcTraces();
734 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
735 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
736 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
737
738 Simulator::Run();
739
745 NS_LOG_INFO("DL - Test with " << m_nUser << " user(s)");
746 std::vector<uint64_t> dlDataRxed;
747 for (int i = 0; i < m_nUser; i++)
748 {
749 // get the imsi
750 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
751 // get the lcId
752 uint8_t lcId = 4;
753 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
754 NS_LOG_INFO("\tUser " << i << " dist " << m_dist.at(i) << " imsi " << imsi << " bytes rxed "
755 << (double)dlDataRxed.at(i) << " thr "
756 << (double)dlDataRxed.at(i) / statsDuration << " ref "
757 << m_estThrCqaDl.at(i));
758 }
759
760 for (int i = 0; i < m_nUser; i++)
761 {
762 NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
763 m_estThrCqaDl.at(i),
764 m_estThrCqaDl.at(i) * tolerance,
765 " Unfair Throughput!");
766 }
767
768 Simulator::Destroy();
769}
double m_dist
distance between the nodes
double m_thrRefUl
estimated uplink throughput
void DoRun() override
Implementation to actually run this TestCase.
uint16_t m_packetSize
packet size in bytes
LenaCqaFfMacSchedulerTestCase1(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, uint16_t packetSize, uint16_t interval, bool errorModelEnabled)
Constructor.
double m_thrRefDl
estimated downlink throughput
static std::string BuildNameString(uint16_t nUser, double dist)
Builds the test name string based on provided parameter values.
bool m_errorModelEnabled
whether error model is enabled
bool m_errorModelEnabled
whether the error model is enabled
uint16_t m_interval
UDP interval time in ms.
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
LenaCqaFfMacSchedulerTestCase2(std::vector< double > dist, std::vector< uint32_t > estThrCqaDl, std::vector< uint16_t > packetSize, uint16_t interval, bool errorModelEnabled)
Constructor.
std::vector< uint16_t > m_packetSize
packet size in bytes
std::vector< uint32_t > m_estThrCqaDl
estimated throughput CQA DL
void DoRun() override
Implementation to actually run this TestCase.
The test suite for testing CQA scheduler functionality.
holds a vector of ns3::Application pointers.
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...
AttributeValue implementation for DataRate.
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:56
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.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
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:43
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:79
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:258
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:282
Ptr< RadioBearerStatsCalculator > GetRlcStats()
Definition: lte-helper.cc:1708
void SetSchedulerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the scheduler to be created.
Definition: lte-helper.cc:303
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:482
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:289
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:1044
void EnableRlcTraces()
Enable trace sinks for RLC layer.
Definition: lte-helper.cc:1563
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:497
void EnableMacTraces()
Enable trace sinks for MAC layer.
Definition: lte-helper.cc:1666
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:1159
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:258
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:42
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:305
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:442
std::string GetName() const
Definition: test.cc:377
A suite of tests to run.
Definition: test.h:1256
AttributeValue implementation for Time.
Definition: nstime.h:1425
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:891
#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
void(* DataRate)(DataRate oldValue, DataRate newValue)
TracedValue callback signature for DataRate.
Definition: data-rate.h:328
#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:1338
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1350
static LenaTestCqaFfMacSchedulerSuite lenaTestCqaFfMacSchedulerSuite
serverApps
Definition: first.py:48
clientApps
Definition: first.py:58
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mobility
Definition: third.py:96
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.