22 #include <ns3/object.h>
23 #include <ns3/spectrum-interference.h>
24 #include <ns3/spectrum-error-model.h>
27 #include <ns3/simulator.h>
28 #include <ns3/packet.h>
31 #include <ns3/radio-bearer-stats-calculator.h>
32 #include <ns3/mobility-building-info.h>
33 #include <ns3/hybrid-buildings-propagation-loss-model.h>
34 #include <ns3/eps-bearer.h>
35 #include <ns3/node-container.h>
36 #include <ns3/mobility-helper.h>
37 #include <ns3/net-device-container.h>
38 #include <ns3/lte-ue-net-device.h>
39 #include <ns3/lte-enb-net-device.h>
40 #include <ns3/lte-ue-rrc.h>
41 #include <ns3/lte-helper.h>
42 #include <ns3/string.h>
43 #include <ns3/double.h>
44 #include <ns3/lte-enb-phy.h>
45 #include <ns3/lte-ue-phy.h>
46 #include <ns3/config.h>
47 #include <ns3/boolean.h>
49 #include <ns3/unused.h>
50 #include <ns3/ff-mac-scheduler.h>
51 #include <ns3/buildings-helper.h>
61 :
TestSuite (
"lte-phy-error-model", SYSTEM)
63 NS_LOG_INFO (
"creating LenaTestPhyErrorModelTestCase");
107 std::ostringstream oss;
108 oss << nUser <<
" UEs, distance " << dist <<
" m";
113 :
TestCase (BuildNameString (nUser, dist)),
117 m_toleranceRxPackets (toleranceRxPackets)
159 lena->SetAttribute (
"PathlossModel",
StringValue (
"ns3::HybridBuildingsPropagationLossModel"));
160 lena->SetPathlossModelAttribute (
"ShadowSigmaOutdoor",
DoubleValue (0.0));
161 lena->SetPathlossModelAttribute (
"ShadowSigmaIndoor",
DoubleValue (0.0));
162 lena->SetPathlossModelAttribute (
"ShadowSigmaExtWalls",
DoubleValue (0.0));
167 lena->SetSchedulerType (
"ns3::RrFfMacScheduler");
170 enbDevs = lena->InstallEnbDevice (enbNodes);
171 ueDevs = lena->InstallUeDevice (ueNodes);
174 lena->Attach (ueDevs, enbDevs.
Get (0));
179 lena->ActivateDataRadioBearer (ueDevs, bearer);
184 enbPhy->SetAttribute (
"TxPower",
DoubleValue (43.0));
185 enbPhy->SetAttribute (
"NoiseFigure",
DoubleValue (5.0));
191 for (
int i = 0; i <
m_nUser; i++)
197 uePhy->SetAttribute (
"TxPower",
DoubleValue (23.0));
198 uePhy->SetAttribute (
"NoiseFigure",
DoubleValue (9.0));
201 lena->EnableRlcTraces ();
202 Time simulationTime = Seconds (1.000);
207 rlcStats->SetAttribute (
"EpochDuration",
TimeValue (simulationTime));
212 NS_LOG_INFO (
"\tTest downlink data shared channels (PDSCH)");
214 for (
int i = 0; i <
m_nUser; i++)
220 double dlRxPackets = rlcStats->GetDlRxPackets (imsi, lcId);
221 double dlTxPackets = rlcStats->GetDlTxPackets (imsi, lcId);
222 double dlBler = 1.0 - (dlRxPackets/dlTxPackets);
223 double expectedDlRxPackets = dlTxPackets -dlTxPackets*
m_blerRef;
224 NS_LOG_INFO (
"\tUser " << i <<
" imsi " << imsi <<
" DOWNLINK"
225 <<
" pkts rx " << dlRxPackets <<
" tx " << dlTxPackets
226 <<
" BLER " << dlBler <<
" Err " << std::fabs (m_blerRef - dlBler)
227 <<
" expected rx " << expectedDlRxPackets
228 <<
" difference " << std::abs (expectedDlRxPackets - dlRxPackets)
234 double expectedDlMinTxPackets = simulationTime.
GetMilliSeconds () - 50;
255 std::ostringstream oss;
256 oss << nEnb <<
" eNBs, distance " << dist <<
" m";
262 :
TestCase (BuildNameString (nEnb, dist)),
306 lena->SetAttribute (
"PathlossModel",
StringValue (
"ns3::HybridBuildingsPropagationLossModel"));
307 lena->SetPathlossModelAttribute (
"ShadowSigmaOutdoor",
DoubleValue (0.0));
308 lena->SetPathlossModelAttribute (
"ShadowSigmaIndoor",
DoubleValue (0.0));
309 lena->SetPathlossModelAttribute (
"ShadowSigmaExtWalls",
DoubleValue (0.0));
314 lena->SetSchedulerType (
"ns3::RrFfMacScheduler");
317 enbDevs = lena->InstallEnbDevice (enbNodes);
318 ueDevs = lena->InstallUeDevice (ueNodes);
321 lena->Attach (ueDevs, enbDevs.
Get (0));
326 lena->ActivateDataRadioBearer (ueDevs, bearer);
329 for (
int i = 0; i <
m_nEnb; i++)
336 enbPhy->SetAttribute (
"TxPower",
DoubleValue (43.0));
337 enbPhy->SetAttribute (
"NoiseFigure",
DoubleValue (5.0));
345 uePhy->SetAttribute (
"TxPower",
DoubleValue (23.0));
346 uePhy->SetAttribute (
"NoiseFigure",
DoubleValue (9.0));
349 lena->EnableRlcTraces ();
350 Time simulationTime = Seconds (1.000);
355 rlcStats->SetAttribute (
"EpochDuration",
TimeValue (simulationTime));
360 NS_LOG_INFO (
"\tTest downlink control channels (PCFICH+PDCCH)");
363 for (
int i = 0; i < nUser; i++)
368 double dlRxPackets = rlcStats->GetDlRxPackets (imsi, lcId);
369 double dlTxPackets = rlcStats->GetDlTxPackets (imsi, lcId);
370 double bler = 1.0 - (dlRxPackets/dlTxPackets);
372 <<
" pkts rx " << dlRxPackets <<
" tx " << dlTxPackets
373 <<
" BLER " << bler <<
" Err " << fabs (
m_blerRef - bler));
378 double expectedMinDlTxPackets = simulationTime.
GetMilliSeconds () - 50;
keep track of time values and allow control of global simulation resolution
smart pointer class similar to boost::intrusive_ptr
virtual void DoRun(void)
Implementation to actually run this TestCase.
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<NetDevice> stored in this container at a given index.
LenaDataPhyErrorModelTestCase(uint16_t nUser, uint16_t dist, uint16_t tbSize, double refBler, uint16_t toleranceRxPackets)
#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...
#define NS_LOG_COMPONENT_DEFINE(name)
virtual ~LenaDataPhyErrorModelTestCase()
virtual ~LenaDlCtrlPhyErrorModelTestCase()
static std::string BuildNameString(uint16_t nUser, uint16_t dist)
Keep track of the current position and velocity of an object.
#define NS_TEST_ASSERT_MSG_GT(actual, limit, msg)
Test that an actual value is greater than a limit and report and abort if not.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
hold variables of type 'enum'
hold objects of type ns3::Time
virtual void DoRun(void)
Implementation to actually run this TestCase.
holds a vector of ns3::NetDevice pointers
uint16_t m_toleranceRxPackets
static void Destroy(void)
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 AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
void SetPosition(const Vector &position)
Helper class used to assign positions and mobility models to nodes.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
static LenaTestPhyErrorModelrSuite lenaTestPhyErrorModelrSuite
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
LenaDlCtrlPhyErrorModelTestCase(uint16_t nEnbr, uint16_t dist, uint16_t tbSize, double refBler)
Hold an floating point type.
Ptr< T > GetObject(void) const
int64_t GetMilliSeconds(void) const
LenaTestPhyErrorModelrSuite()
static void Install(Ptr< Node > node)