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 * 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 */
20
22
23#include "ns3/double.h"
24#include "ns3/radio-bearer-stats-calculator.h"
25#include "ns3/string.h"
26#include <ns3/boolean.h>
27#include <ns3/constant-position-mobility-model.h>
28#include <ns3/enum.h>
29#include <ns3/eps-bearer.h>
30#include <ns3/ff-mac-scheduler.h>
31#include <ns3/log.h>
32#include <ns3/lte-enb-net-device.h>
33#include <ns3/lte-enb-phy.h>
34#include <ns3/lte-helper.h>
35#include <ns3/lte-ue-net-device.h>
36#include <ns3/lte-ue-phy.h>
37#include <ns3/lte-ue-rrc.h>
38#include <ns3/mobility-helper.h>
39#include <ns3/net-device-container.h>
40#include <ns3/node-container.h>
41#include <ns3/object.h>
42#include <ns3/packet.h>
43#include <ns3/ptr.h>
44#include <ns3/simulator.h>
45#include <ns3/spectrum-error-model.h>
46#include <ns3/spectrum-interference.h>
47#include <ns3/test.h>
48
49#include <iostream>
50
51using namespace ns3;
52
53NS_LOG_COMPONENT_DEFINE("LenaTestRrFfMacScheduler");
54
56 : TestSuite("lte-rr-ff-mac-scheduler", Type::SYSTEM)
57{
58 NS_LOG_INFO("creating LenaRrFfMacSchedulerTestCase");
59
60 bool errorModel = true;
61
62 // DOWNLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
63 // 1 user -> 24 PRB at Itbs 26 -> 2196 -> 2196000 bytes/sec
64 // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
65 // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
66 // 9 user -> 2 PRB at Itbs 26 -> 185 -> 185000 bytes/sec
67 // 12 users -> 2 PRB at Itbs 26 -> 185 -> 185000 bytes/sec
68 // 15 users -> 2 PRB at Itbs 26 * 0.8 -> 148 -> 148000 bytes/sec
69 // UPLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
70 // 1 user -> 25 PRB at Itbs 26 -> 2292 -> 2292000 bytes/sec
71 // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
72 // 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
73 // after the patch enforcing min 3 PRBs per UE:
74 // 9 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/9 UE/TTI -> 246220 bytes/sec
75 // 12 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/12 UE/TTI -> 184670 bytes/sec
76 // 15 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/15 UE/TTI -> 147730 bytes/sec
77 AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 0, 2196000, 2292000, errorModel),
78 TestCase::Duration::EXTENSIVE);
79 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 0, 749000, 749000, errorModel),
80 TestCase::Duration::QUICK);
81 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 0, 373000, 373000, errorModel),
82 TestCase::Duration::EXTENSIVE);
83 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 0, 185000, 246220, errorModel),
84 TestCase::Duration::EXTENSIVE);
85 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 0, 185000, 184670, errorModel),
86 TestCase::Duration::EXTENSIVE);
87 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 0, 148000, 147730, errorModel),
88 TestCase::Duration::EXTENSIVE);
89
90 // DOWNLINK - DISTANCE 4800 -> MCS 22 -> Itbs 20 (from table 7.1.7.2.1-1 of 36.213)
91 // 1 user -> 24 PRB at Itbs 20 -> 1383 -> 1383000 bytes/sec
92 // 3 users -> 8 PRB at Itbs 20 -> 469 -> 469000 bytes/sec
93 // 6 users -> 4 PRB at Itbs 20 -> 233 -> 233000 bytes/sec
94 // 9 user -> 2 PRB at Itbs 20 -> 113 -> 113000 bytes/sec
95 // 12 users -> 2 PRB at Itbs 20 -> 113 -> 113000 bytes/sec
96 // 15 users -> 2 PRB at Itbs 20 * 0.8 -> 90.4 -> 90400 bytes/sec
97 // UPLINK - DISTANCE 4800 -> MCS 14 -> Itbs 13 (from table 7.1.7.2.1-1 of 36.213)
98 // 1 user -> 25 PRB at Itbs 13 -> 807 -> 807000 bytes/sec
99 // 3 users -> 8 PRB at Itbs 13 -> 253 -> 253000 bytes/sec
100 // 6 users -> 4 PRB at Itbs 13 -> 125 -> 125000 bytes/sec
101 // after the patch enforcing min 3 PRBs per UE:
102 // 9 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/9 UE/TTI -> 82667 bytes/sec
103 // 12 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/12 UE/TTI -> 62000 bytes/sec
104 // 15 users -> 3 PRB at Itbs 13 -> 93 bytes * 8/15 UE/TTI -> 49600 bytes/sec
105 AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 4800, 1383000, 807000, errorModel),
106 TestCase::Duration::EXTENSIVE);
107 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 4800, 469000, 253000, errorModel),
108 TestCase::Duration::EXTENSIVE);
109 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 4800, 233000, 125000, errorModel),
110 TestCase::Duration::EXTENSIVE);
111 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 4800, 113000, 82667, errorModel),
112 TestCase::Duration::EXTENSIVE);
113 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 4800, 113000, 62000, errorModel),
114 TestCase::Duration::EXTENSIVE);
115 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 4800, 90400, 49600, errorModel),
116 TestCase::Duration::EXTENSIVE);
117
118 // DOWNLINK - DISTANCE 6000 -> MCS 20 -> Itbs 18 (from table 7.1.7.2.1-1 of 36.213)
119 // 1 user -> 24 PRB at Itbs 15 -> 1191 -> 1191000 bytes/sec
120 // 3 users -> 8 PRB at Itbs 15 -> 389 -> 389000 bytes/sec
121 // 6 users -> 4 PRB at Itbs 15 -> 193 -> 193000 bytes/sec
122 // 9 user -> 2 PRB at Itbs 15 -> 97 -> 97000 bytes/sec
123 // 12 users -> 2 PRB at Itbs 15 -> 97 -> 97000 bytes/sec
124 // 15 users -> 2 PRB at Itbs 15 * 0.8 -> 77.6 -> 77600 bytes/sec
125 // UPLINK - DISTANCE 6000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
126 // 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 bytes/sec
127 // 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 bytes/sec
128 // 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 bytes/sec
129 // 9 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/9 UE/TTI -> 64889 bytes/sec
130 // 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 bytes/sec
131 // 15 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/15 UE/TTI -> 38993 bytes/sec
132 AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 6000, 1191000, 621000, errorModel),
133 TestCase::Duration::EXTENSIVE);
134 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 6000, 389000, 201000, errorModel),
135 TestCase::Duration::EXTENSIVE);
136 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 6000, 193000, 97000, errorModel),
137 TestCase::Duration::EXTENSIVE);
138 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 6000, 97000, 64889, errorModel),
139 TestCase::Duration::EXTENSIVE);
140 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 6000, 97000, 48667, errorModel),
141 TestCase::Duration::EXTENSIVE);
142 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 6000, 77600, 38993, errorModel),
143 TestCase::Duration::EXTENSIVE);
144
145 // DOWNLINK - DISTANCE 20000 -> MCS 8 -> Itbs 8 (from table 7.1.7.2.1-1 of 36.213)
146 // 1 user -> 24 PRB at Itbs 8 -> 421 -> 421000 bytes/sec
147 // 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
148 // 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
149 // 9 user -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
150 // 12 users -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
151 // 15 users -> 2 PRB at Itbs 8 * 0.8 -> 25.6 -> 25600 bytes/sec
152 // UPLINK - DISTANCE 20000 -> MCS 2 -> Itbs 2 (from table 7.1.7.2.1-1 of 36.213)
153 // 1 user -> 25 PRB at Itbs 2 -> 137 -> 137000 bytes/sec
154 // 3 users -> 8 PRB at Itbs 2 -> 41 -> 41000 bytes/sec
155 // 6 users -> 4 PRB at Itbs 2 -> 22 -> 22000 bytes/sec
156 // after the patch enforcing min 3 PRBs per UE:
157 // 9 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/9 UE/TTI -> 16000 bytes/sec
158 // 12 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/12 UE/TTI -> 12000 bytes/sec
159 // 15 users -> 3 PRB at Itbs 2 -> 18 bytes * 8/15 UE/TTI -> 9600 bytes/sec
160 AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 20000, 421000, 137000, errorModel),
161 TestCase::Duration::EXTENSIVE);
162 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 20000, 137000, 41000, errorModel),
163 TestCase::Duration::EXTENSIVE);
164 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 20000, 67000, 22000, errorModel),
165 TestCase::Duration::EXTENSIVE);
166 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 20000, 32000, 16000, errorModel),
167 TestCase::Duration::EXTENSIVE);
168 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 20000, 32000, 12000, errorModel),
169 TestCase::Duration::EXTENSIVE);
170 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 20000, 25600, 9600, errorModel),
171 TestCase::Duration::EXTENSIVE);
172
173 // DOWNLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
174 // UPLINK - DISTANCE 100000 -> CQI == 0 -> out of range -> 0 bytes/sec
175 AddTestCase(new LenaRrFfMacSchedulerTestCase(1, 100000, 0, 0, errorModel),
176 TestCase::Duration::QUICK);
177}
178
184
185std::string
187{
188 std::ostringstream oss;
189 oss << nUser << " UEs, distance " << dist << " m";
190 return oss.str();
191}
192
194 double dist,
195 double thrRefDl,
196 double thrRefUl,
197 bool errorModelEnabled)
198 : TestCase(BuildNameString(nUser, dist)),
199 m_nUser(nUser),
200 m_dist(dist),
201 m_thrRefDl(thrRefDl),
202 m_thrRefUl(thrRefUl),
203 m_errorModelEnabled(errorModelEnabled)
204{
205}
206
208{
209}
210
211void
213{
214 NS_LOG_FUNCTION(this << m_nUser << m_dist);
216 {
217 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
218 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
219 }
220 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(false));
221 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
222 StringValue(CreateTempDirFilename("DlMacStats.txt")));
223 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
224 StringValue(CreateTempDirFilename("UlMacStats.txt")));
225 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
226 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
227 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
228 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
229
230 // This is needed as the RR scheduler does not allocate resources properly for retransmission
231 Config::SetDefault("ns3::LteRlcAm::TxOpportunityForRetxAlwaysBigEnough", BooleanValue(true));
232
233 // Disable Uplink Power Control
234 Config::SetDefault("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue(false));
235
240 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
241
242 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
243
244 // Create Nodes: eNodeB and UE
245 NodeContainer enbNodes;
246 NodeContainer ueNodes;
247 enbNodes.Create(1);
248 ueNodes.Create(m_nUser);
249
250 // Install Mobility Model
251 MobilityHelper mobility;
252 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
253 mobility.Install(enbNodes);
254 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
255 mobility.Install(ueNodes);
256
257 // Create Devices and install them in the Nodes (eNB and UE)
258 NetDeviceContainer enbDevs;
259 NetDeviceContainer ueDevs;
260 lteHelper->SetSchedulerType("ns3::RrFfMacScheduler");
261 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
262 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
263 ueDevs = lteHelper->InstallUeDevice(ueNodes);
264
265 // Attach a UE to a eNB
266 lteHelper->Attach(ueDevs, enbDevs.Get(0));
267
268 // Activate an EPS bearer
270 EpsBearer bearer(q);
271 lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
272
273 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
274 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
275 enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
276 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
277
278 // Set UEs' position and power
279 for (int i = 0; i < m_nUser; i++)
280 {
283 mm->SetPosition(Vector(m_dist, 0.0, 0.0));
284 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
285 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
286 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
287 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
288 }
289
290 double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
291 double statsDuration = 0.4;
292 double tolerance = 0.1;
293 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.0001));
294
295 lteHelper->EnableRlcTraces();
296 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
297 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
298 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
299
301
305 NS_LOG_INFO("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
306 std::vector<uint64_t> dlDataRxed;
308 {
309 m_thrRefDl *= 0.95; // for counting the Vienna AMC behavior: BLER between 0% and 10%
310 }
311 for (int i = 0; i < m_nUser; i++)
312 {
313 // get the imsi
314 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
315 uint8_t lcId = 3;
316 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
317 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t)lcId
318 << " bytes rxed " << (double)dlDataRxed.at(i) << " thr "
319 << (double)dlDataRxed.at(i) / statsDuration << " ref " << m_thrRefDl);
320 NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
322 m_thrRefDl * tolerance,
323 " Unfair Throughput!");
324 }
325
326 NS_LOG_INFO("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
327 std::vector<uint64_t> ulDataRxed;
329 {
330 m_thrRefUl *= 0.95; // for counting the Vienna AMC behavior: BLER between 0% and 10%
331 }
332 for (int i = 0; i < m_nUser; i++)
333 {
334 // get the imsi
335 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
336 // get the lcId
337 uint8_t lcId = 3;
338 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
339 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t)lcId
340 << " bytes rxed " << (double)ulDataRxed.at(i) << " thr "
341 << (double)ulDataRxed.at(i) / statsDuration << " ref " << m_thrRefUl
342 << " txed " << rlcStats->GetUlTxData(imsi, lcId) / statsDuration);
343 NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
345 m_thrRefUl * tolerance,
346 " Unfair Throughput!");
347 }
348
350}
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:37
Mobility model for which the current position does not change once it has been set and until it is se...
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:42
Hold variables of type enum.
Definition: enum.h:62
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:91
Qci
QoS Class Indicator.
Definition: eps-bearer.h:106
@ GBR_CONV_VOICE
GBR Conversational Voice.
Definition: eps-bearer.h:107
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:522
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
A suite of tests to run.
Definition: test.h:1268
Type
Type of test.
Definition: test.h:1275
AttributeValue implementation for Time.
Definition: nstime.h:1413
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 LenaTestRrFfMacSchedulerSuite lenaTestRrFfMacSchedulerSuite
Static variable for test initialization.
#define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report and...
Definition: test.h:338
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1326
Every class exported by the ns3 library is enclosed in the ns3 namespace.