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;
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)
273 lteHelper->SetAttribute(
"PathlossModel",
StringValue(
"ns3::FriisSpectrumPropagationLossModel"));
283 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
284 mobility.Install(enbNodes);
285 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
286 mobility.Install(ueNodes);
291 lteHelper->SetSchedulerType(
"ns3::PfFfMacScheduler");
293 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
294 ueDevs = lteHelper->InstallUeDevice(ueNodes);
297 lteHelper->Attach(ueDevs, enbDevs.
Get(0));
302 lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
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;
326 lteHelper->EnableMacTraces();
327 lteHelper->EnableRlcTraces();
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!");
400 std::ostringstream oss;
401 oss <<
"distances (m) = [ ";
402 for (std::vector<double>::iterator 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)
452 lteHelper->SetAttribute(
"PathlossModel",
StringValue(
"ns3::FriisSpectrumPropagationLossModel"));
462 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
463 mobility.Install(enbNodes);
464 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
465 mobility.Install(ueNodes);
470 lteHelper->SetSchedulerType(
"ns3::PfFfMacScheduler");
472 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
473 ueDevs = lteHelper->InstallUeDevice(ueNodes);
476 lteHelper->Attach(ueDevs, enbDevs.
Get(0));
481 lteHelper->ActivateDataRadioBearer(ueDevs, bearer);
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;
505 lteHelper->EnableRlcTraces();
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;
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!");
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.
@ GBR_CONV_VOICE
GBR Conversational Voice.
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.
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static void Run()
Run the simulation.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Hold variables of type string.
@ EXTENSIVE
Medium length test.
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.
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.