27 #include <ns3/object.h>
28 #include <ns3/spectrum-interference.h>
29 #include <ns3/spectrum-error-model.h>
32 #include <ns3/simulator.h>
33 #include <ns3/packet.h>
35 #include "ns3/radio-bearer-stats-calculator.h"
36 #include <ns3/constant-position-mobility-model.h>
37 #include <ns3/eps-bearer.h>
38 #include <ns3/node-container.h>
39 #include <ns3/mobility-helper.h>
40 #include <ns3/net-device-container.h>
41 #include <ns3/lte-ue-net-device.h>
42 #include <ns3/lte-enb-net-device.h>
43 #include <ns3/lte-ue-rrc.h>
44 #include <ns3/lte-helper.h>
45 #include "ns3/string.h"
46 #include "ns3/double.h"
47 #include <ns3/lte-enb-phy.h>
48 #include <ns3/lte-ue-phy.h>
49 #include <ns3/boolean.h>
52 #include "ns3/epc-helper.h"
53 #include "ns3/network-module.h"
54 #include "ns3/ipv4-global-routing-helper.h"
55 #include "ns3/internet-module.h"
56 #include "ns3/applications-module.h"
57 #include "ns3/point-to-point-helper.h"
59 #include "lte-test-pss-ff-mac-scheduler.h"
65 LenaTestPssFfMacSchedulerSuite::LenaTestPssFfMacSchedulerSuite ()
66 : TestSuite (
"lte-pss-ff-mac-scheduler", SYSTEM)
68 NS_LOG_INFO (
"creating LenaTestPssFfMacSchedulerSuite");
70 bool errorModel =
false;
166 std::vector<uint16_t> dist1;
168 dist1.push_back (4800);
169 dist1.push_back (6000);
170 dist1.push_back (10000);
171 std::vector<uint16_t> packetSize1;
172 packetSize1.push_back (100);
173 packetSize1.push_back (100);
174 packetSize1.push_back (100);
175 packetSize1.push_back (100);
176 std::vector<uint32_t> estThrPssDl1;
177 estThrPssDl1.push_back (132000);
178 estThrPssDl1.push_back (132000);
179 estThrPssDl1.push_back (132000);
180 estThrPssDl1.push_back (132000);
188 std::vector<uint16_t> dist2;
190 dist2.push_back (4800);
191 dist2.push_back (6000);
192 dist2.push_back (10000);
193 std::vector<uint16_t> packetSize2;
194 packetSize2.push_back (200);
195 packetSize2.push_back (200);
196 packetSize2.push_back (200);
197 packetSize2.push_back (200);
198 std::vector<uint32_t> estThrPssDl2;
199 estThrPssDl2.push_back (180232);
200 estThrPssDl2.push_back (180232);
201 estThrPssDl2.push_back (180232);
202 estThrPssDl2.push_back (180232);
210 std::vector<uint16_t> dist3;
212 dist3.push_back (4800);
213 dist3.push_back (6000);
214 std::vector<uint16_t> packetSize3;
215 packetSize3.push_back (100);
216 packetSize3.push_back (200);
217 packetSize3.push_back (300);
218 std::vector<uint32_t> estThrPssDl3;
219 estThrPssDl3.push_back (132000);
220 estThrPssDl3.push_back (232000);
221 estThrPssDl3.push_back (332000);
222 AddTestCase (
new LenaPssFfMacSchedulerTestCase2 (dist3,estThrPssDl3,packetSize3,1,errorModel), TestCase::QUICK);
226 static LenaTestPssFfMacSchedulerSuite lenaTestPssFfMacSchedulerSuite;
232 LenaPssFfMacSchedulerTestCase1::BuildNameString (uint16_t nUser, uint16_t dist)
234 std::ostringstream oss;
235 oss << nUser <<
" UEs, distance " << dist <<
" m";
240 LenaPssFfMacSchedulerTestCase1::LenaPssFfMacSchedulerTestCase1 (uint16_t nUser, uint16_t nLc, uint16_t dist,
double thrRefDl,
double thrRefUl, uint16_t packetSize, uint16_t interval,
bool errorModelEnabled)
241 : TestCase (BuildNameString (nUser, dist)),
245 m_packetSize (packetSize),
246 m_interval (interval),
247 m_thrRefDl (thrRefDl),
248 m_thrRefUl (thrRefUl),
249 m_errorModelEnabled (errorModelEnabled)
253 LenaPssFfMacSchedulerTestCase1::~LenaPssFfMacSchedulerTestCase1 ()
262 if (!m_errorModelEnabled)
272 lteHelper->SetEpcHelper (epcHelper);
276 Ptr<Node> pgw = epcHelper->GetPgwNode ();
280 remoteHostContainer.
Create (1);
283 internet.
Install (remoteHostContainer);
292 ipv4h.
SetBase (
"1.0.0.0",
"255.0.0.0");
299 remoteHostStaticRouting->AddNetworkRouteTo (
Ipv4Address (
"7.0.0.0"),
Ipv4Mask (
"255.0.0.0"), 1);
311 lteHelper->SetAttribute (
"PathlossModel",
StringValue (
"ns3::FriisSpectrumPropagationLossModel"));
329 lteHelper->SetSchedulerType (
"ns3::PssFfMacScheduler");
330 enbDevs = lteHelper->InstallEnbDevice (enbNodes);
331 ueDevs = lteHelper->InstallUeDevice (ueNodes);
336 enbPhy->SetAttribute (
"TxPower",
DoubleValue (30.0));
337 enbPhy->SetAttribute (
"NoiseFigure",
DoubleValue (5.0));
340 for (
int i = 0; i < m_nUser; i++)
343 mm->SetPosition (
Vector (m_dist, 0.0, 0.0));
346 uePhy->SetAttribute (
"TxPower",
DoubleValue (23.0));
347 uePhy->SetAttribute (
"NoiseFigure",
DoubleValue (9.0));
356 for (uint32_t u = 0; u < ueNodes.
GetN (); ++u)
361 ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
365 lteHelper->Attach (ueDevs, enbDevs.
Get (0));
368 for (uint32_t u = 0; u < ueNodes.
GetN (); ++u)
372 qos.
gbrDl = (m_packetSize + 32) * (1000 / m_interval) * 8;
373 qos.
gbrUl = (m_packetSize + 32) * (1000 / m_interval) * 8;
379 lteHelper->ActivateDedicatedEpsBearer (ueDevice, bearer,
EpcTft::Default ());
383 uint16_t dlPort = 1234;
384 uint16_t ulPort = 2000;
389 for (uint32_t u = 0; u < ueNodes.
GetN (); ++u)
392 serverApps.
Add (dlPacketSinkHelper.
Install (ueNodes.
Get (u)));
393 serverApps.
Add (ulPacketSinkHelper.
Install (remoteHost));
397 dlClient.SetAttribute (
"MaxPackets",
UintegerValue (1000000));
398 dlClient.SetAttribute (
"PacketSize",
UintegerValue (m_packetSize));
405 clientApps.
Add (dlClient.Install (remoteHost));
412 double statsStartTime = 0.001;
413 double statsDuration = 1;
414 double tolerance = 0.1;
417 lteHelper->EnableRlcTraces ();
418 lteHelper->EnableMacTraces ();
421 rlcStats->SetAttribute (
"EpochDuration",
TimeValue (
Seconds (statsDuration)));
429 NS_LOG_INFO (
"DL - Test with " << m_nUser <<
" user(s) at distance " << m_dist);
430 std::vector <uint64_t> dlDataRxed;
431 for (
int i = 0; i < m_nUser; i++)
437 uint64_t data = rlcStats->GetDlRxData (imsi, lcId);
438 dlDataRxed.push_back (data);
439 NS_LOG_INFO (
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)dlDataRxed.at (i) <<
" thr " << (double)dlDataRxed.at (i) / statsDuration <<
" ref " << m_thrRefDl);
442 for (
int i = 0; i < m_nUser; i++)
444 NS_TEST_ASSERT_MSG_EQ_TOL ((
double)dlDataRxed.at (i) / statsDuration, m_thrRefDl, m_thrRefDl * tolerance,
" Unfair Throughput!");
451 NS_LOG_INFO (
"UL - Test with " << m_nUser <<
" user(s) at distance " << m_dist);
452 std::vector <uint64_t> ulDataRxed;
453 for (
int i = 0; i < m_nUser; i++)
459 ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
460 NS_LOG_INFO (
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)ulDataRxed.at (i) <<
" thr " << (double)ulDataRxed.at (i) / statsDuration <<
" ref " << m_thrRefUl);
463 for (
int i = 0; i < m_nUser; i++)
465 NS_TEST_ASSERT_MSG_EQ_TOL ((
double)ulDataRxed.at (i) / statsDuration, m_thrRefUl, m_thrRefUl * tolerance,
" Unfair Throughput!");
477 LenaPssFfMacSchedulerTestCase2::BuildNameString (uint16_t nUser, std::vector<uint16_t> dist)
479 std::ostringstream oss;
480 oss <<
"distances (m) = [ " ;
481 for (std::vector<uint16_t>::iterator it = dist.begin (); it != dist.end (); ++it)
490 LenaPssFfMacSchedulerTestCase2::LenaPssFfMacSchedulerTestCase2 (std::vector<uint16_t> dist, std::vector<uint32_t> estThrPssDl, std::vector<uint16_t> packetSize, uint16_t interval,
bool errorModelEnabled)
491 : TestCase (BuildNameString (dist.size (), dist)),
492 m_nUser (dist.size ()),
494 m_packetSize (packetSize),
495 m_interval (interval),
496 m_estThrPssDl (estThrPssDl),
497 m_errorModelEnabled (errorModelEnabled)
501 LenaPssFfMacSchedulerTestCase2::~LenaPssFfMacSchedulerTestCase2 ()
509 if (!m_errorModelEnabled)
520 lteHelper->SetEpcHelper (epcHelper);
522 Ptr<Node> pgw = epcHelper->GetPgwNode ();
526 remoteHostContainer.
Create (1);
529 internet.
Install (remoteHostContainer);
538 ipv4h.
SetBase (
"1.0.0.0",
"255.0.0.0");
545 remoteHostStaticRouting->AddNetworkRouteTo (
Ipv4Address (
"7.0.0.0"),
Ipv4Mask (
"255.0.0.0"), 1);
551 lteHelper->SetAttribute (
"PathlossModel",
StringValue (
"ns3::FriisSpectrumPropagationLossModel"));
569 lteHelper->SetSchedulerType (
"ns3::PssFfMacScheduler");
570 enbDevs = lteHelper->InstallEnbDevice (enbNodes);
571 ueDevs = lteHelper->InstallUeDevice (ueNodes);
575 enbPhy->SetAttribute (
"TxPower",
DoubleValue (30.0));
576 enbPhy->SetAttribute (
"NoiseFigure",
DoubleValue (5.0));
579 for (
int i = 0; i < m_nUser; i++)
582 mm->SetPosition (
Vector (m_dist.at (i), 0.0, 0.0));
585 uePhy->SetAttribute (
"TxPower",
DoubleValue (23.0));
586 uePhy->SetAttribute (
"NoiseFigure",
DoubleValue (9.0));
595 for (uint32_t u = 0; u < ueNodes.
GetN (); ++u)
600 ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
604 lteHelper->Attach (ueDevs, enbDevs.
Get (0));
608 for (uint32_t u = 0; u < ueNodes.
GetN (); ++u)
612 qos.
gbrDl = (m_packetSize.at (u) + 32) * (1000 / m_interval) * 8;
613 qos.
gbrUl = (m_packetSize.at (u) + 32) * (1000 / m_interval) * 8;
619 lteHelper->ActivateDedicatedEpsBearer (ueDevice, bearer,
EpcTft::Default ());
624 uint16_t dlPort = 1234;
625 uint16_t ulPort = 2000;
630 for (uint32_t u = 0; u < ueNodes.
GetN (); ++u)
633 serverApps.
Add (dlPacketSinkHelper.
Install (ueNodes.
Get (u)));
634 serverApps.
Add (ulPacketSinkHelper.
Install (remoteHost));
638 dlClient.SetAttribute (
"MaxPackets",
UintegerValue (1000000));
639 dlClient.SetAttribute (
"PacketSize",
UintegerValue (m_packetSize.at (u)));
646 clientApps.
Add (dlClient.Install (remoteHost));
653 double statsStartTime = 0.001;
654 double statsDuration = 1.0;
655 double tolerance = 0.1;
658 lteHelper->EnableRlcTraces ();
661 rlcStats->SetAttribute (
"EpochDuration",
TimeValue (
Seconds (statsDuration)));
670 NS_LOG_INFO (
"DL - Test with " << m_nUser <<
" user(s)");
671 std::vector <uint64_t> dlDataRxed;
672 for (
int i = 0; i < m_nUser; i++)
678 dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
679 NS_LOG_INFO (
"\tUser " << i <<
" dist " << m_dist.at (i) <<
" imsi " << imsi <<
" bytes rxed " << (double)dlDataRxed.at (i) <<
" thr " << (double)dlDataRxed.at (i) / statsDuration <<
" ref " << m_nUser);
682 for (
int i = 0; i < m_nUser; i++)
684 NS_TEST_ASSERT_MSG_EQ_TOL ((
double)dlDataRxed.at (i) / statsDuration, m_estThrPssDl.at (i), m_estThrPssDl.at (i) * tolerance,
" Unfair Throughput!");
holds a vector of ns3::Application pointers.
static Ipv4Address GetAny(void)
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
void LogComponentDisableAll(enum LogLevel level)
holds a vector of std::pair of Ptr<Ipv4> and interface index.
hold variables of type string
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
NetDeviceContainer Install(NodeContainer c)
a class to represent an Ipv4 address mask
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container. ...
Mobility model for which the current position does not change once it has been set and until it is se...
static Ptr< EpcTft > Default()
#define NS_LOG_COMPONENT_DEFINE(name)
virtual void DoRun(void)
Implementation to actually run this test case.
aggregate IP/TCP/UDP functionality to existing Nodes.
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)
ApplicationContainer Install(NodeContainer c)
uint32_t GetN(void) const
Get the number of Ptr<Node> stored in this container.
Class for representing data rates.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
Create a client application which sends udp packets carrying a 32bit sequence number and a 64 bit tim...
hold objects of type ns3::Time
Hold an unsigned integer type.
holds a vector of ns3::NetDevice pointers
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
static void Destroy(void)
Access to the Ipv4 forwarding table, interfaces, and configuration.
void SetAttribute(std::string name, const AttributeValue &value)
void SetDefault(std::string name, const AttributeValue &value)
keep track of a set of node pointers.
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
void Install(std::string nodeName) const
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual test case to this test suite.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Helper class used to assign positions and mobility models to nodes.
Ipv4 addresses are stored in host order in this class.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
Ptr< Ipv4StaticRouting > GetStaticRouting(Ptr< Ipv4 > ipv4) const
Helper class that adds ns3::Ipv4StaticRouting objects.
hold objects of type ns3::DataRate
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
virtual void DoRun(void)
Implementation to actually run this test case.
ApplicationContainer Install(NodeContainer c) const
Time MilliSeconds(uint64_t ms)
create ns3::Time instances in units of milliseconds.
std::string GetName(void) const
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Hold an floating point type.
Ptr< T > GetObject(void) const
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const