22 #include <ns3/core-module.h>
23 #include <ns3/network-module.h>
24 #include <ns3/mobility-module.h>
25 #include <ns3/lte-module.h>
26 #include <ns3/internet-module.h>
27 #include <ns3/applications-module.h>
28 #include <ns3/point-to-point-module.h>
70 std::list<CheckPointEvent> checkPointEventList, std::string checkPointEventListName,
71 bool useUdp, std::string schedulerType,
bool admitHo,
bool useIdealRrc);
74 static std::string
BuildNameString (uint32_t nEnbs, uint32_t nUes, uint32_t nDedicatedBearers,
75 std::string checkPointEventListName,
76 bool useUdp, std::string schedulerType,
bool admitHo,
bool useIdealRrc);
77 virtual void DoRun (
void);
122 std::string checkPointEventListName,
123 bool useUdp, std::string schedulerType,
bool admitHo,
bool useIdealRrc)
125 std::ostringstream oss;
126 oss <<
"nEnbs=" << nEnbs
128 <<
" nDedicatedBearers=" << nDedicatedBearers
130 <<
" " << schedulerType
131 <<
" admitHo=" << admitHo
132 <<
" hoList: " << checkPointEventListName;
135 oss <<
", ideal RRC";
145 std::list<CheckPointEvent> checkPointEventList, std::string checkPointEventListName,
146 bool useUdp, std::string schedulerType,
bool admitHo,
bool useIdealRrc)
147 :
TestCase (BuildNameString (nEnbs, nUes, nDedicatedBearers, checkPointEventListName, useUdp, schedulerType, admitHo, useIdealRrc)),
150 m_nDedicatedBearers (nDedicatedBearers),
151 m_checkPointEventList (checkPointEventList),
152 m_checkPointEventListName (checkPointEventListName),
155 m_schedulerType (schedulerType),
157 m_useIdealRrc (useIdealRrc),
158 m_maxHoDuration (Seconds (0.1)),
159 m_statsDuration (Seconds (0.5)),
160 m_udpClientInterval (Seconds (0.01)),
161 m_udpClientPktSize (100)
190 double distance = 1000.0;
207 for (uint16_t i = 0; i <
m_nEnbs; i++)
209 Vector enbPosition (distance * (i + 1), 0, 0);
210 enbPositionAlloc->Add (enbPosition);
230 it != enbDevices.End ();
249 remoteHostContainer.
Create (1);
250 remoteHost = remoteHostContainer.
Get (0);
252 internet.
Install (remoteHostContainer);
262 ipv4h.
SetBase (
"1.0.0.0",
"255.0.0.0");
265 remoteHostAddr = internetIpIfaces.
GetAddress (1);
288 uint16_t dlPort = 10000;
289 uint16_t ulPort = 20000;
299 for (uint32_t u = 0; u < ueNodes.
GetN (); ++u)
322 clientApps.
Add (dlClientHelper.Install (remoteHost));
327 serverApps.
Add (sinkContainer);
338 serverApps.
Add (sinkContainer);
348 clientApps.
Add (dlClientHelper.
Install (remoteHost));
353 serverApps.
Add (sinkContainer);
365 serverApps.
Add (sinkContainer);
391 serverApps.
Start (startTime);
392 clientApps.
Start (startTime);
405 for (uint32_t u = 0; u < ueDevices.
GetN (); ++u)
421 const Time maxRrcConnectionEstablishmentDuration = Seconds (0.080);
427 this, *it, enbDevices.Get (0));
437 for (
Time checkPointTime = checkPointEventIt->checkStartTime;
438 checkPointTime < checkPointEventIt->checkStopTime;
439 checkPointTime += checkPointEventIt->checkInterval)
442 this, ueDevices.
Get (checkPointEventIt->ueDeviceIndex),
443 enbDevices.Get (checkPointEventIt->enbDeviceIndex));
445 Time saveStatsTime = checkPointTime;
447 this, checkPointEventIt->ueDeviceIndex);
451 this, checkPointEventIt->ueDeviceIndex);
453 if (stopTime <= checkStats)
455 stopTime = checkStats + Seconds (1);
477 uint16_t rnti = ueRrc->GetRnti ();
485 uint16_t ueCellId = ueRrc->GetCellId ();
486 uint16_t enbCellId = enbLteDevice->GetCellId ();
487 uint8_t ueDlBandwidth = ueRrc->GetDlBandwidth ();
488 uint8_t enbDlBandwidth = enbLteDevice->GetDlBandwidth ();
489 uint8_t ueUlBandwidth = ueRrc->GetUlBandwidth ();
490 uint8_t enbUlBandwidth = enbLteDevice->GetUlBandwidth ();
491 uint8_t ueDlEarfcn = ueRrc->GetDlEarfcn ();
492 uint8_t enbDlEarfcn = enbLteDevice->GetDlEarfcn ();
493 uint8_t ueUlEarfcn = ueRrc->GetUlEarfcn ();
494 uint8_t enbUlEarfcn = enbLteDevice->GetUlEarfcn ();
495 uint64_t ueImsi = ueLteDevice->GetImsi ();
496 uint64_t enbImsi = ueManager->
GetImsi ();
506 ueManager->
GetAttribute (
"DataRadioBearerMap", enbDataRadioBearerMapValue);
510 ueRrc->GetAttribute (
"DataRadioBearerMap", ueDataRadioBearerMapValue);
515 while (enbBearerIt != enbDataRadioBearerMapValue.
End ()
516 && ueBearerIt != ueDataRadioBearerMapValue.End ())
530 NS_ASSERT_MSG (enbBearerIt == enbDataRadioBearerMapValue.
End (),
"too many bearers at eNB");
531 NS_ASSERT_MSG (ueBearerIt == ueDataRadioBearerMapValue.End (),
"too many bearers at UE");
538 for (std::list<BearerData>::iterator it =
m_ueDataVector.at (ueIndex).bearerDataList.begin ();
544 it->dlOldTotalRx = it->dlSink->GetTotalRx ();
548 it->ulOldTotalRx = it->ulSink->GetTotalRx ();
558 for (std::list<BearerData>::iterator it =
m_ueDataVector.at (ueIndex).bearerDataList.begin ();
567 dlRx = it->dlSink->GetTotalRx () - it->dlOldTotalRx;
572 ulRx = it->ulSink->GetTotalRx () - it->ulOldTotalRx;
576 NS_LOG_LOGIC (
"expBytes " << expectedBytes <<
" dlRx " << dlRx <<
" ulRx " << ulRx);
581 NS_TEST_ASSERT_MSG_GT (dlRx, 0.500 * expectedBytes,
"too few RX bytes in DL, ue=" << ueIndex <<
", b=" << b);
585 NS_TEST_ASSERT_MSG_GT (ulRx, 0.500 * expectedBytes,
"too few RX bytes in UL, ue=" << ueIndex <<
", b=" << b);
600 :
TestSuite (
"lte-x2-handover-measures", SYSTEM)
602 Time checkInterval = Seconds (1);
604 std::string cel1name (
"ho: 0 -> 1");
605 std::list<CheckPointEvent> cel1;
606 cel1.push_back (
CheckPointEvent (Seconds (1), Seconds (10.1), checkInterval, 0, 0));
607 cel1.push_back (
CheckPointEvent (Seconds (11), Seconds (37), checkInterval, 0, 1));
609 std::string cel2name (
"ho: 0 -> 1 -> 2");
610 std::list<CheckPointEvent> cel2;
611 cel2.push_back (
CheckPointEvent (Seconds (1), Seconds (10.1), Seconds (1), 0, 0));
612 cel2.push_back (
CheckPointEvent (Seconds (11), Seconds (17.1), Seconds (1), 0, 1));
613 cel2.push_back (
CheckPointEvent (Seconds (18), Seconds (37), Seconds (1), 0, 2));
615 std::string cel3name (
"ho: 0 -> 1 -> 2 -> 3");
616 std::list<CheckPointEvent> cel3;
617 cel3.push_back (
CheckPointEvent (Seconds (1), Seconds (10.1), Seconds (1), 0, 0));
618 cel3.push_back (
CheckPointEvent (Seconds (11), Seconds (17.1), Seconds (1), 0, 1));
619 cel3.push_back (
CheckPointEvent (Seconds (18), Seconds (24.1), Seconds (1), 0, 2));
620 cel3.push_back (
CheckPointEvent (Seconds (25), Seconds (37), Seconds (1), 0, 3));
624 std::vector<std::string> schedulers;
625 schedulers.push_back (
"ns3::PfFfMacScheduler");
626 for (std::vector<std::string>::iterator schedIt = schedulers.begin (); schedIt != schedulers.end (); ++schedIt)
628 for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
643 schedulers.resize (0);
644 schedulers.push_back (
"ns3::RrFfMacScheduler");
645 for (std::vector<std::string>::iterator schedIt = schedulers.begin (); schedIt != schedulers.end (); ++schedIt)
647 for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)