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;
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);
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 ();
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 ();