13#include "ns3/double.h"
14#include "ns3/internet-module.h"
15#include "ns3/ipv4-global-routing-helper.h"
16#include "ns3/network-module.h"
17#include "ns3/packet-sink-helper.h"
18#include "ns3/point-to-point-epc-helper.h"
19#include "ns3/point-to-point-helper.h"
20#include "ns3/radio-bearer-stats-calculator.h"
21#include "ns3/string.h"
22#include "ns3/udp-client-server-helper.h"
23#include <ns3/boolean.h>
24#include <ns3/constant-position-mobility-model.h>
26#include <ns3/eps-bearer.h>
27#include <ns3/ff-mac-scheduler.h>
29#include <ns3/lte-enb-net-device.h>
30#include <ns3/lte-enb-phy.h>
31#include <ns3/lte-helper.h>
32#include <ns3/lte-ue-net-device.h>
33#include <ns3/lte-ue-phy.h>
34#include <ns3/lte-ue-rrc.h>
35#include <ns3/mobility-helper.h>
36#include <ns3/net-device-container.h>
37#include <ns3/node-container.h>
38#include <ns3/object.h>
39#include <ns3/packet.h>
41#include <ns3/simulator.h>
42#include <ns3/spectrum-error-model.h>
43#include <ns3/spectrum-interference.h>
57 NS_LOG_INFO(
"creating LenaTestPssFfMacSchedulerSuite");
59 bool errorModel =
false;
85 TestCase::Duration::EXTENSIVE);
87 TestCase::Duration::EXTENSIVE);
89 TestCase::Duration::EXTENSIVE);
112 TestCase::Duration::EXTENSIVE);
114 TestCase::Duration::EXTENSIVE);
116 TestCase::Duration::EXTENSIVE);
139 TestCase::Duration::EXTENSIVE);
141 TestCase::Duration::EXTENSIVE);
143 TestCase::Duration::EXTENSIVE);
165 TestCase::Duration::EXTENSIVE);
167 TestCase::Duration::EXTENSIVE);
169 TestCase::Duration::EXTENSIVE);
176 TestCase::Duration::QUICK);
185 std::vector<double> dist1;
187 dist1.push_back(4800);
188 dist1.push_back(6000);
189 dist1.push_back(10000);
190 std::vector<uint16_t> packetSize1;
191 packetSize1.push_back(100);
192 packetSize1.push_back(100);
193 packetSize1.push_back(100);
194 packetSize1.push_back(100);
195 std::vector<uint32_t> estThrPssDl1;
196 estThrPssDl1.push_back(132000);
197 estThrPssDl1.push_back(132000);
198 estThrPssDl1.push_back(132000);
199 estThrPssDl1.push_back(132000);
201 TestCase::Duration::QUICK);
210 std::vector<double> dist2;
212 dist2.push_back(4800);
213 dist2.push_back(6000);
214 dist2.push_back(10000);
215 std::vector<uint16_t> packetSize2;
216 packetSize2.push_back(200);
217 packetSize2.push_back(200);
218 packetSize2.push_back(200);
219 packetSize2.push_back(200);
220 std::vector<uint32_t> estThrPssDl2;
221 estThrPssDl2.push_back(230000);
222 estThrPssDl2.push_back(230000);
223 estThrPssDl2.push_back(230000);
224 estThrPssDl2.push_back(230000);
226 TestCase::Duration::QUICK);
235 std::vector<double> dist3;
237 dist3.push_back(4800);
238 dist3.push_back(6000);
239 std::vector<uint16_t> packetSize3;
240 packetSize3.push_back(100);
241 packetSize3.push_back(200);
242 packetSize3.push_back(300);
243 std::vector<uint32_t> estThrPssDl3;
244 estThrPssDl3.push_back(132000);
245 estThrPssDl3.push_back(232000);
246 estThrPssDl3.push_back(332000);
248 TestCase::Duration::QUICK);
262 std::ostringstream oss;
263 oss << nUser <<
" UEs, distance " << dist <<
" m";
273 bool errorModelEnabled)
274 :
TestCase(BuildNameString(nUser, dist)),
278 m_interval(interval),
279 m_thrRefDl(thrRefDl),
280 m_thrRefUl(thrRefUl),
281 m_errorModelEnabled(errorModelEnabled)
312 lteHelper->SetEpcHelper(epcHelper);
320 remoteHostContainer.
Create(1);
323 internet.Install(remoteHostContainer);
332 ipv4h.
SetBase(
"1.0.0.0",
"255.0.0.0");
340 remoteHostStaticRouting->AddNetworkRouteTo(
Ipv4Address(
"7.0.0.0"),
Ipv4Mask(
"255.0.0.0"), 1);
353 lteHelper->SetAttribute(
"PathlossModel",
StringValue(
"ns3::FriisSpectrumPropagationLossModel"));
363 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
364 mobility.Install(enbNodes);
365 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
366 mobility.Install(ueNodes);
371 lteHelper->SetSchedulerType(
"ns3::PssFfMacScheduler");
373 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
374 ueDevs = lteHelper->InstallUeDevice(ueNodes);
378 enbPhy->SetAttribute(
"TxPower",
DoubleValue(30.0));
379 enbPhy->SetAttribute(
"NoiseFigure",
DoubleValue(5.0));
382 for (
int i = 0; i <
m_nUser; i++)
386 mm->SetPosition(Vector(
m_dist, 0.0, 0.0));
390 uePhy->SetAttribute(
"NoiseFigure",
DoubleValue(9.0));
394 internet.Install(ueNodes);
405 ueStaticRouting->SetDefaultRoute(epcHelper->GetUeDefaultGatewayAddress(), 1);
409 lteHelper->Attach(ueDevs, enbDevs.
Get(0));
424 lteHelper->ActivateDedicatedEpsBearer(ueDevice, bearer,
EpcTft::Default());
428 uint16_t dlPort = 1234;
429 uint16_t ulPort = 2000;
440 serverApps.Add(ulPacketSinkHelper.
Install(remoteHost));
454 clientApps.Add(dlClient.
Install(remoteHost));
455 clientApps.Add(ulClient.
Install(ueNodes.
Get(u)));
458 serverApps.Start(
Seconds(0.030));
459 clientApps.Start(
Seconds(0.030));
461 double statsStartTime = 0.300;
462 double statsDuration = 0.6;
463 double tolerance = 0.1;
466 lteHelper->EnableRlcTraces();
467 lteHelper->EnableMacTraces();
479 std::vector<uint64_t> dlDataRxed;
480 for (
int i = 0; i <
m_nUser; i++)
486 uint64_t
data = rlcStats->GetDlRxData(imsi, lcId);
487 dlDataRxed.push_back(
data);
488 NS_LOG_INFO(
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)dlDataRxed.at(i)
489 <<
" thr " << (
double)dlDataRxed.at(i) / statsDuration <<
" ref "
493 for (
int i = 0; i <
m_nUser; i++)
498 " Unfair Throughput!");
506 std::vector<uint64_t> ulDataRxed;
507 for (
int i = 0; i <
m_nUser; i++)
513 ulDataRxed.push_back(rlcStats->GetUlRxData(imsi, lcId));
514 NS_LOG_INFO(
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)ulDataRxed.at(i)
515 <<
" thr " << (
double)ulDataRxed.at(i) / statsDuration <<
" ref "
519 for (
int i = 0; i <
m_nUser; i++)
524 " Unfair Throughput!");
534 std::ostringstream oss;
535 oss <<
"distances (m) = [ ";
536 for (
auto it = dist.begin(); it != dist.end(); ++it)
545 std::vector<uint32_t> estThrPssDl,
548 bool errorModelEnabled)
549 :
TestCase(BuildNameString(dist.size(), dist)),
550 m_nUser(dist.size()),
553 m_interval(interval),
554 m_estThrPssDl(estThrPssDl),
555 m_errorModelEnabled(errorModelEnabled)
584 lteHelper->SetEpcHelper(epcHelper);
590 remoteHostContainer.
Create(1);
593 internet.Install(remoteHostContainer);
602 ipv4h.
SetBase(
"1.0.0.0",
"255.0.0.0");
610 remoteHostStaticRouting->AddNetworkRouteTo(
Ipv4Address(
"7.0.0.0"),
Ipv4Mask(
"255.0.0.0"), 1);
615 lteHelper->SetAttribute(
"PathlossModel",
StringValue(
"ns3::FriisSpectrumPropagationLossModel"));
625 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
626 mobility.Install(enbNodes);
627 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
628 mobility.Install(ueNodes);
633 lteHelper->SetSchedulerType(
"ns3::PssFfMacScheduler");
635 enbDevs = lteHelper->InstallEnbDevice(enbNodes);
636 ueDevs = lteHelper->InstallUeDevice(ueNodes);
640 enbPhy->SetAttribute(
"TxPower",
DoubleValue(30.0));
641 enbPhy->SetAttribute(
"NoiseFigure",
DoubleValue(5.0));
644 for (
int i = 0; i <
m_nUser; i++)
648 mm->SetPosition(Vector(
m_dist.at(i), 0.0, 0.0));
652 uePhy->SetAttribute(
"NoiseFigure",
DoubleValue(9.0));
656 internet.Install(ueNodes);
667 ueStaticRouting->SetDefaultRoute(epcHelper->GetUeDefaultGatewayAddress(), 1);
671 lteHelper->Attach(ueDevs, enbDevs.
Get(0));
687 lteHelper->ActivateDedicatedEpsBearer(ueDevice, bearer,
EpcTft::Default());
691 uint16_t dlPort = 1234;
692 uint16_t ulPort = 2000;
703 serverApps.Add(ulPacketSinkHelper.
Install(remoteHost));
717 clientApps.Add(dlClient.
Install(remoteHost));
718 clientApps.Add(ulClient.
Install(ueNodes.
Get(u)));
721 serverApps.Start(
Seconds(0.030));
722 clientApps.Start(
Seconds(0.030));
724 double statsStartTime = 0.04;
725 double statsDuration = 0.5;
726 double tolerance = 0.1;
729 lteHelper->EnableRlcTraces();
741 std::vector<uint64_t> dlDataRxed;
742 for (
int i = 0; i <
m_nUser; i++)
748 dlDataRxed.push_back(rlcStats->GetDlRxData(imsi, lcId));
749 NS_LOG_INFO(
"\tUser " << i <<
" dist " <<
m_dist.at(i) <<
" imsi " << imsi <<
" bytes rxed "
750 << (
double)dlDataRxed.at(i) <<
" thr "
751 << (
double)dlDataRxed.at(i) / statsDuration <<
" ref "
755 for (
int i = 0; i <
m_nUser; i++)
760 " Unfair Throughput!");
This system test program creates different test cases with a single eNB and several UEs,...
uint16_t m_interval
the interval time in ms
uint16_t m_packetSize
the packet size in bytes
bool m_errorModelEnabled
indicates whether the error model is enabled
double m_thrRefDl
the DL throughput reference value
static std::string BuildNameString(uint16_t nUser, double dist)
Builds the test name string based on provided parameter values.
double m_thrRefUl
the UL throughput reference value
double m_dist
the distance between nodes
uint16_t m_nUser
number of UE nodes
LenaPssFfMacSchedulerTestCase1(uint16_t nUser, double dist, double thrRefDl, double thrRefUl, uint16_t packetSize, uint16_t interval, bool errorModelEnabled)
Constructor.
~LenaPssFfMacSchedulerTestCase1() override
void DoRun() override
Implementation to actually run this TestCase.
Similar to the LenaPssFfMacSchedulerTestCase1 with the difference that UEs are places in such a way t...
bool m_errorModelEnabled
indicates whether the error model is enabled
std::vector< double > m_dist
the distance between nodes
uint16_t m_nUser
number of UE nodes
~LenaPssFfMacSchedulerTestCase2() override
uint16_t m_interval
the interval time in ms
std::vector< uint16_t > m_packetSize
the packet size in bytes
static std::string BuildNameString(uint16_t nUser, std::vector< double > dist)
Builds the test name string based on provided parameter values.
LenaPssFfMacSchedulerTestCase2(std::vector< double > dist, std::vector< uint32_t > estThrPssDl, std::vector< uint16_t > packetSize, uint16_t interval, bool errorModelEnabled)
Constructor.
void DoRun() override
Implementation to actually run this TestCase.
std::vector< uint32_t > m_estThrPssDl
the DL estimated throughput PSS
Lena Pss Ff Mac Scheduler Test Suite.
LenaTestPssFfMacSchedulerSuite()
holds a vector of ns3::Application pointers.
ApplicationContainer Install(NodeContainer c)
Install an application on each node of the input container configured with all the attributes set wit...
void SetAttribute(const std::string &name, const AttributeValue &value)
Helper function used to set the underlying application attributes.
AttributeValue implementation for Boolean.
Mobility model for which the current position does not change once it has been set and until it is se...
Class for representing data rates.
AttributeValue implementation for DataRate.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Hold variables of type enum.
static Ptr< EpcTft > Default()
creates a TFT matching any traffic
This class contains the specification of EPS Bearers.
@ GBR_CONV_VOICE
GBR Conversational Voice.
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Ipv4 addresses are stored in host order in this class.
static Ipv4Address GetAny()
Access to the IPv4 forwarding table, interfaces, and configuration.
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
a class to represent an Ipv4 address mask
Helper class that adds ns3::Ipv4StaticRouting objects.
Ptr< Ipv4StaticRouting > GetStaticRouting(Ptr< Ipv4 > ipv4) const
Try and find the static routing protocol as either the main routing protocol or in the list of routin...
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.
uint32_t GetN() const
Get the number of Ptr<Node> stored in this container.
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.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
NetDeviceContainer Install(NodeContainer c)
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.
void AddTestCase(TestCase *testCase, Duration duration=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.
std::string GetName() const
AttributeValue implementation for Time.
Create a client application which sends UDP packets carrying a 32bit sequence number and a 64 bit tim...
Hold an unsigned integer type.
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 LenaTestPssFfMacSchedulerSuite lenaTestPssFfMacSchedulerSuite
Static variable for test initialization.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
#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.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static const uint32_t packetSize
Packet size generated at the AP.