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);
225 std::ostringstream oss;
226 oss << nUser <<
" UEs, distance " << dist <<
" m";
234 bool errorModelEnabled)
235 :
TestCase(BuildNameString(nUser, dist)),
238 m_thrRefDl(thrRefDl),
239 m_thrRefUl(thrRefUl),
240 m_errorModelEnabled(errorModelEnabled)
283 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
285 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
297 lteHelper->
Attach(ueDevs, enbDevs.
Get(0));
306 enbPhy->SetAttribute(
"TxPower",
DoubleValue(30.0));
307 enbPhy->SetAttribute(
"NoiseFigure",
DoubleValue(5.0));
310 for (
int i = 0; i <
m_nUser; i++)
314 mm->SetPosition(Vector(
m_dist, 0.0, 0.0));
318 uePhy->SetAttribute(
"NoiseFigure",
DoubleValue(9.0));
321 double statsStartTime = 0.300;
322 double statsDuration = 0.6;
323 double tolerance = 0.1;
324 Simulator::Stop(
Seconds(statsStartTime + statsDuration - 0.000001));
338 std::vector<uint64_t> dlDataRxed;
339 for (
int i = 0; i <
m_nUser; i++)
344 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
345 NS_LOG_INFO(
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)dlDataRxed.at(i)
346 <<
" thr " << (
double)dlDataRxed.at(i) / statsDuration <<
" ref "
355 for (
int i = 0; i <
m_nUser; i++)
360 " Unfair Throughput!");
367 std::vector<uint64_t> ulDataRxed;
368 for (
int i = 0; i <
m_nUser; i++)
374 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
375 NS_LOG_INFO(
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)ulDataRxed.at(i)
376 <<
" thr " << (
double)ulDataRxed.at(i) / statsDuration <<
" ref "
385 for (
int i = 0; i <
m_nUser; i++)
390 " Unfair Throughput!");
392 Simulator::Destroy();
400 std::ostringstream oss;
401 oss <<
"distances (m) = [ ";
402 for (
auto it = dist.begin(); it != dist.end(); ++it)
411 std::vector<uint32_t> estThrPfDl,
412 std::vector<uint32_t> estThrPfUl,
413 bool errorModelEnabled)
414 :
TestCase(BuildNameString(dist.size(), dist)),
415 m_nUser(dist.size()),
417 m_estThrPfDl(estThrPfDl),
418 m_estThrPfUl(estThrPfUl),
419 m_errorModelEnabled(errorModelEnabled)
462 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
464 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
476 lteHelper->
Attach(ueDevs, enbDevs.
Get(0));
485 enbPhy->SetAttribute(
"TxPower",
DoubleValue(30.0));
486 enbPhy->SetAttribute(
"NoiseFigure",
DoubleValue(5.0));
489 for (
int i = 0; i <
m_nUser; i++)
493 mm->SetPosition(Vector(
m_dist.at(i), 0.0, 0.0));
497 uePhy->SetAttribute(
"NoiseFigure",
DoubleValue(9.0));
500 double statsStartTime = 0.300;
501 double statsDuration = 0.4;
502 double tolerance = 0.1;
503 Simulator::Stop(
Seconds(statsStartTime + statsDuration - 0.000001));
513 std::vector<uint64_t> dlDataRxed;
514 double totalData = 0;
515 double totalEstThrPf = 0;
516 for (
int i = 0; i <
m_nUser; i++)
522 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
523 totalData += (double)dlDataRxed.at(i);
524 NS_LOG_INFO(
"\tUser " << i <<
" dist " <<
m_dist.at(i) <<
" imsi " << imsi <<
" bytes rxed "
525 << (
double)dlDataRxed.at(i) <<
" thr "
526 << (
double)dlDataRxed.at(i) / statsDuration);
535 for (
int i = 0; i <
m_nUser; i++)
537 double thrRatio = (double)dlDataRxed.at(i) / totalData;
538 double estThrRatio = (double)
m_estThrPfDl.at(i) / totalEstThrPf;
539 NS_LOG_INFO(
"\tUser " << i <<
" thrRatio " << thrRatio <<
" estThrRatio " << estThrRatio);
548 std::vector<uint64_t> ulDataRxed;
549 for (
int i = 0; i <
m_nUser; i++)
555 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
557 << (
double)ulDataRxed.at(i) <<
" thr "
558 << (
double)ulDataRxed.at(i) / statsDuration <<
" ref "
563 " Unfair Throughput!");
565 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()
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.
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.
static LenaTestPfFfMacSchedulerSuite lenaTestPfFfMacSchedulerSuite
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...
Time Seconds(double value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.