A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
lte-test-rr-ff-mac-scheduler.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Marco Miozzo <marco.miozzo@cttc.es>
7 * Nicola Baldo <nbaldo@cttc.es>
8 */
9
11
12#include "ns3/boolean.h"
13#include "ns3/constant-position-mobility-model.h"
14#include "ns3/double.h"
15#include "ns3/enum.h"
16#include "ns3/eps-bearer.h"
17#include "ns3/ff-mac-scheduler.h"
18#include "ns3/log.h"
19#include "ns3/lte-enb-net-device.h"
20#include "ns3/lte-enb-phy.h"
21#include "ns3/lte-helper.h"
22#include "ns3/lte-ue-net-device.h"
23#include "ns3/lte-ue-phy.h"
24#include "ns3/lte-ue-rrc.h"
25#include "ns3/mobility-helper.h"
26#include "ns3/net-device-container.h"
27#include "ns3/node-container.h"
28#include "ns3/object.h"
29#include "ns3/packet.h"
30#include "ns3/ptr.h"
31#include "ns3/radio-bearer-stats-calculator.h"
32#include "ns3/simulator.h"
33#include "ns3/spectrum-error-model.h"
34#include "ns3/spectrum-interference.h"
35#include "ns3/string.h"
36#include "ns3/test.h"
37
38#include <iostream>
39
40using namespace ns3;
41
42NS_LOG_COMPONENT_DEFINE("LenaTestRrFfMacScheduler");
43
45 : TestSuite("lte-rr-ff-mac-scheduler", Type::SYSTEM)
46{
47 NS_LOG_INFO("creating LenaRrFfMacSchedulerTestCase");
48
49 bool errorModel = true;
50
51 // DOWNLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
52 // 1 user -> 24 PRB at Itbs 26 -> 2196 -> 2196000 bytes/sec
53 // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
54 // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
55 // 9 user -> 2 PRB at Itbs 26 -> 185 -> 185000 bytes/sec
56 // 12 users -> 2 PRB at Itbs 26 -> 185 -> 185000 bytes/sec
57 // 15 users -> 2 PRB at Itbs 26 * 0.8 -> 148 -> 148000 bytes/sec
58 // UPLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
59 // 1 user -> 25 PRB at Itbs 26 -> 2292 -> 2292000 bytes/sec
60 // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
61 // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
62 // after the patch enforcing min 3 PRBs per UE:
63 // 9 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/9 UE/TTI -> 246220 bytes/sec
64 // 12 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/12 UE/TTI -> 184670 bytes/sec
65 // 15 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/15 UE/TTI -> 147730 bytes/sec
66 AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 0, 2196000, 2292000, errorModel),
67 TestCase::Duration::EXTENSIVE);
68 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 0, 749000, 749000, errorModel),
69 TestCase::Duration::QUICK);
70 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 0, 373000, 373000, errorModel),
71 TestCase::Duration::EXTENSIVE);
72 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 0, 185000, 246220, errorModel),
73 TestCase::Duration::EXTENSIVE);
74 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 0, 185000, 184670, errorModel),
75 TestCase::Duration::EXTENSIVE);
76 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 0, 148000, 147730, errorModel),
77 TestCase::Duration::EXTENSIVE);
78
79 // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
80 // 1 user -> 24 PRB at Itbs 20 -> 1383 -> 1383000 bytes/sec
81 // 3 users -> 8 PRB at Itbs 20 -> 469 -> 469000 bytes/sec
82 // 6 users -> 4 PRB at Itbs 20 -> 233 -> 233000 bytes/sec
83 // 9 user -> 2 PRB at Itbs 20 -> 113 -> 113000 bytes/sec
84 // 12 users -> 2 PRB at Itbs 20 -> 113 -> 113000 bytes/sec
85 // 15 users -> 2 PRB at Itbs 20 * 0.8 -> 90.4 -> 90400 bytes/sec
86 // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
87 // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 bytes/sec
88 // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 bytes/sec
89 // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 bytes/sec
90 // after the patch enforcing min 3 PRBs per UE:
91 // 9 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/9 UE/TTI -> 82667 bytes/sec
92 // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 bytes/sec
93 // 15 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/15 UE/TTI -> 49600 bytes/sec
94 AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 4800, 1383000, 807000, errorModel),
95 TestCase::Duration::EXTENSIVE);
96 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 4800, 469000, 253000, errorModel),
97 TestCase::Duration::EXTENSIVE);
98 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 4800, 233000, 125000, errorModel),
99 TestCase::Duration::EXTENSIVE);
100 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 4800, 113000, 82667, errorModel),
101 TestCase::Duration::EXTENSIVE);
102 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 4800, 113000, 62000, errorModel),
103 TestCase::Duration::EXTENSIVE);
104 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 4800, 90400, 49600, errorModel),
105 TestCase::Duration::EXTENSIVE);
106
107 // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
108 // 1 user -> 24 PRB at Itbs 15 -> 1191 -> 1191000 bytes/sec
109 // 3 users -> 8 PRB at Itbs 15 -> 389 -> 389000 bytes/sec
110 // 6 users -> 4 PRB at Itbs 15 -> 193 -> 193000 bytes/sec
111 // 9 user -> 2 PRB at Itbs 15 -> 97 -> 97000 bytes/sec
112 // 12 users -> 2 PRB at Itbs 15 -> 97 -> 97000 bytes/sec
113 // 15 users -> 2 PRB at Itbs 15 * 0.8 -> 77.6 -> 77600 bytes/sec
114 // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
115 // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 bytes/sec
116 // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 bytes/sec
117 // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 bytes/sec
118 // 9 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/9 UE/TTI -> 64889 bytes/sec
119 // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 bytes/sec
120 // 15 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/15 UE/TTI -> 38993 bytes/sec
121 AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 6000, 1191000, 621000, errorModel),
122 TestCase::Duration::EXTENSIVE);
123 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 6000, 389000, 201000, errorModel),
124 TestCase::Duration::EXTENSIVE);
125 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 6000, 193000, 97000, errorModel),
126 TestCase::Duration::EXTENSIVE);
127 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 6000, 97000, 64889, errorModel),
128 TestCase::Duration::EXTENSIVE);
129 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 6000, 97000, 48667, errorModel),
130 TestCase::Duration::EXTENSIVE);
131 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 6000, 77600, 38993, errorModel),
132 TestCase::Duration::EXTENSIVE);
133
134 // DOWNLINK - DISTANCE 20000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
135 // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 bytes/sec
136 // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
137 // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
138 // 9 user -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
139 // 12 users -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
140 // 15 users -> 2 PRB at Itbs 8 * 0.8 -> 25.6 -> 25600 bytes/sec
141 // UPLINK - DISTANCE 20000 -> MCS 2 -> Itbs 2 (from table 7.1.7.2.1-1 of 36.213)
142 // 1 user -> 25 PRB at Itbs 2 -> 137 -> 137000 bytes/sec
143 // 3 users -> 8 PRB at Itbs 2 -> 41 -> 41000 bytes/sec
144 // 6 users -> 4 PRB at Itbs 2 -> 22 -> 22000 bytes/sec
145 // after the patch enforcing min 3 PRBs per UE:
146 // 9 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/9 UE/TTI -> 16000 bytes/sec
147 // 12 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/12 UE/TTI -> 12000 bytes/sec
148 // 15 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/15 UE/TTI -> 9600 bytes/sec
149 AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 20000, 421000, 137000, errorModel),
150 TestCase::Duration::EXTENSIVE);
151 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 20000, 137000, 41000, errorModel),
152 TestCase::Duration::EXTENSIVE);
153 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 20000, 67000, 22000, errorModel),
154 TestCase::Duration::EXTENSIVE);
155 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 20000, 32000, 16000, errorModel),
156 TestCase::Duration::EXTENSIVE);
157 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 20000, 32000, 12000, errorModel),
158 TestCase::Duration::EXTENSIVE);
159 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 20000, 25600, 9600, errorModel),
160 TestCase::Duration::EXTENSIVE);
161
162 // DOWNLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
163 // UPLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
164 AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 100000, 0, 0, errorModel),
165 TestCase::Duration::QUICK);
166}
167
168/**
169 * @ingroup lte-test
170 * Static variable for test initialization
171 */
173
174std::string
176{
177 std::ostringstream oss;
178 oss << nUser << " UEs, distance " << dist << " m";
179 return oss.str();
180}
181
183 double dist,
184 double thrRefDl,
185 double thrRefUl,
186 bool errorModelEnabled)
187 : TestCase(BuildNameString(nUser, dist)),
188 m_nUser(nUser),
189 m_dist(dist),
190 m_thrRefDl(thrRefDl),
191 m_thrRefUl(thrRefUl),
192 m_errorModelEnabled(errorModelEnabled)
193{
194}
195
199
200void
202{
203 NS_LOG_FUNCTION(this << m_nUser << m_dist);
204 SetDataDir(NS_TEST_SOURCEDIR);
206 {
207 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
208 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
209 }
210 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(false));
211 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
212 StringValue(CreateTempDirFilename("DlMacStats.txt")));
213 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
214 StringValue(CreateTempDirFilename("UlMacStats.txt")));
215 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
216 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
217 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
218 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
219
220 // This is needed as the RR scheduler does not allocate resources properly for retransmission
221 Config::SetDefault("ns3::LteRlcAm::TxOpportunityForRetxAlwaysBigEnough", BooleanValue(true));
222
223 // Disable Uplink Power Control
224 Config::SetDefault("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue(false));
225
226 /**
227 * Initialize Simulation Scenario: 1 eNB and m_nUser UEs
228 */
229
231
232 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
233
234 // Create Nodes: eNodeB and UE
235 NodeContainer enbNodes;
236 NodeContainer ueNodes;
237 enbNodes.Create(1);
238 ueNodes.Create(m_nUser);
239
240 // Install Mobility Model
241 MobilityHelper mobility;
242 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
243 mobility.Install(enbNodes);
244 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
245 mobility.Install(ueNodes);
246
247 // Create Devices and install them in the Nodes (eNB and UE)
248 NetDeviceContainer enbDevs;
249 NetDeviceContainer ueDevs;
250 lteHelper->SetSchedulerType("ns3::RrFfMacScheduler");
251 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
252 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
253 ueDevs = lteHelper->InstallUeDevice(ueNodes);
254
255 // Attach a UE to a eNB
256 lteHelper->Attach(ueDevs, enbDevs.Get(0));
257
258 // Activate an EPS bearer
260 EpsBearer bearer(q);
261 lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
262
263 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
264 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
265 enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
266 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
267
268 // Set UEs' position and power
269 for (int i = 0; i < m_nUser; i++)
270 {
273 mm->SetPosition(Vector(m_dist, 0.0, 0.0));
274 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
275 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
276 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
277 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
278 }
279
280 double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
281 double statsDuration = 0.4;
282 double tolerance = 0.1;
283 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.0001));
284
285 lteHelper->EnableRlcTraces();
286 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
287 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
288 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
289
291
292 /**
293 * Check that the assignment is done in a RR fashion
294 */
295 NS_LOG_INFO("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
296 std::vector<uint64_t> dlDataRxed;
298 {
299 m_thrRefDl *= 0.95; // for counting the Vienna AMC behavior: BLER between 0% and 10%
300 }
301 for (int i = 0; i < m_nUser; i++)
302 {
303 // get the imsi
304 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
305 uint8_t lcId = 3;
306 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
307 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t)lcId
308 << " bytes rxed " << (double)dlDataRxed.at(i) << " thr "
309 << (double)dlDataRxed.at(i) / statsDuration << " ref " << m_thrRefDl);
310 NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
312 m_thrRefDl * tolerance,
313 " Unfair Throughput!");
314 }
315
316 NS_LOG_INFO("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
317 std::vector<uint64_t> ulDataRxed;
319 {
320 m_thrRefUl *= 0.95; // for counting the Vienna AMC behavior: BLER between 0% and 10%
321 }
322 for (int i = 0; i < m_nUser; i++)
323 {
324 // get the imsi
325 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
326 // get the lcId
327 uint8_t lcId = 3;
328 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
329 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t)lcId
330 << " bytes rxed " << (double)ulDataRxed.at(i) << " thr "
331 << (double)ulDataRxed.at(i) / statsDuration << " ref " << m_thrRefUl
332 << " txed " << rlcStats->GetUlTxData(imsi, lcId) / statsDuration);
333 NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
335 m_thrRefUl * tolerance,
336 " Unfair Throughput!");
337 }
338
340}
This system test program creates different test cases with a single eNB and This system test program ...
double m_thrRefDl
the DL throughput reference
void DoRun() override
Implementation to actually run this TestCase.
double m_thrRefUl
the UL throughput reference
bool m_errorModelEnabled
indicates whether the error model is enabled
static std::string BuildNameString(uint16_t nUser, double dist)
Builds the test name string based on provided parameter values.
double m_dist
the distance between nodes
LenaRrFfMacSchedulerTestCase(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
Constructor.
Test suite for RrFfMacScheduler test.
AttributeValue implementation for Boolean.
Definition boolean.h:26
Mobility model for which the current position does not change once it has been set and until it is se...
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition double.h:31
Hold variables of type enum.
Definition enum.h:52
This class contains the specification of EPS Bearers.
Definition eps-bearer.h:80
Qci
QoS Class Indicator.
Definition eps-bearer.h:95
@ GBR_CONV_VOICE
GBR Conversational Voice.
Definition eps-bearer.h:96
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.
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:511
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void Run()
Run the simulation.
Definition simulator.cc:167
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition simulator.cc:175
Hold variables of type string.
Definition string.h:45
encapsulates test code
Definition test.h:1050
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Definition test.cc:292
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition test.cc:432
void SetDataDir(std::string directory)
Set the data directory where reference trace files can be found.
Definition test.cc:472
A suite of tests to run.
Definition test.h:1267
Type
Type of test.
Definition test.h:1274
AttributeValue implementation for Time.
Definition nstime.h:1432
void SetDefault(std::string name, const AttributeValue &value)
Definition config.cc:886
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#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:264
static LenaTestRrFfMacSchedulerSuite lenaTestRrFfMacSchedulerSuite
Static variable for test initialization.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:619
#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:327
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1345
Every class exported by the ns3 library is enclosed in the ns3 namespace.