26 #include <ns3/object.h>
27 #include <ns3/spectrum-interference.h>
28 #include <ns3/spectrum-error-model.h>
31 #include <ns3/simulator.h>
32 #include <ns3/packet.h>
34 #include "ns3/radio-bearer-stats-calculator.h"
35 #include <ns3/constant-position-mobility-model.h>
36 #include <ns3/eps-bearer.h>
37 #include <ns3/node-container.h>
38 #include <ns3/mobility-helper.h>
39 #include <ns3/net-device-container.h>
40 #include <ns3/lte-ue-net-device.h>
41 #include <ns3/lte-enb-net-device.h>
42 #include <ns3/lte-ue-rrc.h>
43 #include <ns3/lte-helper.h>
44 #include "ns3/string.h"
45 #include "ns3/double.h"
46 #include <ns3/lte-enb-phy.h>
47 #include <ns3/lte-ue-phy.h>
48 #include <ns3/boolean.h>
58 :
TestSuite (
"lte-pf-ff-mac-scheduler", SYSTEM)
60 NS_LOG_INFO (
"creating LenaTestPfFfMacSchedulerSuite");
62 bool errorModel =
false;
166 std::vector<uint16_t> dist;
168 dist.push_back (4800);
169 dist.push_back (6000);
170 dist.push_back (10000);
171 dist.push_back (20000);
172 std::vector<uint32_t> estThrPfDl;
173 estThrPfDl.push_back (90000);
174 estThrPfDl.push_back (37000);
175 estThrPfDl.push_back (37000);
176 estThrPfDl.push_back (17400);
177 estThrPfDl.push_back (17400);
178 std::vector<uint32_t> estThrPfUl;
179 estThrPfUl.push_back (469000);
180 estThrPfUl.push_back (157000);
181 estThrPfUl.push_back (125000);
182 estThrPfUl.push_back (85000);
183 estThrPfUl.push_back (26000);
198 std::ostringstream oss;
199 oss << nUser <<
" UEs, distance " << dist <<
" m";
204 :
TestCase (BuildNameString (nUser, dist)),
207 m_thrRefDl (thrRefDl),
208 m_thrRefUl (thrRefUl),
209 m_errorModelEnabled (errorModelEnabled)
235 lteHelper->SetAttribute (
"PathlossModel",
StringValue (
"ns3::FriisSpectrumPropagationLossModel"));
253 lteHelper->SetSchedulerType (
"ns3::PfFfMacScheduler");
254 enbDevs = lteHelper->InstallEnbDevice (enbNodes);
255 ueDevs = lteHelper->InstallUeDevice (ueNodes);
258 lteHelper->Attach (ueDevs, enbDevs.
Get (0));
263 lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
268 enbPhy->SetAttribute (
"TxPower",
DoubleValue (30.0));
269 enbPhy->SetAttribute (
"NoiseFigure",
DoubleValue (5.0));
272 for (
int i = 0; i <
m_nUser; i++)
278 uePhy->SetAttribute (
"TxPower",
DoubleValue (23.0));
279 uePhy->SetAttribute (
"NoiseFigure",
DoubleValue (9.0));
283 double statsStartTime = 0.300;
284 double statsDuration = 0.6;
285 double tolerance = 0.1;
288 lteHelper->EnableMacTraces ();
289 lteHelper->EnableRlcTraces ();
291 rlcStats->SetAttribute (
"StartTime",
TimeValue (Seconds (statsStartTime)));
292 rlcStats->SetAttribute (
"EpochDuration",
TimeValue (Seconds (statsDuration)));
301 std::vector <uint64_t> dlDataRxed;
302 for (
int i = 0; i <
m_nUser; i++)
307 dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
308 NS_LOG_INFO (
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)dlDataRxed.at (i) <<
" thr " << (double)dlDataRxed.at (i) / statsDuration <<
" ref " <<
m_thrRefDl);
316 for (
int i = 0; i <
m_nUser; i++)
325 std::vector <uint64_t> ulDataRxed;
326 for (
int i = 0; i <
m_nUser; i++)
332 ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
333 NS_LOG_INFO (
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)ulDataRxed.at (i) <<
" thr " << (double)ulDataRxed.at (i) / statsDuration <<
" ref " <<
m_thrRefUl);
341 for (
int i = 0; i <
m_nUser; i++)
357 std::ostringstream oss;
358 oss <<
"distances (m) = [ " ;
359 for (std::vector<uint16_t>::iterator it = dist.begin (); it != dist.end (); ++it)
369 :
TestCase (BuildNameString (dist.size (), dist)),
370 m_nUser (dist.size ()),
372 m_estThrPfDl (estThrPfDl),
373 m_estThrPfUl (estThrPfUl),
374 m_errorModelEnabled (errorModelEnabled)
399 lteHelper->SetAttribute (
"PathlossModel",
StringValue (
"ns3::FriisSpectrumPropagationLossModel"));
417 lteHelper->SetSchedulerType (
"ns3::PfFfMacScheduler");
418 enbDevs = lteHelper->InstallEnbDevice (enbNodes);
419 ueDevs = lteHelper->InstallUeDevice (ueNodes);
422 lteHelper->Attach (ueDevs, enbDevs.
Get (0));
427 lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
431 enbPhy->SetAttribute (
"TxPower",
DoubleValue (30.0));
432 enbPhy->SetAttribute (
"NoiseFigure",
DoubleValue (5.0));
435 for (
int i = 0; i <
m_nUser; i++)
441 uePhy->SetAttribute (
"TxPower",
DoubleValue (23.0));
442 uePhy->SetAttribute (
"NoiseFigure",
DoubleValue (9.0));
445 double statsStartTime = 0.300;
446 double statsDuration = 0.4;
447 double tolerance = 0.1;
450 lteHelper->EnableRlcTraces ();
452 rlcStats->SetAttribute (
"StartTime",
TimeValue (Seconds (statsStartTime)));
453 rlcStats->SetAttribute (
"EpochDuration",
TimeValue (Seconds (statsDuration)));
458 NS_LOG_INFO (
"DL - Test with " << m_nUser <<
" user(s)");
459 std::vector <uint64_t> dlDataRxed;
460 double totalData = 0;
461 double totalEstThrPf = 0;
462 for (
int i = 0; i <
m_nUser; i++)
468 dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
469 totalData += (double)dlDataRxed.at (i);
470 NS_LOG_INFO (
"\tUser " << i <<
" dist " <<
m_dist.at (i) <<
" imsi " << imsi <<
" bytes rxed " << (double)dlDataRxed.at (i) <<
" thr " << (double)dlDataRxed.at (i) / statsDuration);
479 for (
int i = 0; i <
m_nUser; i++)
481 double thrRatio = (double)dlDataRxed.at (i) / totalData;
482 double estThrRatio = (double)
m_estThrPfDl.at (i) / totalEstThrPf;
483 NS_LOG_INFO (
"\tUser " << i <<
" thrRatio " << thrRatio <<
" estThrRatio " << estThrRatio);
492 std::vector <uint64_t> ulDataRxed;
493 for (
int i = 0; i <
m_nUser; i++)
499 ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
500 NS_LOG_INFO (
"\tUser " << i <<
" dist " <<
m_dist.at (i) <<
" bytes rxed " << (double)ulDataRxed.at (i) <<
" thr " << (double)ulDataRxed.at (i) / statsDuration <<
" ref " << (double)
m_estThrPfUl.at (i));
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
hold variables of type string
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
#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...
Mobility model for which the current position does not change once it has been set and until it is se...
static void Run(void)
Run the simulation until one of:
LenaPfFfMacSchedulerTestCase2(std::vector< uint16_t > dist, std::vector< uint32_t > estThrPfDl, std::vector< uint32_t > estThrPfUl, bool errorModelEnabled)
NS_LOG_COMPONENT_DEFINE("LenaTestPfFfMacScheduler")
static std::string BuildNameString(uint16_t nUser, std::vector< uint16_t > dist)
This system test program creates different test cases with a single eNB and several UEs...
This class contains the specification of EPS Bearers.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
hold objects of type ns3::Time
holds a vector of ns3::NetDevice pointers
LenaTestPfFfMacSchedulerSuite()
std::vector< uint32_t > m_estThrPfDl
virtual ~LenaPfFfMacSchedulerTestCase2()
static std::string BuildNameString(uint16_t nUser, uint16_t dist)
static void Destroy(void)
Every event scheduled by the Simulator::insertAtDestroy method is invoked.
virtual ~LenaPfFfMacSchedulerTestCase1()
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())
std::vector< uint16_t > m_dist
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
std::vector< uint32_t > m_estThrPfUl
virtual void DoRun(void)
Implementation to actually run this TestCase.
Helper class used to assign positions and mobility models to nodes.
static void Stop(void)
If an event invokes this method, it will be the last event scheduled by the Simulator::run method bef...
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
static LenaTestPfFfMacSchedulerSuite lenaTestPfFfMacSchedulerSuite
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Hold a floating point type.
The eNodeB device implementation.
Ptr< T > GetObject(void) const
LenaPfFfMacSchedulerTestCase1(uint16_t nUser, uint16_t dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
virtual void DoRun(void)
Implementation to actually run this TestCase.
The LteUeNetDevice class implements the UE net device.