26 #include "ns3/config-store.h" 
   27 #include "ns3/config.h" 
   28 #include "ns3/error-model.h" 
   30 #include "ns3/lte-rlc-header.h" 
   31 #include "ns3/lte-rlc-um.h" 
   32 #include "ns3/net-device-container.h" 
   33 #include "ns3/node-container.h" 
   34 #include "ns3/packet.h" 
   35 #include "ns3/pointer.h" 
   36 #include "ns3/radio-bearer-stats-calculator.h" 
   37 #include "ns3/rng-seed-manager.h" 
   38 #include "ns3/simulator.h" 
   49     double losses[] = {0.0, 0.05, 0.10, 0.15, 0.25, 0.50, 0.75, 0.90, 0.95};
 
   51         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,
 
   56     for (uint32_t l = 0; l < (
sizeof(losses) / 
sizeof(
double)); l++)
 
   58         for (uint32_t s = 0; s < (
sizeof(runs) / 
sizeof(uint32_t)); s++)
 
   60             for (uint32_t sduArrivalType = 0; sduArrivalType <= 1; ++sduArrivalType)
 
   62                 std::ostringstream name;
 
   63                 name << 
" losses = " << losses[l] * 100 << 
"%; run = " << runs[s];
 
   66                 switch (sduArrivalType)
 
   69                     bulkSduArrival = 
false;
 
   70                     name << 
"; continuous SDU arrival";
 
   73                     bulkSduArrival = 
true;
 
   74                     name << 
"; bulk SDU arrival";
 
   84                     testDuration = TestCase::QUICK;
 
   88                     testDuration = TestCase::EXTENSIVE;
 
   92                     testDuration = TestCase::TAKES_FOREVER;
 
  114       m_bulkSduArrival(bulkSduArrival),
 
  118     NS_LOG_INFO(
"Creating LteRlcAmTestingTestCase: " + name);
 
  142     uint16_t numberOfNodes = 1;
 
  166     lteSimpleHelper->SetAttribute(
"RlcEntity", 
StringValue(
"RlcAm"));
 
  171     enbNodes.
Create(numberOfNodes);
 
  172     ueNodes.
Create(numberOfNodes);
 
  204     ueLteDevs.
Get(0)->SetAttribute(
"ReceiveErrorModel", 
PointerValue(dlEm));
 
  205     ueLteDevs.
Get(0)->TraceConnectWithoutContext(
 
  212     uint32_t sduSizeBytes = 100;
 
  213     uint32_t numSdu = 1000;
 
  214     double sduStartTimeSeconds = 0.100;
 
  215     double sduStopTimeSeconds;
 
  216     double sduArrivalTimeSeconds;
 
  217     uint32_t dlTxOppSizeBytes = 150;
 
  218     double dlTxOpprTimeSeconds = 0.003;
 
  219     uint32_t ulTxOppSizeBytes = 140;
 
  220     double ulTxOpprTimeSeconds = 0.003;
 
  224         sduStopTimeSeconds = sduStartTimeSeconds + 0.010;
 
  228         sduStopTimeSeconds = sduStartTimeSeconds + 10;
 
  230     sduArrivalTimeSeconds = (sduStopTimeSeconds - sduStartTimeSeconds) / numSdu;
 
  233     lteSimpleHelper->m_enbRrc->SetArrivalTime(
Seconds(sduArrivalTimeSeconds));
 
  234     lteSimpleHelper->m_enbRrc->SetPduSize(sduSizeBytes);
 
  237     lteSimpleHelper->m_enbMac->SetTxOppSize(dlTxOppSizeBytes);
 
  238     lteSimpleHelper->m_enbMac->SetTxOppTime(
Seconds(dlTxOpprTimeSeconds));
 
  239     lteSimpleHelper->m_enbMac->SetTxOpportunityMode(LteTestMac::AUTOMATIC_MODE);
 
  242     lteSimpleHelper->m_ueMac->SetTxOppSize(ulTxOppSizeBytes);
 
  243     lteSimpleHelper->m_ueMac->SetTxOppTime(
Seconds(ulTxOpprTimeSeconds));
 
  244     lteSimpleHelper->m_ueMac->SetTxOpportunityMode(LteTestMac::AUTOMATIC_MODE);
 
  247     Simulator::Schedule(
Seconds(sduStartTimeSeconds),
 
  249                         lteSimpleHelper->m_enbRrc);
 
  250     Simulator::Schedule(
Seconds(sduStopTimeSeconds), &LteTestRrc::Stop, lteSimpleHelper->m_enbRrc);
 
  252     double maxDlThroughput = (dlTxOppSizeBytes / (dlTxOppSizeBytes + 4.0)) *
 
  253                              (dlTxOppSizeBytes / dlTxOpprTimeSeconds) * (1.0 - 
m_losses);
 
  254     const double statusProhibitSeconds = 0.020;
 
  255     double pollFrequency = (1.0 / dlTxOpprTimeSeconds) * (1 - 
m_losses);
 
  256     double statusFrequency = 
std::min(pollFrequency, 1.0 / statusProhibitSeconds);
 
  257     const uint32_t numNackSnPerStatusPdu = (ulTxOppSizeBytes * 8 - 14) / 10;
 
  258     double maxRetxThroughput =
 
  259         ((double)numNackSnPerStatusPdu * (
double)dlTxOppSizeBytes) * statusFrequency;
 
  260     double throughput = 
std::min(maxDlThroughput, maxRetxThroughput);
 
  262         ((sduSizeBytes) * (sduStopTimeSeconds - sduStartTimeSeconds) / sduArrivalTimeSeconds);
 
  307         Seconds(
std::max(sduStartTimeSeconds + totBytes / throughput, sduStopTimeSeconds)) + margin;
 
  309     NS_LOG_INFO(
"statusFrequency=" << statusFrequency << 
", maxDlThroughput=" << maxDlThroughput
 
  310                                    << 
", maxRetxThroughput=" << maxRetxThroughput << 
", totBytes=" 
  311                                    << totBytes << 
", stopTime=" << 
stopTime.
As(Time::S));
 
  316     uint32_t txEnbRrcPdus = lteSimpleHelper->m_enbRrc->GetTxPdus();
 
  317     uint32_t rxUeRrcPdus = lteSimpleHelper->m_ueRrc->GetRxPdus();
 
  319     uint32_t txEnbRlcPdus = lteSimpleHelper->m_enbMac->GetTxPdus();
 
  320     uint32_t rxUeRlcPdus = lteSimpleHelper->m_ueMac->GetRxPdus();
 
  325     NS_LOG_INFO(
"RLC PDUs   TX: " << txEnbRlcPdus << 
"   RX: " << rxUeRlcPdus
 
  327                                   << (100.0 * (
double)
m_dlDrops) / txEnbRlcPdus << 
"%)");
 
  331                           "lost RLC PDUs don't match TX + RX");
 
  333     NS_LOG_INFO(
"eNB tx RRC count = " << txEnbRrcPdus);
 
  338                           "TX PDUs (" << txEnbRrcPdus << 
") != RX PDUs (" << rxUeRrcPdus << 
")");
 
  340     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
~LteRlcAmE2eTestCase() override
bool m_bulkSduArrival
bulk SDU arrival
void DoRun() override
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
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.
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 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.
static LteRlcAmE2eTestSuite lteRlcAmE2eTestSuite
Static variable for test initialization.
#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.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...