24#include "ns3/double.h" 
   25#include "ns3/radio-bearer-stats-calculator.h" 
   26#include "ns3/string.h" 
   27#include <ns3/boolean.h> 
   28#include <ns3/constant-position-mobility-model.h> 
   30#include <ns3/eps-bearer.h> 
   31#include <ns3/ff-mac-scheduler.h> 
   33#include <ns3/lte-enb-net-device.h> 
   34#include <ns3/lte-enb-phy.h> 
   35#include <ns3/lte-helper.h> 
   36#include <ns3/lte-ue-net-device.h> 
   37#include <ns3/lte-ue-phy.h> 
   38#include <ns3/lte-ue-rrc.h> 
   39#include <ns3/mobility-helper.h> 
   40#include <ns3/net-device-container.h> 
   41#include <ns3/node-container.h> 
   42#include <ns3/object.h> 
   43#include <ns3/packet.h> 
   45#include <ns3/simulator.h> 
   46#include <ns3/spectrum-error-model.h> 
   47#include <ns3/spectrum-interference.h> 
   59    : 
TestSuite(
"lte-fdbet-ff-mac-scheduler", SYSTEM)
 
   61    NS_LOG_INFO(
"creating LenaTestFdBetFfMacSchedulerSuite");
 
   63    bool errorModel = 
false;
 
  101                TestCase::EXTENSIVE);
 
  103                TestCase::EXTENSIVE);
 
  105                TestCase::EXTENSIVE);
 
  107                TestCase::EXTENSIVE);
 
  120                TestCase::EXTENSIVE);
 
  122                TestCase::EXTENSIVE);
 
  124                TestCase::EXTENSIVE);
 
  126                TestCase::EXTENSIVE);
 
  140                TestCase::EXTENSIVE);
 
  142                TestCase::EXTENSIVE);
 
  144                TestCase::EXTENSIVE);
 
  146                TestCase::EXTENSIVE);
 
  160                TestCase::EXTENSIVE);
 
  162                TestCase::EXTENSIVE);
 
  164                TestCase::EXTENSIVE);
 
  166                TestCase::EXTENSIVE);
 
  174    std::vector<double> dist;
 
  176    dist.push_back(4800);  
 
  177    dist.push_back(6000);  
 
  178    dist.push_back(10000); 
 
  179    dist.push_back(20000); 
 
  180    std::vector<uint32_t> estAchievableRateDl;
 
  181    estAchievableRateDl.push_back(2196000);
 
  182    estAchievableRateDl.push_back(1383000);
 
  183    estAchievableRateDl.push_back(775000);
 
  184    estAchievableRateDl.push_back(421000);
 
  185    estAchievableRateDl.push_back(421000);
 
  186    std::vector<uint32_t> estThrFdBetUl;
 
  187    estThrFdBetUl.push_back(469000); 
 
  188    estThrFdBetUl.push_back(157000); 
 
  189    estThrFdBetUl.push_back(125000); 
 
  190    estThrFdBetUl.push_back(85000);  
 
  191    estThrFdBetUl.push_back(26000);  
 
  204    std::ostringstream oss;
 
  205    oss << nUser << 
" UEs, distance " << dist << 
" m";
 
  213                                                                   bool errorModelEnabled)
 
  214    : 
TestCase(BuildNameString(nUser, dist)),
 
  217      m_thrRefDl(thrRefDl),
 
  218      m_thrRefUl(thrRefUl),
 
  219      m_errorModelEnabled(errorModelEnabled)
 
  262    mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
 
  264    mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
 
  276    lteHelper->
Attach(ueDevs, enbDevs.
Get(0));
 
  285    enbPhy->SetAttribute(
"TxPower", 
DoubleValue(30.0));
 
  286    enbPhy->SetAttribute(
"NoiseFigure", 
DoubleValue(5.0));
 
  289    for (
int i = 0; i < 
m_nUser; i++)
 
  293        mm->SetPosition(Vector(
m_dist, 0.0, 0.0));
 
  297        uePhy->SetAttribute(
"NoiseFigure", 
DoubleValue(9.0));
 
  300    double statsStartTime = 0.300; 
 
  301    double statsDuration = 0.6;
 
  302    double tolerance = 0.1;
 
  303    Simulator::Stop(
Seconds(statsStartTime + statsDuration - 0.000001));
 
  317    std::vector<uint64_t> dlDataRxed;
 
  318    for (
int i = 0; i < 
m_nUser; i++)
 
  324        dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
 
  325        NS_LOG_INFO(
"\tUser " << i << 
" imsi " << imsi << 
" bytes rxed " << (
double)dlDataRxed.at(i)
 
  326                              << 
"  thr " << (
double)dlDataRxed.at(i) / statsDuration << 
" ref " 
  335    for (
int i = 0; i < 
m_nUser; i++)
 
  340                                  " Unfair Throughput!");
 
  347    std::vector<uint64_t> ulDataRxed;
 
  348    for (
int i = 0; i < 
m_nUser; i++)
 
  354        ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
 
  355        NS_LOG_INFO(
"\tUser " << i << 
" imsi " << imsi << 
" bytes rxed " << (
double)ulDataRxed.at(i)
 
  356                              << 
"  thr " << (
double)ulDataRxed.at(i) / statsDuration << 
" ref " 
  365    for (
int i = 0; i < 
m_nUser; i++)
 
  370                                  " Unfair Throughput!");
 
  372    Simulator::Destroy();
 
  380    std::ostringstream oss;
 
  381    oss << 
"distances (m) = [ ";
 
  382    for (std::vector<double>::iterator it = dist.begin(); it != dist.end(); ++it)
 
  391    std::vector<double> dist,
 
  392    std::vector<uint32_t> achievableRateDl,
 
  393    std::vector<uint32_t> estThrFdBetUl,
 
  394    bool errorModelEnabled)
 
  395    : 
TestCase(BuildNameString(dist.size(), dist)),
 
  396      m_nUser(dist.size()),
 
  398      m_achievableRateDl(achievableRateDl),
 
  399      m_estThrFdBetUl(estThrFdBetUl),
 
  400      m_errorModelEnabled(errorModelEnabled)
 
  444    mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
 
  446    mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
 
  458    lteHelper->
Attach(ueDevs, enbDevs.
Get(0));
 
  467    enbPhy->SetAttribute(
"TxPower", 
DoubleValue(30.0));
 
  468    enbPhy->SetAttribute(
"NoiseFigure", 
DoubleValue(5.0));
 
  471    for (
int i = 0; i < 
m_nUser; i++)
 
  475        mm->SetPosition(Vector(
m_dist.at(i), 0.0, 0.0));
 
  479        uePhy->SetAttribute(
"NoiseFigure", 
DoubleValue(9.0));
 
  482    double statsStartTime = 0.300; 
 
  483    double statsDuration = 0.4;
 
  484    double tolerance = 0.1;
 
  485    Simulator::Stop(
Seconds(statsStartTime + statsDuration - 0.000001));
 
  496    std::vector<uint64_t> dlDataRxed;
 
  497    double totalData = 0;
 
  498    double estTotalThr = 0;
 
  500    for (
int i = 0; i < 
m_nUser; i++)
 
  506        dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
 
  507        totalData += (
double)dlDataRxed.at(i);
 
  509        NS_LOG_INFO(
"\tUser " << i << 
" dist " << 
m_dist.at(i) << 
" imsi " << imsi << 
" bytes rxed " 
  510                              << (
double)dlDataRxed.at(i) << 
"  thr " 
  511                              << (
double)dlDataRxed.at(i) / statsDuration << 
" ref " << 
m_nUser);
 
  514    estTotalThr = 
m_nUser * (1 / estTotalThr);
 
  515    estUeThr = estTotalThr / 
m_nUser;
 
  520    for (
int i = 0; i < 
m_nUser; i++)
 
  523        double estThrRatio = (
double)dlDataRxed.at(i) / totalData;
 
  524        NS_LOG_INFO(
"\tUser " << i << 
" thrRatio " << thrRatio << 
" estThrRatio " << estThrRatio);
 
  528                                  estUeThr * tolerance,
 
  529                                  " Unfair Throughput!");
 
  537    std::vector<uint64_t> ulDataRxed;
 
  538    for (
int i = 0; i < 
m_nUser; i++)
 
  544        ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
 
  546                              << (
double)ulDataRxed.at(i) << 
"  thr " 
  547                              << (
double)ulDataRxed.at(i) / statsDuration << 
" ref " 
  552                                  " Unfair Throughput!");
 
  554    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)
Builds the test name string based on provided parameter values.
 
~LenaFdBetFfMacSchedulerTestCase1() override
 
LenaFdBetFfMacSchedulerTestCase1(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
Constructor.
 
double m_thrRefUl
UL throughput reference.
 
bool m_errorModelEnabled
error model enabled?
 
uint16_t m_nUser
number of UE nodes
 
void DoRun() override
Implementation to actually run this TestCase.
 
double m_dist
distance between the nodes
 
double m_thrRefDl
DL throughput reference.
 
Test case is simillar to the one defined in LenaFdBetFfMacSchedulerTestCase1, with the difference tha...
 
void DoRun() override
Implementation to actually run this TestCase.
 
bool m_errorModelEnabled
specifies whether the error model is enabled
 
std::vector< double > m_dist
distance between the nodes
 
~LenaFdBetFfMacSchedulerTestCase2() override
 
uint16_t m_nUser
number of UE nodes
 
static std::string BuildNameString(uint16_t nUser, std::vector< double > dist)
Builds the test name string based on provided parameter values.
 
std::vector< uint32_t > m_achievableRateDl
DL achievable rate.
 
std::vector< uint32_t > m_estThrFdBetUl
estimated throughput FDBET UL
 
LenaFdBetFfMacSchedulerTestCase2(std::vector< double > dist, std::vector< uint32_t > achievableRateDl, std::vector< uint32_t > estThrFdBetUl, bool errorModelEnabled)
Constructor.
 
Test suite for FDBetFfMacScheduler test case.
 
LenaTestFdBetFfMacSchedulerSuite()
 
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 LenaTestFdBetFfMacSchedulerSuite lenaTestFdBetFfMacSchedulerSuite
 
Every class exported by the ns3 library is enclosed in the ns3 namespace.