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>
59 :
TestSuite (
"lte-tdbet-ff-mac-scheduler", SYSTEM)
61 NS_LOG_INFO (
"creating LenaTestTdBetFfMacSchedulerSuite");
63 bool errorModel =
false;
150 std::vector<uint16_t> dist;
152 dist.push_back (4800);
153 dist.push_back (6000);
154 dist.push_back (10000);
155 dist.push_back (20000);
156 std::vector<uint32_t> estAchievableRateDl;
157 estAchievableRateDl.push_back (2196000);
158 estAchievableRateDl.push_back (1383000);
159 estAchievableRateDl.push_back (775000);
160 estAchievableRateDl.push_back (421000);
161 estAchievableRateDl.push_back (421000);
162 std::vector<uint32_t> estThrTdBetUl;
163 estThrTdBetUl.push_back (469000);
164 estThrTdBetUl.push_back (157000);
165 estThrTdBetUl.push_back (125000);
166 estThrTdBetUl.push_back (85000);
167 estThrTdBetUl.push_back (26000);
180 std::ostringstream oss;
181 oss << nUser <<
" UEs, distance " << dist <<
" m";
186 :
TestCase (BuildNameString (nUser, dist)),
189 m_thrRefDl (thrRefDl),
190 m_thrRefUl (thrRefUl),
191 m_errorModelEnabled (errorModelEnabled)
216 lteHelper->SetAttribute (
"PathlossModel",
StringValue (
"ns3::FriisSpectrumPropagationLossModel"));
234 lteHelper->SetSchedulerType (
"ns3::TdBetFfMacScheduler");
235 enbDevs = lteHelper->InstallEnbDevice (enbNodes);
236 ueDevs = lteHelper->InstallUeDevice (ueNodes);
239 lteHelper->Attach (ueDevs, enbDevs.
Get (0));
244 lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
248 enbPhy->SetAttribute (
"TxPower",
DoubleValue (30.0));
249 enbPhy->SetAttribute (
"NoiseFigure",
DoubleValue (5.0));
252 for (
int i = 0; i <
m_nUser; i++)
258 uePhy->SetAttribute (
"TxPower",
DoubleValue (23.0));
259 uePhy->SetAttribute (
"NoiseFigure",
DoubleValue (9.0));
262 double statsStartTime = 0.300;
263 double statsDuration = 0.6;
264 double tolerance = 0.1;
267 lteHelper->EnableMacTraces ();
268 lteHelper->EnableRlcTraces ();
270 rlcStats->SetAttribute (
"StartTime",
TimeValue (Seconds (statsStartTime)));
271 rlcStats->SetAttribute (
"EpochDuration",
TimeValue (Seconds (statsDuration)));
281 std::vector <uint64_t> dlDataRxed;
282 for (
int i = 0; i <
m_nUser; i++)
288 dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
289 NS_LOG_INFO (
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)dlDataRxed.at (i) <<
" thr " << (double)dlDataRxed.at (i) / statsDuration <<
" ref " <<
m_thrRefDl);
297 for (
int i = 0; i <
m_nUser; i++)
306 std::vector <uint64_t> ulDataRxed;
307 for (
int i = 0; i <
m_nUser; i++)
313 ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
314 NS_LOG_INFO (
"\tUser " << i <<
" imsi " << imsi <<
" bytes rxed " << (
double)ulDataRxed.at (i) <<
" thr " << (double)ulDataRxed.at (i) / statsDuration <<
" ref " <<
m_thrRefUl);
322 for (
int i = 0; i <
m_nUser; i++)
338 std::ostringstream oss;
339 oss <<
"distances (m) = [ " ;
340 for (std::vector<uint16_t>::iterator it = dist.begin (); it != dist.end (); ++it)
350 :
TestCase (BuildNameString (dist.size (), dist)),
351 m_nUser (dist.size ()),
353 m_achievableRateDl (estAchievableRateDl),
354 m_estThrTdBetUl (estThrTdBetUl),
355 m_errorModelEnabled (errorModelEnabled)
382 lteHelper->SetAttribute (
"PathlossModel",
StringValue (
"ns3::FriisSpectrumPropagationLossModel"));
400 lteHelper->SetSchedulerType (
"ns3::TdBetFfMacScheduler");
401 enbDevs = lteHelper->InstallEnbDevice (enbNodes);
402 ueDevs = lteHelper->InstallUeDevice (ueNodes);
405 lteHelper->Attach (ueDevs, enbDevs.
Get (0));
410 lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
414 enbPhy->SetAttribute (
"TxPower",
DoubleValue (30.0));
415 enbPhy->SetAttribute (
"NoiseFigure",
DoubleValue (5.0));
418 for (
int i = 0; i <
m_nUser; i++)
424 uePhy->SetAttribute (
"TxPower",
DoubleValue (23.0));
425 uePhy->SetAttribute (
"NoiseFigure",
DoubleValue (9.0));
429 double statsStartTime = 0.300;
430 double statsDuration = 0.4;
431 double tolerance = 0.1;
434 lteHelper->EnableMacTraces ();
435 lteHelper->EnableRlcTraces ();
437 rlcStats->SetAttribute (
"StartTime",
TimeValue (Seconds (statsStartTime)));
438 rlcStats->SetAttribute (
"EpochDuration",
TimeValue (Seconds (statsDuration)));
442 NS_LOG_INFO (
"DL - Test with " << m_nUser <<
" user(s)");
443 std::vector <uint64_t> dlDataRxed;
444 double totalData = 0;
445 double estTotalThr = 0;
447 for (
int i = 0; i <
m_nUser; i++)
453 dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
454 totalData += (double)dlDataRxed.at (i);
456 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);
459 estTotalThr = m_nUser * (1 / estTotalThr);
460 estUeThr = estTotalThr /
m_nUser;
465 for (
int i = 0; i <
m_nUser; i++)
467 double thrRatio = (double) 1 / m_nUser;
468 double estThrRatio = (double)dlDataRxed.at (i) / totalData;
469 NS_LOG_INFO (
"\tUser " << i <<
" thrRatio " << thrRatio <<
" estThrRatio " << estThrRatio);
471 NS_TEST_ASSERT_MSG_EQ_TOL ((
double)dlDataRxed.at (i) / statsDuration, estUeThr, estUeThr * tolerance,
" Unfair Throughput!");
480 std::vector <uint64_t> ulDataRxed;
481 for (
int i = 0; i <
m_nUser; i++)
487 ulDataRxed.push_back (rlcStats->GetUlRxData (imsi, lcId));
488 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_estThrTdBetUl.at (i));
LenaTdBetFfMacSchedulerTestCase1(uint16_t nUser, uint16_t dist, double thrRefDl, double thrRefUl, bool errorModelEnabled)
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
static std::string BuildNameString(uint16_t nUser, uint16_t dist)
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...
static LenaTestTdBetFfMacSchedulerSuite lenaTestTdBetFfMacSchedulerSuite
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:
virtual void DoRun(void)
Implementation to actually run this TestCase.
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
static void Destroy(void)
Every event scheduled by the Simulator::insertAtDestroy method is invoked.
LenaTestTdBetFfMacSchedulerSuite()
NS_LOG_COMPONENT_DEFINE("LenaTestTdBetFfMacScheduler")
void SetDefault(std::string name, const AttributeValue &value)
std::vector< uint32_t > m_achievableRateDl
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 AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
std::vector< uint32_t > m_estThrTdBetUl
This system test program creates different test cases with a single eNB and several UEs...
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.
#define NS_LOG_DEBUG(msg)
std::vector< uint16_t > m_dist
virtual void DoRun(void)
Implementation to actually run this TestCase.
static std::string BuildNameString(uint16_t nUser, std::vector< uint16_t > dist)
LenaTdBetFfMacSchedulerTestCase2(std::vector< uint16_t > dist, std::vector< uint32_t > m_achievableRateDl, std::vector< uint32_t > estThrTdBetUl, bool m_errorModelEnabled)
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
virtual ~LenaTdBetFfMacSchedulerTestCase1()
virtual ~LenaTdBetFfMacSchedulerTestCase2()
The LteUeNetDevice class implements the UE net device.