21 #include <ns3/object.h>
22 #include <ns3/spectrum-interference.h>
23 #include <ns3/spectrum-error-model.h>
26 #include <ns3/simulator.h>
27 #include <ns3/packet.h>
31 #include <ns3/radio-bearer-stats-calculator.h>
32 #include <ns3/buildings-mobility-model.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>
52 #include "lte-test-harq.h"
59 LenaTestHarqSuite::LenaTestHarqSuite ()
60 : TestSuite (
"lte-harq", SYSTEM)
69 AddTestCase (
new LenaHarqTestCase (2, 4000, 41, 0.17, 18375), TestCase::QUICK);
75 AddTestCase (
new LenaHarqTestCase (1, 640, 469, 0.02, 236096), TestCase::QUICK);
81 static LenaTestHarqSuite lenaTestHarqSuite;
84 LenaHarqTestCase::BuildNameString (uint16_t nUser, uint16_t dist)
86 std::ostringstream oss;
87 oss << nUser <<
" UEs, distance " << dist <<
" m";
91 LenaHarqTestCase::LenaHarqTestCase (uint16_t nUser, uint16_t dist, uint16_t tbSize,
double amcBer,
double thrRef)
92 : TestCase (BuildNameString (nUser, dist)),
97 m_throughputRef (thrRef)
101 LenaHarqTestCase::~LenaHarqTestCase ()
180 lena->SetAttribute (
"PathlossModel",
StringValue (
"ns3::HybridBuildingsPropagationLossModel"));
181 lena->SetPathlossModelAttribute (
"ShadowSigmaOutdoor",
DoubleValue (0.0));
182 lena->SetPathlossModelAttribute (
"ShadowSigmaIndoor",
DoubleValue (0.0));
183 lena->SetPathlossModelAttribute (
"ShadowSigmaExtWalls",
DoubleValue (0.0));
188 lena->SetSchedulerType (
"ns3::RrFfMacScheduler");
189 lena->SetSchedulerAttribute (
"UlCqiFilter",
EnumValue (FfMacScheduler::PUSCH_UL_CQI));
191 enbDevs = lena->InstallEnbDevice (enbNodes);
192 ueDevs = lena->InstallUeDevice (ueNodes);
195 lena->Attach (ueDevs, enbDevs.
Get (0));
200 lena->ActivateDataRadioBearer (ueDevs, bearer);
205 enbPhy->SetAttribute (
"TxPower",
DoubleValue (43.0));
206 enbPhy->SetAttribute (
"NoiseFigure",
DoubleValue (5.0));
209 mm->SetPosition (
Vector (0.0, 0.0, 30.0));
212 for (
int i = 0; i < m_nUser; i++)
215 mm->SetPosition (
Vector (m_dist, 0.0, 1.0));
218 uePhy->SetAttribute (
"TxPower",
DoubleValue (23.0));
219 uePhy->SetAttribute (
"NoiseFigure",
DoubleValue (9.0));
223 double statsStartTime = 0.050;
224 double statsDuration = 4.0;
227 lena->EnableRlcTraces ();
230 rlcStats->SetAttribute (
"EpochDuration",
TimeValue (
Seconds (statsDuration)));
233 lena->EnableMacTraces ();
240 NS_LOG_INFO (
"\tTest on downlink data shared channels (PDSCH)");
241 NS_LOG_INFO (
"Test with " << m_nUser <<
" user(s) at distance " << m_dist <<
" expected Thr " << m_throughputRef);
242 for (
int i = 0; i < m_nUser; i++)
247 double txed = rlcStats->GetDlTxData (imsi, lcId);
248 double rxed = rlcStats->GetDlRxData (imsi, lcId);
249 double tolerance = 0.1;
251 NS_LOG_INFO (
" User " << i <<
" imsi " << imsi <<
" bytes rxed/t " << rxed/statsDuration <<
" txed/t " << txed/statsDuration <<
" thr Ref " << m_throughputRef <<
" Err " << (abs (txed/statsDuration - m_throughputRef)) / m_throughputRef);
253 NS_TEST_ASSERT_MSG_EQ_TOL (txed/statsDuration, m_throughputRef, m_throughputRef * tolerance,
" Unexpected Throughput!");
254 NS_TEST_ASSERT_MSG_EQ_TOL (rxed/statsDuration, m_throughputRef, m_throughputRef * tolerance,
" Unexpected Throughput!");
smart pointer class similar to boost::intrusive_ptr
hold variables of type string
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
#define NS_LOG_COMPONENT_DEFINE(name)
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
Buildings mobility model.
holds a vector of ns3::NetDevice pointers
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())
virtual void DoRun(void)
Implementation to actually run this test case.
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual test case to this test suite.
Helper class used to assign positions and mobility models to nodes.
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
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