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>
29#include <ns3/eps-bearer.h>
30#include <ns3/ff-mac-scheduler.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>
44#include <ns3/simulator.h>
45#include <ns3/spectrum-error-model.h>
46#include <ns3/spectrum-interference.h>
58 :
TestSuite(
"lte-pf-ff-mac-scheduler", SYSTEM)
60 NS_LOG_INFO(
"creating LenaTestPfFfMacSchedulerSuite");
62 bool errorModel =
false;
104 TestCase::EXTENSIVE);
106 TestCase::EXTENSIVE);
108 TestCase::EXTENSIVE);
110 TestCase::EXTENSIVE);
112 TestCase::EXTENSIVE);
128 TestCase::EXTENSIVE);
130 TestCase::EXTENSIVE);
132 TestCase::EXTENSIVE);
134 TestCase::EXTENSIVE);
136 TestCase::EXTENSIVE);
152 TestCase::EXTENSIVE);
154 TestCase::EXTENSIVE);
156 TestCase::EXTENSIVE);
158 TestCase::EXTENSIVE);
160 TestCase::EXTENSIVE);
176 TestCase::EXTENSIVE);
178 TestCase::EXTENSIVE);
180 TestCase::EXTENSIVE);
182 TestCase::EXTENSIVE);
184 TestCase::EXTENSIVE);
192 std::vector<double> dist;
194 dist.push_back(4800);
195 dist.push_back(6000);
196 dist.push_back(10000);
197 dist.push_back(20000);
198 std::vector<uint32_t> estThrPfDl;
199 estThrPfDl.push_back(90000);
200 estThrPfDl.push_back(37000);
201 estThrPfDl.push_back(37000);
202 estThrPfDl.push_back(17400);
203 estThrPfDl.push_back(17400);
204 std::vector<uint32_t> estThrPfUl;
205 estThrPfUl.push_back(469000);
206 estThrPfUl.push_back(157000);
207 estThrPfUl.push_back(125000);
208 estThrPfUl.push_back(85000);
209 estThrPfUl.push_back(26000);
221 std::ostringstream oss;
222 oss << nUser <<
" UEs, distance " << dist <<
" m";
230 bool errorModelEnabled)
231 :
TestCase(BuildNameString(nUser, dist)),
234 m_thrRefDl(thrRefDl),
235 m_thrRefUl(thrRefUl),
236 m_errorModelEnabled(errorModelEnabled)
279 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
281 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
293 lteHelper->
Attach(ueDevs, enbDevs.
Get(0));
302 enbPhy->SetAttribute(
"TxPower",
DoubleValue(30.0));
303 enbPhy->SetAttribute(
"NoiseFigure",
DoubleValue(5.0));
306 for (
int i = 0; i <
m_nUser; i++)
310 mm->SetPosition(Vector(
m_dist, 0.0, 0.0));
314 uePhy->SetAttribute(
"NoiseFigure",
DoubleValue(9.0));
317 double statsStartTime = 0.300;
318 double statsDuration = 0.6;
319 double tolerance = 0.1;
320 Simulator::Stop(
Seconds(statsStartTime + statsDuration - 0.000001));
334 std::vector<uint64_t> dlDataRxed;
335 for (
int i = 0; i <
m_nUser; i++)
340 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
341 NS_LOG_INFO(
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)dlDataRxed.at(i)
342 <<
" thr " << (
double)dlDataRxed.at(i) / statsDuration <<
" ref "
351 for (
int i = 0; i <
m_nUser; i++)
356 " Unfair Throughput!");
363 std::vector<uint64_t> ulDataRxed;
364 for (
int i = 0; i <
m_nUser; i++)
370 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
371 NS_LOG_INFO(
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)ulDataRxed.at(i)
372 <<
" thr " << (
double)ulDataRxed.at(i) / statsDuration <<
" ref "
381 for (
int i = 0; i <
m_nUser; i++)
386 " Unfair Throughput!");
388 Simulator::Destroy();
396 std::ostringstream oss;
397 oss <<
"distances (m) = [ ";
398 for (std::vector<double>::iterator it = dist.begin(); it != dist.end(); ++it)
407 std::vector<uint32_t> estThrPfDl,
408 std::vector<uint32_t> estThrPfUl,
409 bool errorModelEnabled)
410 :
TestCase(BuildNameString(dist.size(), dist)),
411 m_nUser(dist.size()),
413 m_estThrPfDl(estThrPfDl),
414 m_estThrPfUl(estThrPfUl),
415 m_errorModelEnabled(errorModelEnabled)
458 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
460 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
472 lteHelper->
Attach(ueDevs, enbDevs.
Get(0));
481 enbPhy->SetAttribute(
"TxPower",
DoubleValue(30.0));
482 enbPhy->SetAttribute(
"NoiseFigure",
DoubleValue(5.0));
485 for (
int i = 0; i <
m_nUser; i++)
489 mm->SetPosition(Vector(
m_dist.at(i), 0.0, 0.0));
493 uePhy->SetAttribute(
"NoiseFigure",
DoubleValue(9.0));
496 double statsStartTime = 0.300;
497 double statsDuration = 0.4;
498 double tolerance = 0.1;
499 Simulator::Stop(
Seconds(statsStartTime + statsDuration - 0.000001));
509 std::vector<uint64_t> dlDataRxed;
510 double totalData = 0;
511 double totalEstThrPf = 0;
512 for (
int i = 0; i <
m_nUser; i++)
518 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
519 totalData += (
double)dlDataRxed.at(i);
520 NS_LOG_INFO(
"\tUser " << i <<
" dist " <<
m_dist.at(i) <<
" imsi " << imsi <<
" bytes rxed "
521 << (
double)dlDataRxed.at(i) <<
" thr "
522 << (
double)dlDataRxed.at(i) / statsDuration);
531 for (
int i = 0; i <
m_nUser; i++)
533 double thrRatio = (
double)dlDataRxed.at(i) / totalData;
535 NS_LOG_INFO(
"\tUser " << i <<
" thrRatio " << thrRatio <<
" estThrRatio " << estThrRatio);
544 std::vector<uint64_t> ulDataRxed;
545 for (
int i = 0; i <
m_nUser; i++)
551 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
553 << (
double)ulDataRxed.at(i) <<
" thr "
554 << (
double)ulDataRxed.at(i) / statsDuration <<
" ref "
559 " Unfair Throughput!");
561 Simulator::Destroy();
This system test program creates different test cases with a single eNB and several UEs,...
static std::string BuildNameString(uint16_t nUser, double dist)
Build name string.
bool m_errorModelEnabled
whether error model is enabled
uint16_t m_nUser
number of UE nodes
void DoRun() override
Implementation to actually run this TestCase.
double m_thrRefUl
the UL throughput reference
double m_thrRefDl
the DL throughput reference
~LenaPfFfMacSchedulerTestCase1() override
LenaPfFfMacSchedulerTestCase1(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
Constructor.
double m_dist
the distance between nodes
Lena PfFf Mac Scheduler Test Case 2.
LenaPfFfMacSchedulerTestCase2(std::vector< double > dist, std::vector< uint32_t > estThrPfDl, std::vector< uint32_t > estThrPfUl, bool errorModelEnabled)
Constructor.
std::vector< uint32_t > m_estThrPfUl
the estimated UL throughput
uint16_t m_nUser
number of UE nodes
bool m_errorModelEnabled
indicates whether the error model is enabled
std::vector< uint32_t > m_estThrPfDl
the estimated DL throughput
std::vector< double > m_dist
the distance between nodes
static std::string BuildNameString(uint16_t nUser, std::vector< double > dist)
Builds the test name string based on provided parameter values.
void DoRun() override
Implementation to actually run this TestCase.
~LenaPfFfMacSchedulerTestCase2() override
PfFfMacScheduler test suite.
LenaTestPfFfMacSchedulerSuite()
AttributeValue implementation for Boolean.
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'.
Hold variables of type enum.
This class contains the specification of EPS Bearers.
The eNodeB device implementation.
Ptr< LteEnbPhy > GetPhy() const
Ptr< RadioBearerStatsCalculator > GetRlcStats()
void SetSchedulerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the scheduler to be created.
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
void Attach(NetDeviceContainer ueDevices)
Enables automatic attachment of a set of UE devices to a suitable cell using Idle mode initial cell s...
void EnableRlcTraces()
Enable trace sinks for RLC layer.
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
void EnableMacTraces()
Enable trace sinks for MAC layer.
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.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Hold variables of type string.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
AttributeValue implementation for Time.
void SetDefault(std::string name, const AttributeValue &value)
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#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.
#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...
Time Seconds(double value)
Construct a Time in the indicated unit.
static LenaTestPfFfMacSchedulerSuite lenaTestPfFfMacSchedulerSuite
Every class exported by the ns3 library is enclosed in the ns3 namespace.