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-tdtbfq-ff-mac-scheduler.h"
65 LenaTestTdTbfqFfMacSchedulerSuite::LenaTestTdTbfqFfMacSchedulerSuite ()
66 : TestSuite (
"lte-tdtbfq-ff-mac-scheduler", SYSTEM)
68 NS_LOG_INFO (
"creating LenaTestTdTbfqFfMacSchedulerSuite");
70 bool errorModel =
false;
94 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (1,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
95 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (3,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
96 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (6,0,0,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
114 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (1,0,4800,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
115 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (3,0,4800,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
116 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (6,0,4800,150500,125000,200,1,errorModel), TestCase::EXTENSIVE);
135 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (1,0,6000,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
136 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (3,0,6000,232000,201000,200,1,errorModel), TestCase::EXTENSIVE);
137 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (6,0,6000,129167,97000,200,1,errorModel), TestCase::EXTENSIVE);
155 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (1,0,10000,232000,232000,200,1,errorModel), TestCase::EXTENSIVE);
156 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (3,0,10000,140333,137000,200,1,errorModel), TestCase::EXTENSIVE);
157 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase1 (6,0,10000,70166,67000,200,1,errorModel), TestCase::EXTENSIVE);
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> estThrTdTbfqDl1;
177 estThrTdTbfqDl1.push_back (132000);
178 estThrTdTbfqDl1.push_back (132000);
179 estThrTdTbfqDl1.push_back (132000);
180 estThrTdTbfqDl1.push_back (132000);
181 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase2 (dist1,estThrTdTbfqDl1,packetSize1,1,errorModel), TestCase::EXTENSIVE);
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> estThrTdTbfqDl2;
199 estThrTdTbfqDl2.push_back (180232);
200 estThrTdTbfqDl2.push_back (180232);
201 estThrTdTbfqDl2.push_back (180232);
202 estThrTdTbfqDl2.push_back (180232);
203 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase2 (dist2,estThrTdTbfqDl2,packetSize2,1,errorModel), TestCase::EXTENSIVE);
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> estThrTdTbfqDl3;
219 estThrTdTbfqDl3.push_back (132000);
220 estThrTdTbfqDl3.push_back (232000);
221 estThrTdTbfqDl3.push_back (332000);
222 AddTestCase (
new LenaTdTbfqFfMacSchedulerTestCase2 (dist3,estThrTdTbfqDl3,packetSize3,1,errorModel), TestCase::QUICK);
226 static LenaTestTdTbfqFfMacSchedulerSuite lenaTestTdTbfqFfMacSchedulerSuite;
232 LenaTdTbfqFfMacSchedulerTestCase1::BuildNameString (uint16_t nUser, uint16_t dist)
234 std::ostringstream oss;
235 oss << nUser <<
" UEs, distance " << dist <<
" m";
240 LenaTdTbfqFfMacSchedulerTestCase1::LenaTdTbfqFfMacSchedulerTestCase1 (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 LenaTdTbfqFfMacSchedulerTestCase1::~LenaTdTbfqFfMacSchedulerTestCase1 ()
258 LenaTdTbfqFfMacSchedulerTestCase1::DoRun (
void)
262 if (!m_errorModelEnabled)
264 Config::SetDefault (
"ns3::LteSpectrumPhy::CtrlErrorModelEnabled",
BooleanValue (
false));
265 Config::SetDefault (
"ns3::LteSpectrumPhy::DataErrorModelEnabled",
BooleanValue (
false));
268 Config::SetDefault (
"ns3::LteHelper::UseIdealRrc",
BooleanValue (
true));
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::TdTbfqFfMacScheduler");
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;
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;
415 Simulator::Stop (
Seconds (statsStartTime + statsDuration - 0.0001));
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!");
467 Simulator::Destroy ();
477 LenaTdTbfqFfMacSchedulerTestCase2::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 LenaTdTbfqFfMacSchedulerTestCase2::LenaTdTbfqFfMacSchedulerTestCase2 (std::vector<uint16_t> dist, std::vector<uint32_t> estThrTdTbfqDl, 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_estThrTdTbfqDl (estThrTdTbfqDl),
497 m_errorModelEnabled (errorModelEnabled)
501 LenaTdTbfqFfMacSchedulerTestCase2::~LenaTdTbfqFfMacSchedulerTestCase2 ()
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::TdTbfqFfMacScheduler");
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));
609 for (uint32_t u = 0; u < ueNodes.
GetN (); ++u)
611 mbrDl = mbrDl + m_packetSize.at (u);
613 mbrDl = mbrDl / ueNodes.
GetN ();
615 for (uint32_t u = 0; u < ueNodes.
GetN (); ++u)
619 qos.
gbrDl = (mbrDl + 32) * (1000 / m_interval) * 8;
626 lteHelper->ActivateDedicatedEpsBearer (ueDevice, bearer,
EpcTft::Default ());
631 uint16_t dlPort = 1234;
632 uint16_t ulPort = 2000;
637 for (uint32_t u = 0; u < ueNodes.
GetN (); ++u)
640 serverApps.
Add (dlPacketSinkHelper.
Install (ueNodes.
Get (u)));
641 serverApps.
Add (ulPacketSinkHelper.
Install (remoteHost));
645 dlClient.SetAttribute (
"MaxPackets",
UintegerValue (1000000));
646 dlClient.SetAttribute (
"PacketSize",
UintegerValue (m_packetSize.at (u)));
653 clientApps.
Add (dlClient.Install (remoteHost));
660 double statsStartTime = 0.001;
661 double statsDuration = 1.0;
662 double tolerance = 0.1;
665 lteHelper->EnableRlcTraces ();
668 rlcStats->SetAttribute (
"EpochDuration",
TimeValue (
Seconds (statsDuration)));
677 NS_LOG_INFO (
"DL - Test with " << m_nUser <<
" user(s)");
678 std::vector <uint64_t> dlDataRxed;
679 for (
int i = 0; i < m_nUser; i++)
685 dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
686 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);
689 for (
int i = 0; i < m_nUser; i++)
691 NS_TEST_ASSERT_MSG_EQ_TOL ((
double)dlDataRxed.at (i) / statsDuration, m_estThrTdTbfqDl.at (i), m_estThrTdTbfqDl.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)
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.
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