# HG changeset patch # User Nicola Baldo # Date 1428928752 -7200 # Node ID b269d8d27fcd9117e8b88f909b074d73a68bcdd6 # Parent 27574410fff6d9be13b3629eb128f6fc6b932ba4 revised lte-rlc-am-e2e test diff -r 27574410fff6 -r b269d8d27fcd src/lte/test/lte-test-rlc-am-e2e.cc --- a/src/lte/test/lte-test-rlc-am-e2e.cc Mon Apr 13 14:38:23 2015 +0200 +++ b/src/lte/test/lte-test-rlc-am-e2e.cc Mon Apr 13 14:39:12 2015 +0200 @@ -16,6 +16,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: Manuel Requena + * Nicola Baldo */ #include "ns3/config.h" @@ -67,7 +68,7 @@ std::ostringstream name; name << " Losses = " << losses[l] * 100 << "%. Run = " << runs[s]; TestCase::TestDuration testDuration; - if (l == 6 && s == 16) + if (l == 6 && s == 0) { testDuration = TestCase::QUICK; } @@ -141,6 +142,9 @@ // LogComponentEnable ("LteRlcAm", level); Config::SetGlobal ("RngRun", IntegerValue (m_run)); + Config::SetDefault ("ns3::LteRlcAm::PollRetransmitTimer", TimeValue (MilliSeconds (20))); + Config::SetDefault ("ns3::LteRlcAm::ReorderingTimer", TimeValue (MilliSeconds (10))); + Config::SetDefault ("ns3::LteRlcAm::StatusProhibitTimer", TimeValue (MilliSeconds (10))); Ptr lteSimpleHelper = CreateObject (); // lteSimpleHelper->EnableLogComponents (); @@ -217,12 +221,53 @@ Simulator::Schedule (Seconds (sduStartTimeSeconds), &LteTestRrc::Start, lteSimpleHelper->m_enbRrc); Simulator::Schedule (Seconds (sduStopTimeSeconds), &LteTestRrc::Stop, lteSimpleHelper->m_enbRrc); - //double throughput = (150.0/0.005) * (1.0-m_losses); - double throughput = (dlTxOppSizeBytes/(dlTxOppSizeBytes+4.0))*(dlTxOppSizeBytes/dlTxOpprTimeSeconds) * (1.0-m_losses); - //double totBytes = ((100 + 4) * 10.0 / 0.010); + + double maxDlThroughput = (dlTxOppSizeBytes/(dlTxOppSizeBytes+4.0))*(dlTxOppSizeBytes/dlTxOpprTimeSeconds) * (1.0-m_losses); + const double statusProhibitSeconds = 0.020; + double pollFrequency = (1.0/dlTxOpprTimeSeconds)*(1-m_losses); + double statusFrequency = std::min (pollFrequency, 1.0/statusProhibitSeconds); + const uint32_t numNackSnPerStatusPdu = (ulTxOppSizeBytes*8 - 14)/10; + double maxRetxThroughput = ((double)numNackSnPerStatusPdu*(double)dlTxOppSizeBytes)*statusFrequency; + double throughput = std::min (maxDlThroughput, maxRetxThroughput); double totBytes = ((sduSizeBytes) * (sduStopTimeSeconds - sduStartTimeSeconds) / sduArrivalTimeSeconds); - Time stopTime = Seconds (std::max (totBytes/throughput, 10.0) + 20); - NS_LOG_INFO ("throughput=" << throughput << ", totBytes=" << totBytes << ", stopTime=" << stopTime.GetSeconds () << "s"); + + + // note: the throughput estimation is valid only for the full buffer + // case. However, the test sends a finite number of SDUs. Hence, the + // estimated throughput will only be effective at the beginning of + // the test. Towards the end of the test, no new data is + // transmitted, hence less feedback is sent, hence the transmission + // rate for the last PDUs to be retransmitted is much lower. This + // effect can be best noteed at very high loss rates. + // Estimating correctly this effect would require a complex stateful + // model (e.g., a Markov chain model) so to avoid the hassle we just + // use a margin here which we empirically determine as something we + // think reasonable based on the PDU loss rate + Time margin; + if (m_losses < 0.20) + { + margin = Seconds (2); + } + else if (m_losses < 0.50) + { + margin = Seconds (5); + } + else if (m_losses < 0.70) + { + margin = Seconds (10); + } + else if (m_losses < 0.91) + { + margin = Seconds (20); + } + else // 0.95 + { + margin = Seconds (30); + } + + + Time stopTime = Seconds (std::max (totBytes/throughput, 10.0)) + margin; + NS_LOG_INFO ("statusFrequency=" << statusFrequency << ", maxDlThroughput=" << maxDlThroughput << ", maxRetxThroughput=" << maxRetxThroughput << ", totBytes=" << totBytes << ", stopTime=" << stopTime.GetSeconds () << "s"); Simulator::Stop (stopTime); Simulator::Run ();