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", 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),
79 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 0, 749000, 749000, errorModel),
81 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 0, 373000, 373000, errorModel),
83 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 0, 185000, 246220, errorModel),
85 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 0, 185000, 184670, errorModel),
87 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 0, 148000, 147730, errorModel),
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),
107 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 4800, 469000, 253000, errorModel),
109 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 4800, 233000, 125000, errorModel),
111 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 4800, 113000, 82667, errorModel),
113 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 4800, 113000, 62000, errorModel),
115 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 4800, 90400, 49600, errorModel),
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),
134 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 6000, 389000, 201000, errorModel),
136 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 6000, 193000, 97000, errorModel),
138 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 6000, 97000, 64889, errorModel),
140 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 6000, 97000, 48667, errorModel),
142 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 6000, 77600, 38993, errorModel),
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),
162 AddTestCase(new LenaRrFfMacSchedulerTestCase(3, 20000, 137000, 41000, errorModel),
164 AddTestCase(new LenaRrFfMacSchedulerTestCase(6, 20000, 67000, 22000, errorModel),
166 AddTestCase(new LenaRrFfMacSchedulerTestCase(9, 20000, 32000, 16000, errorModel),
168 AddTestCase(new LenaRrFfMacSchedulerTestCase(12, 20000, 32000, 12000, errorModel),
170 AddTestCase(new LenaRrFfMacSchedulerTestCase(15, 20000, 25600, 9600, errorModel),
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), TestCase::QUICK);
176}
177
183
184std::string
186{
187 std::ostringstream oss;
188 oss << nUser << " UEs, distance " << dist << " m";
189 return oss.str();
190}
191
193 double dist,
194 double thrRefDl,
195 double thrRefUl,
196 bool errorModelEnabled)
197 : TestCase(BuildNameString(nUser, dist)),
198 m_nUser(nUser),
199 m_dist(dist),
200 m_thrRefDl(thrRefDl),
201 m_thrRefUl(thrRefUl),
202 m_errorModelEnabled(errorModelEnabled)
203{
204}
205
207{
208}
209
210void
212{
213 NS_LOG_FUNCTION(this << m_nUser << m_dist);
215 {
216 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
217 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
218 }
219 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(false));
220 Config::SetDefault("ns3::MacStatsCalculator::DlOutputFilename",
221 StringValue(CreateTempDirFilename("DlMacStats.txt")));
222 Config::SetDefault("ns3::MacStatsCalculator::UlOutputFilename",
223 StringValue(CreateTempDirFilename("UlMacStats.txt")));
224 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
225 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
226 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
227 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
228
229 // This is needed as the RR scheduler does not allocate resources properly for retransmission
230 Config::SetDefault("ns3::LteRlcAm::TxOpportunityForRetxAlwaysBigEnough", BooleanValue(true));
231
232 // Disable Uplink Power Control
233 Config::SetDefault("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue(false));
234
239 Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
240
241 lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
242
243 // Create Nodes: eNodeB and UE
244 NodeContainer enbNodes;
245 NodeContainer ueNodes;
246 enbNodes.Create(1);
247 ueNodes.Create(m_nUser);
248
249 // Install Mobility Model
250 MobilityHelper mobility;
251 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
252 mobility.Install(enbNodes);
253 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
254 mobility.Install(ueNodes);
255
256 // Create Devices and install them in the Nodes (eNB and UE)
257 NetDeviceContainer enbDevs;
258 NetDeviceContainer ueDevs;
259 lteHelper->SetSchedulerType("ns3::RrFfMacScheduler");
260 lteHelper->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::SRS_UL_CQI));
261 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
262 ueDevs = lteHelper->InstallUeDevice(ueNodes);
263
264 // Attach a UE to a eNB
265 lteHelper->Attach(ueDevs, enbDevs.Get(0));
266
267 // Activate an EPS bearer
269 EpsBearer bearer(q);
270 lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
271
272 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
273 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
274 enbPhy->SetAttribute("TxPower", DoubleValue(30.0));
275 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
276
277 // Set UEs' position and power
278 for (int i = 0; i < m_nUser; i++)
279 {
282 mm->SetPosition(Vector(m_dist, 0.0, 0.0));
283 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
284 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
285 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
286 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
287 }
288
289 double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
290 double statsDuration = 0.4;
291 double tolerance = 0.1;
292 Simulator::Stop(Seconds(statsStartTime + statsDuration - 0.0001));
293
294 lteHelper->EnableRlcTraces();
295 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
296 rlcStats->SetAttribute("StartTime", TimeValue(Seconds(statsStartTime)));
297 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(statsDuration)));
298
300
304 NS_LOG_INFO("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
305 std::vector<uint64_t> dlDataRxed;
307 {
308 m_thrRefDl *= 0.95; // for counting the Vienna AMC behavior: BLER between 0% and 10%
309 }
310 for (int i = 0; i < m_nUser; i++)
311 {
312 // get the imsi
313 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
314 uint8_t lcId = 3;
315 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
316 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t)lcId
317 << " bytes rxed " << (double)dlDataRxed.at(i) << " thr "
318 << (double)dlDataRxed.at(i) / statsDuration << " ref " << m_thrRefDl);
319 NS_TEST_ASSERT_MSG_EQ_TOL((double)dlDataRxed.at(i) / statsDuration,
321 m_thrRefDl * tolerance,
322 " Unfair Throughput!");
323 }
324
325 NS_LOG_INFO("UL - Test with " << m_nUser << " user(s) at distance " << m_dist);
326 std::vector<uint64_t> ulDataRxed;
328 {
329 m_thrRefUl *= 0.95; // for counting the Vienna AMC behavior: BLER between 0% and 10%
330 }
331 for (int i = 0; i < m_nUser; i++)
332 {
333 // get the imsi
334 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
335 // get the lcId
336 uint8_t lcId = 3;
337 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
338 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " lcid " << (uint16_t)lcId
339 << " bytes rxed " << (double)ulDataRxed.at(i) << " thr "
340 << (double)ulDataRxed.at(i) / statsDuration << " ref " << m_thrRefUl
341 << " txed " << rlcStats->GetUlTxData(imsi, lcId) / statsDuration);
342 NS_TEST_ASSERT_MSG_EQ_TOL((double)ulDataRxed.at(i) / statsDuration,
344 m_thrRefUl * tolerance,
345 " Unfair Throughput!");
346 }
347
349}
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:471
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:1060
@ EXTENSIVE
Medium length test.
Definition: test.h:1066
@ QUICK
Fast test.
Definition: test.h:1065
void AddTestCase(TestCase *testCase, TestDuration 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:1256
AttributeValue implementation for Time.
Definition: nstime.h:1413
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:890
#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:337
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.