A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
test-lte-x2-handover-measures.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Authors: Nicola Baldo <nbaldo@cttc.es>
18 * Manuel Requena <manuel.requena@cttc.es>
19 */
20
21#include <ns3/applications-module.h>
22#include <ns3/core-module.h>
23#include <ns3/internet-module.h>
24#include <ns3/lte-module.h>
25#include <ns3/mobility-module.h>
26#include <ns3/network-module.h>
27#include <ns3/point-to-point-module.h>
28
29using namespace ns3;
30
31NS_LOG_COMPONENT_DEFINE("LteX2HandoverMeasuresTest");
32
39{
45
55 CheckPointEvent(Time start, Time stop, Time interval, uint32_t ueIndex, uint32_t enbIndex)
56 : checkStartTime(start),
57 checkStopTime(stop),
58 checkInterval(interval),
59 ueDeviceIndex(ueIndex),
60 enbDeviceIndex(enbIndex)
61 {
62 }
63};
64
72{
73 public:
90 uint32_t nUes,
91 uint32_t nDedicatedBearers,
92 std::list<CheckPointEvent> checkPointEventList,
93 std::string checkPointEventListName,
94 bool useUdp,
95 std::string schedulerType,
96 std::string handoverAlgorithmType,
97 bool admitHo,
98 bool useIdealRrc);
99
100 private:
115 static std::string BuildNameString(uint32_t nEnbs,
116 uint32_t nUes,
117 uint32_t nDedicatedBearers,
118 std::string checkPointEventListName,
119 bool useUdp,
120 std::string schedulerType,
121 std::string handoverAlgorithmType,
122 bool admitHo,
123 bool useIdealRrc);
124 void DoRun() override;
130 void CheckConnected(Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
131
135 std::list<CheckPointEvent> m_checkPointEventList;
137 bool m_epc;
138 bool m_useUdp;
139 std::string m_schedulerType;
145
152 {
158 };
159
165 struct UeData
166 {
168 std::list<BearerData> bearerDataList;
169 };
170
175 void SaveStats(uint32_t ueIndex);
180 void CheckStats(uint32_t ueIndex);
181
182 std::vector<UeData> m_ueDataVector;
183
188};
189
190std::string
192 uint32_t nUes,
193 uint32_t nDedicatedBearers,
194 std::string checkPointEventListName,
195 bool useUdp,
196 std::string schedulerType,
197 std::string handoverAlgorithmType,
198 bool admitHo,
199 bool useIdealRrc)
200{
201 std::ostringstream oss;
202 oss << "nEnbs=" << nEnbs << " nUes=" << nUes << " nDedicatedBearers=" << nDedicatedBearers
203 << " udp=" << useUdp << " " << schedulerType << " " << handoverAlgorithmType
204 << " admitHo=" << admitHo << " hoList: " << checkPointEventListName;
205 if (useIdealRrc)
206 {
207 oss << ", ideal RRC";
208 }
209 else
210 {
211 oss << ", real RRC";
212 }
213 return oss.str();
214}
215
217 uint32_t nEnbs,
218 uint32_t nUes,
219 uint32_t nDedicatedBearers,
220 std::list<CheckPointEvent> checkPointEventList,
221 std::string checkPointEventListName,
222 bool useUdp,
223 std::string schedulerType,
224 std::string handoverAlgorithmType,
225 bool admitHo,
226 bool useIdealRrc)
227 : TestCase(BuildNameString(nEnbs,
228 nUes,
229 nDedicatedBearers,
230 checkPointEventListName,
231 useUdp,
232 schedulerType,
233 handoverAlgorithmType,
234 admitHo,
235 useIdealRrc)),
236 m_nEnbs(nEnbs),
237 m_nUes(nUes),
238 m_nDedicatedBearers(nDedicatedBearers),
239 m_checkPointEventList(checkPointEventList),
240 m_checkPointEventListName(checkPointEventListName),
241 m_epc(true),
242 m_useUdp(useUdp),
243 m_schedulerType(schedulerType),
244 m_handoverAlgorithmType(handoverAlgorithmType),
245 m_admitHo(admitHo),
246 m_useIdealRrc(useIdealRrc),
247 m_maxHoDuration(Seconds(0.1)),
248 m_statsDuration(Seconds(0.5)),
249 m_udpClientInterval(Seconds(0.01)),
250 m_udpClientPktSize(100)
251{
252}
253
254void
256{
258 m_nUes,
261 m_useUdp,
264 m_admitHo,
266
268 Config::SetDefault("ns3::UdpClient::Interval", TimeValue(m_udpClientInterval));
269 Config::SetDefault("ns3::UdpClient::MaxPackets", UintegerValue(1000000));
270 Config::SetDefault("ns3::UdpClient::PacketSize", UintegerValue(m_udpClientPktSize));
271 Config::SetDefault("ns3::LteEnbRrc::HandoverJoiningTimeoutDuration",
272 TimeValue(MilliSeconds(200)));
273 Config::SetDefault("ns3::LteEnbPhy::TxPower", DoubleValue(20));
274
275 // Disable Uplink Power Control
276 Config::SetDefault("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue(false));
277
278 int64_t stream = 1;
279
280 m_lteHelper = CreateObject<LteHelper>();
281 m_lteHelper->SetAttribute("PathlossModel",
282 StringValue("ns3::FriisSpectrumPropagationLossModel"));
285
286 if (m_handoverAlgorithmType == "ns3::A2A4RsrqHandoverAlgorithm")
287 {
288 m_lteHelper->SetHandoverAlgorithmType("ns3::A2A4RsrqHandoverAlgorithm");
289 m_lteHelper->SetHandoverAlgorithmAttribute("ServingCellThreshold", UintegerValue(30));
290 m_lteHelper->SetHandoverAlgorithmAttribute("NeighbourCellOffset", UintegerValue(1));
291 }
292 else if (m_handoverAlgorithmType == "ns3::A3RsrpHandoverAlgorithm")
293 {
294 m_lteHelper->SetHandoverAlgorithmType("ns3::A3RsrpHandoverAlgorithm");
297 }
298 else
299 {
300 NS_FATAL_ERROR("Unknown handover algorithm " << m_handoverAlgorithmType);
301 }
302
303 double distance = 1000.0; // m
304 double speed = 150; // m/s
305
306 NodeContainer enbNodes;
307 enbNodes.Create(m_nEnbs);
308 NodeContainer ueNodes;
309 ueNodes.Create(m_nUes);
310
311 if (m_epc)
312 {
313 m_epcHelper = CreateObject<PointToPointEpcHelper>();
315 }
316
317 // Install Mobility Model in eNBs
318 // eNBs are located along a line in the X axis
319 Ptr<ListPositionAllocator> enbPositionAlloc = CreateObject<ListPositionAllocator>();
320 for (uint32_t i = 0; i < m_nEnbs; i++)
321 {
322 Vector enbPosition(distance * (i + 1), 0, 0);
323 enbPositionAlloc->Add(enbPosition);
324 }
325 MobilityHelper enbMobility;
326 enbMobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
327 enbMobility.SetPositionAllocator(enbPositionAlloc);
328 enbMobility.Install(enbNodes);
329
330 // Install Mobility Model in UE
331 // UE moves with a constant speed along the X axis
332 MobilityHelper ueMobility;
333 ueMobility.SetMobilityModel("ns3::ConstantVelocityMobilityModel");
334 ueMobility.Install(ueNodes);
335 for (uint32_t i = 0; i < m_nUes; i++)
336 {
337 ueNodes.Get(i)->GetObject<MobilityModel>()->SetPosition(Vector(0, 0, 0));
338 ueNodes.Get(i)->GetObject<ConstantVelocityMobilityModel>()->SetVelocity(
339 Vector(speed, 0, 0));
340 }
341
342 NetDeviceContainer enbDevices;
343 enbDevices = m_lteHelper->InstallEnbDevice(enbNodes);
344 stream += m_lteHelper->AssignStreams(enbDevices, stream);
345 for (NetDeviceContainer::Iterator it = enbDevices.Begin(); it != enbDevices.End(); ++it)
346 {
347 Ptr<LteEnbRrc> enbRrc = (*it)->GetObject<LteEnbNetDevice>()->GetRrc();
348 enbRrc->SetAttribute("AdmitHandoverRequest", BooleanValue(m_admitHo));
349 }
350
351 NetDeviceContainer ueDevices;
352 ueDevices = m_lteHelper->InstallUeDevice(ueNodes);
353 stream += m_lteHelper->AssignStreams(ueDevices, stream);
354
355 Ipv4Address remoteHostAddr;
356 Ipv4StaticRoutingHelper ipv4RoutingHelper;
357 Ipv4InterfaceContainer ueIpIfaces;
358 Ptr<Node> remoteHost;
359 if (m_epc)
360 {
361 // Create a single RemoteHost
362 NodeContainer remoteHostContainer;
363 remoteHostContainer.Create(1);
364 remoteHost = remoteHostContainer.Get(0);
365 InternetStackHelper internet;
366 internet.Install(remoteHostContainer);
367
368 // Create the Internet
370 p2ph.SetDeviceAttribute("DataRate", DataRateValue(DataRate("100Gb/s")));
371 p2ph.SetDeviceAttribute("Mtu", UintegerValue(1500));
372 p2ph.SetChannelAttribute("Delay", TimeValue(Seconds(0.010)));
374 NetDeviceContainer internetDevices = p2ph.Install(pgw, remoteHost);
375 Ipv4AddressHelper ipv4h;
376 ipv4h.SetBase("1.0.0.0", "255.0.0.0");
377 Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign(internetDevices);
378 // in this container, interface 0 is the pgw, 1 is the remoteHost
379 remoteHostAddr = internetIpIfaces.GetAddress(1);
380
381 Ipv4StaticRoutingHelper ipv4RoutingHelper;
382 Ptr<Ipv4StaticRouting> remoteHostStaticRouting =
383 ipv4RoutingHelper.GetStaticRouting(remoteHost->GetObject<Ipv4>());
384 remoteHostStaticRouting->AddNetworkRouteTo(Ipv4Address("7.0.0.0"),
385 Ipv4Mask("255.0.0.0"),
386 1);
387
388 // Install the IP stack on the UEs
389 internet.Install(ueNodes);
390 ueIpIfaces = m_epcHelper->AssignUeIpv4Address(NetDeviceContainer(ueDevices));
391 }
392
393 // attachment (needs to be done after IP stack configuration)
394 // all UEs attached to eNB 0 at the beginning
395 m_lteHelper->Attach(ueDevices, enbDevices.Get(0));
396
397 if (m_epc)
398 {
399 bool epcDl = true;
400 bool epcUl = false;
401 // the rest of this block is copied from lena-dual-stripe
402
403 // Install and start applications on UEs and remote host
404 uint16_t dlPort = 10000;
405 uint16_t ulPort = 20000;
406
407 // randomize a bit start times to avoid simulation artifacts
408 // (e.g., buffer overflows due to packet transmissions happening
409 // exactly at the same time)
410 Ptr<UniformRandomVariable> startTimeSeconds = CreateObject<UniformRandomVariable>();
411 startTimeSeconds->SetAttribute("Min", DoubleValue(0));
412 startTimeSeconds->SetAttribute("Max", DoubleValue(0.010));
413 startTimeSeconds->SetStream(stream++);
414
415 for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
416 {
417 Ptr<Node> ue = ueNodes.Get(u);
418 // Set the default gateway for the UE
419 Ptr<Ipv4StaticRouting> ueStaticRouting =
420 ipv4RoutingHelper.GetStaticRouting(ue->GetObject<Ipv4>());
421 ueStaticRouting->SetDefaultRoute(m_epcHelper->GetUeDefaultGatewayAddress(), 1);
422
423 UeData ueData;
424
425 for (uint32_t b = 0; b < m_nDedicatedBearers; ++b)
426 {
427 ++dlPort;
428 ++ulPort;
429
430 ApplicationContainer clientApps;
431 ApplicationContainer serverApps;
432 BearerData bearerData = BearerData();
433
434 if (m_useUdp)
435 {
436 if (epcDl)
437 {
438 UdpClientHelper dlClientHelper(ueIpIfaces.GetAddress(u), dlPort);
439 clientApps.Add(dlClientHelper.Install(remoteHost));
440 PacketSinkHelper dlPacketSinkHelper(
441 "ns3::UdpSocketFactory",
443 ApplicationContainer sinkContainer = dlPacketSinkHelper.Install(ue);
444 bearerData.dlSink = sinkContainer.Get(0)->GetObject<PacketSink>();
445 serverApps.Add(sinkContainer);
446 }
447 if (epcUl)
448 {
449 UdpClientHelper ulClientHelper(remoteHostAddr, ulPort);
450 clientApps.Add(ulClientHelper.Install(ue));
451 PacketSinkHelper ulPacketSinkHelper(
452 "ns3::UdpSocketFactory",
454 ApplicationContainer sinkContainer = ulPacketSinkHelper.Install(remoteHost);
455 bearerData.ulSink = sinkContainer.Get(0)->GetObject<PacketSink>();
456 serverApps.Add(sinkContainer);
457 }
458 }
459 else // use TCP
460 {
461 if (epcDl)
462 {
463 BulkSendHelper dlClientHelper(
464 "ns3::TcpSocketFactory",
465 InetSocketAddress(ueIpIfaces.GetAddress(u), dlPort));
466 dlClientHelper.SetAttribute("MaxBytes", UintegerValue(0));
467 clientApps.Add(dlClientHelper.Install(remoteHost));
468 PacketSinkHelper dlPacketSinkHelper(
469 "ns3::TcpSocketFactory",
471 ApplicationContainer sinkContainer = dlPacketSinkHelper.Install(ue);
472 bearerData.dlSink = sinkContainer.Get(0)->GetObject<PacketSink>();
473 serverApps.Add(sinkContainer);
474 }
475 if (epcUl)
476 {
477 BulkSendHelper ulClientHelper("ns3::TcpSocketFactory",
478 InetSocketAddress(remoteHostAddr, ulPort));
479 ulClientHelper.SetAttribute("MaxBytes", UintegerValue(0));
480 clientApps.Add(ulClientHelper.Install(ue));
481 PacketSinkHelper ulPacketSinkHelper(
482 "ns3::TcpSocketFactory",
484 ApplicationContainer sinkContainer = ulPacketSinkHelper.Install(remoteHost);
485 bearerData.ulSink = sinkContainer.Get(0)->GetObject<PacketSink>();
486 serverApps.Add(sinkContainer);
487 }
488 } // end if (useUdp)
489
490 Ptr<EpcTft> tft = Create<EpcTft>();
491 if (epcDl)
492 {
494 dlpf.localPortStart = dlPort;
495 dlpf.localPortEnd = dlPort;
496 tft->Add(dlpf);
497 }
498 if (epcUl)
499 {
501 ulpf.remotePortStart = ulPort;
502 ulpf.remotePortEnd = ulPort;
503 tft->Add(ulpf);
504 }
505
506 if (epcDl || epcUl)
507 {
509 m_lteHelper->ActivateDedicatedEpsBearer(ueDevices.Get(u), bearer, tft);
510 }
511 Time startTime = Seconds(startTimeSeconds->GetValue());
512 serverApps.Start(startTime);
513 clientApps.Start(startTime);
514
515 ueData.bearerDataList.push_back(bearerData);
516
517 } // end for b
518
519 m_ueDataVector.push_back(ueData);
520 }
521 }
522 else // (epc == false)
523 {
524 // for radio bearer activation purposes, consider together home UEs and macro UEs
525 for (uint32_t u = 0; u < ueDevices.GetN(); ++u)
526 {
527 Ptr<NetDevice> ueDev = ueDevices.Get(u);
528 for (uint32_t b = 0; b < m_nDedicatedBearers; ++b)
529 {
531 EpsBearer bearer(q);
532 m_lteHelper->ActivateDataRadioBearer(ueDev, bearer);
533 }
534 }
535 }
536
537 m_lteHelper->AddX2Interface(enbNodes);
538
539 // check initial RRC connection
540 const Time maxRrcConnectionEstablishmentDuration = Seconds(0.080);
541 for (NetDeviceContainer::Iterator it = ueDevices.Begin(); it != ueDevices.End(); ++it)
542 {
543 NS_LOG_FUNCTION(maxRrcConnectionEstablishmentDuration);
544 Simulator::Schedule(maxRrcConnectionEstablishmentDuration,
546 this,
547 *it,
548 enbDevices.Get(0));
549 }
550
551 // schedule the checkpoint events
552
553 Time stopTime = Seconds(0);
554 for (std::list<CheckPointEvent>::iterator checkPointEventIt = m_checkPointEventList.begin();
555 checkPointEventIt != m_checkPointEventList.end();
556 ++checkPointEventIt)
557 {
558 for (Time checkPointTime = checkPointEventIt->checkStartTime;
559 checkPointTime < checkPointEventIt->checkStopTime;
560 checkPointTime += checkPointEventIt->checkInterval)
561 {
562 Simulator::Schedule(checkPointTime,
564 this,
565 ueDevices.Get(checkPointEventIt->ueDeviceIndex),
566 enbDevices.Get(checkPointEventIt->enbDeviceIndex));
567
568 Simulator::Schedule(checkPointTime,
570 this,
571 checkPointEventIt->ueDeviceIndex);
572
573 Time checkStats = checkPointTime + m_statsDuration;
574 Simulator::Schedule(checkStats,
576 this,
577 checkPointEventIt->ueDeviceIndex);
578
579 if (stopTime <= checkStats)
580 {
581 stopTime = checkStats + Seconds(1);
582 }
583 }
584 }
585
589}
590
591void
593{
594 NS_LOG_FUNCTION(ueDevice << enbDevice);
595
596 Ptr<LteUeNetDevice> ueLteDevice = ueDevice->GetObject<LteUeNetDevice>();
597 Ptr<LteUeRrc> ueRrc = ueLteDevice->GetRrc();
598 NS_TEST_ASSERT_MSG_EQ(ueRrc->GetState(), LteUeRrc::CONNECTED_NORMALLY, "Wrong LteUeRrc state!");
599
600 Ptr<LteEnbNetDevice> enbLteDevice = enbDevice->GetObject<LteEnbNetDevice>();
601 Ptr<LteEnbRrc> enbRrc = enbLteDevice->GetRrc();
602 uint16_t rnti = ueRrc->GetRnti();
603 Ptr<UeManager> ueManager = enbRrc->GetUeManager(rnti);
604 NS_TEST_ASSERT_MSG_NE(ueManager, nullptr, "RNTI " << rnti << " not found in eNB");
605
606 UeManager::State ueManagerState = ueManager->GetState();
607 NS_TEST_ASSERT_MSG_EQ(ueManagerState, UeManager::CONNECTED_NORMALLY, "Wrong UeManager state!");
608 NS_ASSERT_MSG(ueManagerState == UeManager::CONNECTED_NORMALLY, "Wrong UeManager state!");
609
610 uint16_t ueCellId = ueRrc->GetCellId();
611 uint16_t enbCellId = enbLteDevice->GetCellId();
612 uint8_t ueDlBandwidth = ueRrc->GetDlBandwidth();
613 uint8_t enbDlBandwidth = enbLteDevice->GetDlBandwidth();
614 uint8_t ueUlBandwidth = ueRrc->GetUlBandwidth();
615 uint8_t enbUlBandwidth = enbLteDevice->GetUlBandwidth();
616 uint8_t ueDlEarfcn = ueRrc->GetDlEarfcn();
617 uint8_t enbDlEarfcn = enbLteDevice->GetDlEarfcn();
618 uint8_t ueUlEarfcn = ueRrc->GetUlEarfcn();
619 uint8_t enbUlEarfcn = enbLteDevice->GetUlEarfcn();
620 uint64_t ueImsi = ueLteDevice->GetImsi();
621 uint64_t enbImsi = ueManager->GetImsi();
622
623 NS_TEST_ASSERT_MSG_EQ(ueImsi, enbImsi, "inconsistent IMSI");
624 NS_TEST_ASSERT_MSG_EQ(ueCellId, enbCellId, "inconsistent CellId");
625 NS_TEST_ASSERT_MSG_EQ(ueDlBandwidth, enbDlBandwidth, "inconsistent DlBandwidth");
626 NS_TEST_ASSERT_MSG_EQ(ueUlBandwidth, enbUlBandwidth, "inconsistent UlBandwidth");
627 NS_TEST_ASSERT_MSG_EQ(ueDlEarfcn, enbDlEarfcn, "inconsistent DlEarfcn");
628 NS_TEST_ASSERT_MSG_EQ(ueUlEarfcn, enbUlEarfcn, "inconsistent UlEarfcn");
629
630 ObjectMapValue enbDataRadioBearerMapValue;
631 ueManager->GetAttribute("DataRadioBearerMap", enbDataRadioBearerMapValue);
632 NS_TEST_ASSERT_MSG_EQ(enbDataRadioBearerMapValue.GetN(),
634 "wrong num bearers at eNB");
635
636 ObjectMapValue ueDataRadioBearerMapValue;
637 ueRrc->GetAttribute("DataRadioBearerMap", ueDataRadioBearerMapValue);
638 NS_TEST_ASSERT_MSG_EQ(ueDataRadioBearerMapValue.GetN(),
640 "wrong num bearers at UE");
641
642 ObjectMapValue::Iterator enbBearerIt = enbDataRadioBearerMapValue.Begin();
643 ObjectMapValue::Iterator ueBearerIt = ueDataRadioBearerMapValue.Begin();
644 while (enbBearerIt != enbDataRadioBearerMapValue.End() &&
645 ueBearerIt != ueDataRadioBearerMapValue.End())
646 {
647 Ptr<LteDataRadioBearerInfo> enbDrbInfo =
648 enbBearerIt->second->GetObject<LteDataRadioBearerInfo>();
650 ueBearerIt->second->GetObject<LteDataRadioBearerInfo>();
651 // NS_TEST_ASSERT_MSG_EQ (enbDrbInfo->m_epsBearer, ueDrbInfo->m_epsBearer, "epsBearer
652 // differs");
653 NS_TEST_ASSERT_MSG_EQ((uint32_t)enbDrbInfo->m_epsBearerIdentity,
654 (uint32_t)ueDrbInfo->m_epsBearerIdentity,
655 "epsBearerIdentity differs");
656 NS_TEST_ASSERT_MSG_EQ((uint32_t)enbDrbInfo->m_drbIdentity,
657 (uint32_t)ueDrbInfo->m_drbIdentity,
658 "drbIdentity differs");
659 // NS_TEST_ASSERT_MSG_EQ (enbDrbInfo->m_rlcConfig, ueDrbInfo->m_rlcConfig, "rlcConfig
660 // differs");
661 NS_TEST_ASSERT_MSG_EQ((uint32_t)enbDrbInfo->m_logicalChannelIdentity,
662 (uint32_t)ueDrbInfo->m_logicalChannelIdentity,
663 "logicalChannelIdentity differs");
664 // NS_TEST_ASSERT_MSG_EQ (enbDrbInfo->m_logicalChannelConfig,
665 // ueDrbInfo->m_logicalChannelConfig, "logicalChannelConfig differs");
666
667 ++enbBearerIt;
668 ++ueBearerIt;
669 }
670 NS_ASSERT_MSG(enbBearerIt == enbDataRadioBearerMapValue.End(), "too many bearers at eNB");
671 NS_ASSERT_MSG(ueBearerIt == ueDataRadioBearerMapValue.End(), "too many bearers at UE");
672}
673
674void
676{
677 NS_LOG_FUNCTION(ueIndex);
678 for (std::list<BearerData>::iterator it = m_ueDataVector.at(ueIndex).bearerDataList.begin();
679 it != m_ueDataVector.at(ueIndex).bearerDataList.end();
680 ++it)
681 {
682 if (it->dlSink)
683 {
684 it->dlOldTotalRx = it->dlSink->GetTotalRx();
685 }
686 if (it->ulSink)
687 {
688 it->ulOldTotalRx = it->ulSink->GetTotalRx();
689 }
690 }
691}
692
693void
695{
696 NS_LOG_FUNCTION(ueIndex);
697 uint32_t b = 1;
698 for (std::list<BearerData>::iterator it = m_ueDataVector.at(ueIndex).bearerDataList.begin();
699 it != m_ueDataVector.at(ueIndex).bearerDataList.end();
700 ++it)
701 {
702 uint32_t dlRx = 0;
703 uint32_t ulRx = 0;
704
705 if (it->dlSink)
706 {
707 dlRx = it->dlSink->GetTotalRx() - it->dlOldTotalRx;
708 }
709
710 if (it->ulSink)
711 {
712 ulRx = it->ulSink->GetTotalRx() - it->ulOldTotalRx;
713 }
714 double expectedBytes =
716
717 NS_LOG_LOGIC("expBytes " << expectedBytes << " dlRx " << dlRx << " ulRx " << ulRx);
718
719 // tolerance
720 if (it->dlSink)
721 {
723 0.500 * expectedBytes,
724 "too few RX bytes in DL, ue=" << ueIndex << ", b=" << b);
725 }
726 if (it->ulSink)
727 {
729 0.500 * expectedBytes,
730 "too few RX bytes in UL, ue=" << ueIndex << ", b=" << b);
731 }
732 ++b;
733 }
734}
735
742{
743 public:
745};
746
748 : TestSuite("lte-x2-handover-measures", SYSTEM)
749{
750 Time checkInterval = Seconds(1);
751
752 std::string cel1name("ho: 0 -> 1");
753 const std::list<CheckPointEvent> cel1{
754 CheckPointEvent(Seconds(1), Seconds(10.1), checkInterval, 0, 0),
755 CheckPointEvent(Seconds(11), Seconds(17), checkInterval, 0, 1),
756 };
757
758 std::string cel2name("ho: 0 -> 1 -> 2");
759 const std::list<CheckPointEvent> cel2{
760 CheckPointEvent(Seconds(1), Seconds(10.1), checkInterval, 0, 0),
761 CheckPointEvent(Seconds(11), Seconds(17.1), checkInterval, 0, 1),
762 CheckPointEvent(Seconds(18), Seconds(24), checkInterval, 0, 2),
763 };
764
765 std::string cel3name("ho: 0 -> 1 -> 2 -> 3");
766 const std::list<CheckPointEvent> cel3{
767 CheckPointEvent(Seconds(1), Seconds(10.1), checkInterval, 0, 0),
768 CheckPointEvent(Seconds(11), Seconds(17.1), checkInterval, 0, 1),
769 CheckPointEvent(Seconds(18), Seconds(24.1), checkInterval, 0, 2),
770 CheckPointEvent(Seconds(25), Seconds(37), checkInterval, 0, 3),
771 };
772
773 int32_t useIdealRrc;
774 std::string sched = "ns3::PfFfMacScheduler";
775 std::string ho = "ns3::A2A4RsrqHandoverAlgorithm";
776 for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
777 {
778 // nEnbs, nUes, nDBearers, celist, name, useUdp, sched, ho, admitHo, idealRrc
780 1,
781 0,
782 cel1,
783 cel1name,
784 true,
785 sched,
786 ho,
787 true,
788 useIdealRrc),
791 1,
792 1,
793 cel1,
794 cel1name,
795 true,
796 sched,
797 ho,
798 true,
799 useIdealRrc),
802 1,
803 2,
804 cel1,
805 cel1name,
806 true,
807 sched,
808 ho,
809 true,
810 useIdealRrc),
813 1,
814 0,
815 cel2,
816 cel2name,
817 true,
818 sched,
819 ho,
820 true,
821 useIdealRrc),
824 1,
825 1,
826 cel2,
827 cel2name,
828 true,
829 sched,
830 ho,
831 true,
832 useIdealRrc),
835 1,
836 2,
837 cel2,
838 cel2name,
839 true,
840 sched,
841 ho,
842 true,
843 useIdealRrc),
846 1,
847 0,
848 cel3,
849 cel3name,
850 true,
851 sched,
852 ho,
853 true,
854 useIdealRrc),
857 1,
858 1,
859 cel3,
860 cel3name,
861 true,
862 sched,
863 ho,
864 true,
865 useIdealRrc),
868 1,
869 2,
870 cel3,
871 cel3name,
872 true,
873 sched,
874 ho,
875 true,
876 useIdealRrc),
878 }
879
880 sched = "ns3::RrFfMacScheduler";
881 for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
882 {
883 // nEnbs, nUes, nDBearers, celist, name, useUdp, sched, admitHo, idealRrc
885 1,
886 0,
887 cel1,
888 cel1name,
889 true,
890 sched,
891 ho,
892 true,
893 useIdealRrc),
896 1,
897 0,
898 cel2,
899 cel2name,
900 true,
901 sched,
902 ho,
903 true,
904 useIdealRrc),
907 1,
908 0,
909 cel3,
910 cel3name,
911 true,
912 sched,
913 ho,
914 true,
915 useIdealRrc),
917 }
918
919 ho = "ns3::A3RsrpHandoverAlgorithm";
920 sched = "ns3::PfFfMacScheduler";
921 for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
922 {
923 // nEnbs, nUes, nDBearers, celist, name, useUdp, sched, admitHo, idealRrc
925 1,
926 0,
927 cel1,
928 cel1name,
929 true,
930 sched,
931 ho,
932 true,
933 useIdealRrc),
936 1,
937 0,
938 cel2,
939 cel2name,
940 true,
941 sched,
942 ho,
943 true,
944 useIdealRrc),
947 1,
948 0,
949 cel3,
950 cel3name,
951 true,
952 sched,
953 ho,
954 true,
955 useIdealRrc),
957 }
958
959 sched = "ns3::RrFfMacScheduler";
960 for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
961 {
962 // nEnbs, nUes, nDBearers, celist, name, useUdp, sched, admitHo, idealRrc
964 1,
965 0,
966 cel1,
967 cel1name,
968 true,
969 sched,
970 ho,
971 true,
972 useIdealRrc),
975 1,
976 0,
977 cel2,
978 cel2name,
979 true,
980 sched,
981 ho,
982 true,
983 useIdealRrc),
986 1,
987 0,
988 cel3,
989 cel3name,
990 true,
991 sched,
992 ho,
993 true,
994 useIdealRrc),
996 }
997
998} // end of LteX2HandoverMeasuresTestSuite ()
999
Test different X2 handover measures and algorithms, e.g.
Ptr< PointToPointEpcHelper > m_epcHelper
EPC helper.
std::list< CheckPointEvent > m_checkPointEventList
check point event list
std::string m_handoverAlgorithmType
handover algorithm type
bool m_admitHo
whether to configure to admit handover
bool m_useUdp
whether to use UDP traffic
const Time m_udpClientInterval
UDP client interval.
void CheckStats(uint32_t ueIndex)
Check stats function.
LteX2HandoverMeasuresTestCase(uint32_t nEnbs, uint32_t nUes, uint32_t nDedicatedBearers, std::list< CheckPointEvent > checkPointEventList, std::string checkPointEventListName, bool useUdp, std::string schedulerType, std::string handoverAlgorithmType, bool admitHo, bool useIdealRrc)
Constructor.
bool m_useIdealRrc
whether to use ideal RRC
uint32_t m_nEnbs
number of eNBs in the test
static std::string BuildNameString(uint32_t nEnbs, uint32_t nUes, uint32_t nDedicatedBearers, std::string checkPointEventListName, bool useUdp, std::string schedulerType, std::string handoverAlgorithmType, bool admitHo, bool useIdealRrc)
Build name string.
std::string m_checkPointEventListName
check point event list name
void DoRun() override
Implementation to actually run this TestCase.
void SaveStats(uint32_t ueIndex)
Save stats function.
uint32_t m_nDedicatedBearers
number of UEs in the test
uint32_t m_nUes
number of UEs in the test
std::vector< UeData > m_ueDataVector
UE data vector.
const uint32_t m_udpClientPktSize
UDP client packet size.
const Time m_maxHoDuration
maximum HO duration
void CheckConnected(Ptr< NetDevice > ueDevice, Ptr< NetDevice > enbDevice)
Check connected function.
Lte X2 Handover Measures Test Suite.
holds a vector of ns3::Application pointers.
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
A helper to make it easier to instantiate an ns3::BulkSendApplication on a set of nodes.
void SetAttribute(std::string name, const AttributeValue &value)
Helper function used to set the underlying application attributes, not the socket attributes.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::BulkSendApplication on each node of the input container configured with all the attri...
Mobility model for which the current speed does not change once it has been set and until it is set a...
Class for representing data rates.
Definition: data-rate.h:89
AttributeValue implementation for DataRate.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:42
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:91
Qci
QoS Class Indicator.
Definition: eps-bearer.h:106
@ NGBR_VIDEO_TCP_DEFAULT
Non-GBR TCP-based Video (Buffered Streaming, e.g., www, e-mail...)
Definition: eps-bearer.h:126
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:42
static Ipv4Address GetAny()
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:79
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:257
Helper class that adds ns3::Ipv4StaticRouting objects.
Ptr< Ipv4StaticRouting > GetStaticRouting(Ptr< Ipv4 > ipv4) const
Try and find the static routing protocol as either the main routing protocol or in the list of routin...
store information on active data radio bearer instance
The eNodeB device implementation.
void SetEpcHelper(Ptr< EpcHelper > h)
Set the EpcHelper to be used to setup the EPC network in conjunction with the setup of the LTE radio ...
Definition: lte-helper.cc:285
void SetHandoverAlgorithmAttribute(std::string n, const AttributeValue &v)
Set an attribute for the handover algorithm to be created.
Definition: lte-helper.cc:348
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:485
void SetHandoverAlgorithmType(std::string type)
Set the type of handover algorithm to be used by eNodeB devices.
Definition: lte-helper.cc:340
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:292
void Attach(NetDeviceContainer ueDevices)
Enables automatic attachment of a set of UE devices to a suitable cell using Idle mode initial cell s...
Definition: lte-helper.cc:1047
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1444
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:500
void AddX2Interface(NodeContainer enbNodes)
Create an X2 interface between all the eNBs in a given set.
Definition: lte-helper.cc:1321
int64_t AssignStreams(NetDeviceContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used.
Definition: lte-helper.cc:1575
uint8_t ActivateDedicatedEpsBearer(NetDeviceContainer ueDevices, EpsBearer bearer, Ptr< EpcTft > tft)
Activate a dedicated EPS bearer on a given set of UE devices.
Definition: lte-helper.cc:1162
The LteUeNetDevice class implements the UE net device.
Helper class used to assign positions and mobility models to nodes.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
void SetMobilityModel(std::string type, Ts &&... args)
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
Keep track of the current position and velocity of an object.
holds a vector of ns3::NetDevice pointers
uint32_t GetN() const
Get the number of Ptr<NetDevice> stored in this container.
std::vector< Ptr< NetDevice > >::const_iterator Iterator
NetDevice container iterator.
Iterator Begin() const
Get an iterator which refers to the first NetDevice in the container.
Iterator End() const
Get an iterator which indicates past-the-last NetDevice in the container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
Ptr< Node > GetPgwNode() const override
Get the PGW node.
Ipv4Address GetUeDefaultGatewayAddress() override
Ipv4InterfaceContainer AssignUeIpv4Address(NetDeviceContainer ueDevices) override
Assign IPv4 addresses to UE devices.
keep track of a set of node pointers.
uint32_t GetN() const
Get the number of Ptr<Node> stored in this container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:200
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
Container for a set of ns3::Object pointers.
std::size_t GetN() const
Get the number of Objects.
Iterator End() const
Get an iterator to the past-the-end Object.
Iterator Begin() const
Get an iterator to the first Object.
std::map< std::size_t, Ptr< Object > >::const_iterator Iterator
Iterator type for traversing this container.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::PacketSinkApplication on each node of the input container configured with all the att...
Receive and consume traffic generated to an IP address and port.
Definition: packet-sink.h:74
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
NetDeviceContainer Install(NodeContainer c)
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:568
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:140
static void Run()
Run the simulation.
Definition: simulator.cc:176
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:184
Hold variables of type string.
Definition: string.h:56
encapsulates test code
Definition: test.h:1060
@ EXTENSIVE
Medium length test.
Definition: test.h:1066
@ TAKES_FOREVER
Very long running test.
Definition: test.h:1067
@ QUICK
Fast test.
Definition: test.h:1065
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
A suite of tests to run.
Definition: test.h:1256
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
AttributeValue implementation for Time.
Definition: nstime.h:1423
Create a client application which sends UDP packets carrying a 32bit sequence number and a 64 bit tim...
ApplicationContainer Install(NodeContainer c)
State
The state of the UeManager at the eNB RRC.
Definition: lte-enb-rrc.h:77
Hold an unsigned integer type.
Definition: uinteger.h:45
Time stopTime
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:86
void Reset()
Reset the initial value of every attribute as well as the value of every global to what they were bef...
Definition: config.cc:856
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:891
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:179
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:282
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
static LteX2HandoverMeasuresTestSuite g_lteX2HandoverMeasuresTestSuiteInstance
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.
Definition: test.h:144
#define NS_TEST_ASSERT_MSG_NE(actual, limit, msg)
Test that an actual and expected (limit) value are not equal and report and abort if not.
Definition: test.h:564
#define NS_TEST_ASSERT_MSG_GT(actual, limit, msg)
Test that an actual value is greater than a limit and report and abort if not.
Definition: test.h:874
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1336
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1348
Every class exported by the ns3 library is enclosed in the ns3 namespace.
CheckPointEvent structure.
CheckPointEvent(Time start, Time stop, Time interval, uint32_t ueIndex, uint32_t enbIndex)
Constructor.
Time checkStopTime
check stop time
uint32_t enbDeviceIndex
ENB device index.
Time checkStartTime
check start time
Time checkInterval
check interval
uint32_t ueDeviceIndex
UE device index.
std::list< BearerData > bearerDataList
bearer ID list
Implement the data structure representing a TrafficFlowTemplate Packet Filter.
Definition: epc-tft.h:71
uint16_t localPortEnd
end of the port number range of the UE
Definition: epc-tft.h:132
uint16_t remotePortEnd
end of the port number range of the remote host
Definition: epc-tft.h:130
uint16_t remotePortStart
start of the port number range of the remote host
Definition: epc-tft.h:129
uint16_t localPortStart
start of the port number range of the UE
Definition: epc-tft.h:131