22 #include "ns3/config.h"
23 #include "ns3/simulator.h"
24 #include "ns3/pointer.h"
26 #include "ns3/packet.h"
27 #include "ns3/node-container.h"
28 #include "ns3/net-device-container.h"
29 #include "ns3/error-model.h"
30 #include "ns3/rng-seed-manager.h"
31 #include "ns3/radio-bearer-stats-calculator.h"
32 #include "ns3/lte-rlc-header.h"
33 #include "ns3/lte-rlc-um.h"
34 #include "ns3/config-store.h"
50 double losses[] = {0.0, 0.05, 0.10, 0.15, 0.25, 0.50, 0.75, 0.90, 0.95};
51 uint32_t runs[] = {1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999, 11110,
52 12221, 13332, 14443, 15554, 16665, 17776, 18887, 19998, 21109, 22220,
53 23331, 24442, 25553, 26664, 27775, 28886, 29997, 31108, 32219, 33330};
55 for ( uint32_t l = 0; l < (
sizeof (losses) /
sizeof (
double)); l++ )
57 for ( uint32_t s = 0; s < (
sizeof (runs) /
sizeof (uint32_t)); s++ )
59 for (uint32_t sduArrivalType = 0; sduArrivalType <= 1; ++sduArrivalType)
61 std::ostringstream name;
62 name <<
" losses = " << losses[l] * 100 <<
"%; run = " << runs[s];
65 switch (sduArrivalType)
68 bulkSduArrival =
false;
69 name <<
"; continuous SDU arrival";
72 bulkSduArrival =
true;
73 name <<
"; bulk SDU arrival";
83 testDuration = TestCase::QUICK;
87 testDuration = TestCase::EXTENSIVE;
91 testDuration = TestCase::TAKES_FOREVER;
105 m_bulkSduArrival (bulkSduArrival),
109 NS_LOG_INFO (
"Creating LteRlcAmTestingTestCase: " + name);
133 uint16_t numberOfNodes = 1;
159 lteSimpleHelper->SetAttribute (
"RlcEntity",
StringValue (
"RlcAm"));
164 enbNodes.
Create (numberOfNodes);
165 ueNodes.
Create (numberOfNodes);
202 uint32_t sduSizeBytes = 100;
203 uint32_t numSdu = 1000;
204 double sduStartTimeSeconds = 0.100;
205 double sduStopTimeSeconds;
206 double sduArrivalTimeSeconds;
207 uint32_t dlTxOppSizeBytes = 150;
208 double dlTxOpprTimeSeconds = 0.003;
209 uint32_t ulTxOppSizeBytes = 140;
210 double ulTxOpprTimeSeconds = 0.003;
214 sduStopTimeSeconds = sduStartTimeSeconds + 0.010;
218 sduStopTimeSeconds = sduStartTimeSeconds + 10;
220 sduArrivalTimeSeconds = (sduStopTimeSeconds - sduStartTimeSeconds) / numSdu;
225 lteSimpleHelper->m_enbRrc->SetArrivalTime (
Seconds (sduArrivalTimeSeconds));
226 lteSimpleHelper->m_enbRrc->SetPduSize (sduSizeBytes);
229 lteSimpleHelper->m_enbMac->SetTxOppSize (dlTxOppSizeBytes);
230 lteSimpleHelper->m_enbMac->SetTxOppTime (
Seconds (dlTxOpprTimeSeconds));
231 lteSimpleHelper->m_enbMac->SetTxOpportunityMode (LteTestMac::AUTOMATIC_MODE);
234 lteSimpleHelper->m_ueMac->SetTxOppSize (ulTxOppSizeBytes);
235 lteSimpleHelper->m_ueMac->SetTxOppTime (
Seconds (ulTxOpprTimeSeconds));
236 lteSimpleHelper->m_ueMac->SetTxOpportunityMode (LteTestMac::AUTOMATIC_MODE);
239 Simulator::Schedule (
Seconds (sduStartTimeSeconds), &LteTestRrc::Start, lteSimpleHelper->m_enbRrc);
240 Simulator::Schedule (
Seconds (sduStopTimeSeconds), &LteTestRrc::Stop, lteSimpleHelper->m_enbRrc);
243 double maxDlThroughput = (dlTxOppSizeBytes / (dlTxOppSizeBytes + 4.0)) * (dlTxOppSizeBytes / dlTxOpprTimeSeconds) * (1.0 -
m_losses);
244 const double statusProhibitSeconds = 0.020;
245 double pollFrequency = (1.0 / dlTxOpprTimeSeconds) * (1 -
m_losses);
246 double statusFrequency =
std::min (pollFrequency, 1.0 / statusProhibitSeconds);
247 const uint32_t numNackSnPerStatusPdu = (ulTxOppSizeBytes * 8 - 14) / 10;
248 double maxRetxThroughput = ((double)numNackSnPerStatusPdu * (
double)dlTxOppSizeBytes) * statusFrequency;
249 double throughput =
std::min (maxDlThroughput, maxRetxThroughput);
250 double totBytes = ((sduSizeBytes) * (sduStopTimeSeconds - sduStartTimeSeconds) / sduArrivalTimeSeconds);
297 NS_LOG_INFO (
"statusFrequency=" << statusFrequency <<
", maxDlThroughput=" << maxDlThroughput <<
", maxRetxThroughput=" << maxRetxThroughput <<
", totBytes=" << totBytes <<
", stopTime=" <<
stopTime.
As (Time::S));
302 uint32_t txEnbRrcPdus = lteSimpleHelper->m_enbRrc->GetTxPdus ();
303 uint32_t rxUeRrcPdus = lteSimpleHelper->m_ueRrc->GetRxPdus ();
305 uint32_t txEnbRlcPdus = lteSimpleHelper->m_enbMac->GetTxPdus ();
306 uint32_t rxUeRlcPdus = lteSimpleHelper->m_ueMac->GetRxPdus ();
313 <<
" RX: " << rxUeRlcPdus
315 <<
" (" << (100.0 * (
double)
m_dlDrops) / txEnbRlcPdus <<
"%)");
319 NS_LOG_INFO (
"eNB tx RRC count = " << txEnbRrcPdus);
324 "TX PDUs (" << txEnbRrcPdus <<
") != RX PDUs (" << rxUeRrcPdus <<
")");
326 Simulator::Destroy ();
Test cases used for the test suite lte-rlc-am-e2e.
void DlDropEvent(Ptr< const Packet > p)
DL drop event.
uint32_t m_ulDrops
number of UL drops
bool m_bulkSduArrival
bulk SDU arrival
virtual void DoRun(void)
Implementation to actually run this TestCase.
void UlDropEvent(Ptr< const Packet > p)
UL drop event.
uint32_t m_dlDrops
number of Dl drops
double m_losses
error rate
virtual ~LteRlcAmE2eTestCase()
Test suite for RlcAmE2e test case.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
holds a vector of ns3::NetDevice pointers
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Hold objects of type Ptr<T>.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
Hold variables of type string.
TestDuration
How long the test takes to execute.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
AttributeValue implementation for Time.
Hold an unsigned integer type.
void SetGlobal(std::string name, const AttributeValue &value)
void SetDefault(std::string name, const AttributeValue &value)
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Time Seconds(double value)
Construct a Time in the indicated unit.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
static LteRlcAmE2eTestSuite lteRlcAmE2eTestSuite
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...