diff --git a/src/lte/model/lte-enb-rrc.cc b/src/lte/model/lte-enb-rrc.cc index caa0931f9..bc7913208 100644 --- a/src/lte/model/lte-enb-rrc.cc +++ b/src/lte/model/lte-enb-rrc.cc @@ -102,6 +102,7 @@ const char* g_ueManagerStateName[UeManager::NUM_STATES] = "CONNECTED_NORMALLY", "CONNECTION_RECONFIGURATION", "CONNECTION_REESTABLISHMENT", + "HANDOVER_PREPARATION", "HANDOVER_JOINING", "HANDOVER_PATH_SWITCH", "HANDOVER_LEAVING", @@ -381,6 +382,7 @@ UeManager::ScheduleRrcConnectionReconfiguration () case CONNECTION_SETUP: case CONNECTION_RECONFIGURATION: case CONNECTION_REESTABLISHMENT: + case HANDOVER_PREPARATION: case HANDOVER_JOINING: case HANDOVER_LEAVING: // a previous reconfiguration still ongoing, we need to wait for it to be finished @@ -402,6 +404,50 @@ UeManager::ScheduleRrcConnectionReconfiguration () } } +void +UeManager::PrepareHandover (uint16_t cellId) +{ + NS_LOG_FUNCTION (this << cellId); + switch (m_state) + { + case CONNECTED_NORMALLY: + { + m_targetCellId = cellId; + EpcX2SapProvider::HandoverRequestParams params; + params.oldEnbUeX2apId = m_rnti; + params.cause = EpcX2SapProvider::HandoverDesirableForRadioReason; + params.sourceCellId = m_rrc->m_cellId; + params.targetCellId = cellId; + params.mmeUeS1apId = m_imsi; + params.ueAggregateMaxBitRateDownlink = 200 * 1000; + params.ueAggregateMaxBitRateUplink = 100 * 1000; + params.bearers = GetErabList (); + + LteRrcSap::HandoverPreparationInfo hpi; + hpi.asConfig.sourceUeIdentity = m_rnti; + hpi.asConfig.sourceDlCarrierFreq = m_rrc->m_dlEarfcn; + hpi.asConfig.sourceRadioResourceConfig = GetRadioResourceConfigForHandoverPreparationInfo (); + params.rrcContext = m_rrc->m_rrcSapUser->EncodeHandoverPreparationInformation (hpi); + + NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); + NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId); + NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); + NS_LOG_LOGIC ("mmmUeS1apId = " << params.oldEnbUeX2apId); + NS_LOG_LOGIC ("rrcContext = " << params.rrcContext); + + m_rrc->m_x2SapProvider->SendHandoverRequest (params); + SwitchToState (HANDOVER_PREPARATION); + } + break; + + default: + NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); + break; + } + +} + + void UeManager::SendHandoverCommand (LteRrcSap::RrcConnectionReconfiguration rcr) { @@ -482,6 +528,23 @@ UeManager::SendUeContextRelease () } } +void +UeManager::RecvHandoverPreparationFailure (uint16_t cellId) +{ + NS_LOG_FUNCTION (this << cellId); + switch (m_state) + { + case HANDOVER_PREPARATION: + NS_ASSERT (cellId == m_targetCellId); + NS_LOG_INFO ("target eNB sent HO preparation failure, aborting HO"); + SwitchToState (CONNECTED_NORMALLY); + break; + + default: + NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); + break; + } +} // methods forwarded from RRC SAP @@ -935,6 +998,11 @@ LteEnbRrc::GetTypeId (void) TimeValue (MilliSeconds (80)), MakeTimeAccessor (&LteEnbRrc::m_systemInformationPeriodicity), MakeTimeChecker ()) + .AddAttribute ("AdmitHandoverRequest", + "Whether to admit an X2 handover request from another eNB", + BooleanValue (true), + MakeBooleanAccessor (&LteEnbRrc::m_admitHandoverRequest), + MakeBooleanChecker ()) .AddTraceSource ("ConnectionEstablished", "trace fired upon successful RRC connection establishment", MakeTraceSourceAccessor (&LteEnbRrc::m_connectionEstablishedTrace)) @@ -1096,30 +1164,8 @@ LteEnbRrc::SendHandoverRequest (uint16_t rnti, uint16_t cellId) NS_ASSERT (m_configured); Ptr ueManager = GetUeManager (rnti); - - EpcX2SapProvider::HandoverRequestParams params; - params.oldEnbUeX2apId = rnti; - params.cause = EpcX2SapProvider::HandoverDesirableForRadioReason; - params.sourceCellId = m_cellId; - params.targetCellId = cellId; - params.mmeUeS1apId = ueManager->GetImsi (); - params.ueAggregateMaxBitRateDownlink = 200 * 1000; - params.ueAggregateMaxBitRateUplink = 100 * 1000; - params.bearers = ueManager->GetErabList (); - - LteRrcSap::HandoverPreparationInfo hpi; - hpi.asConfig.sourceUeIdentity = rnti; - hpi.asConfig.sourceDlCarrierFreq = m_dlEarfcn; - hpi.asConfig.sourceRadioResourceConfig = ueManager->GetRadioResourceConfigForHandoverPreparationInfo (); - params.rrcContext = m_rrcSapUser->EncodeHandoverPreparationInformation (hpi); - - NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); - NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId); - NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); - NS_LOG_LOGIC ("mmmUeS1apId = " << params.oldEnbUeX2apId); - NS_LOG_LOGIC ("rrcContext = " << params.rrcContext); - - m_x2SapProvider->SendHandoverRequest (params); + ueManager->PrepareHandover (cellId); + } void @@ -1183,18 +1229,31 @@ LteEnbRrc::DoPathSwitchRequestAcknowledge (EpcEnbS1SapUser::PathSwitchRequestAck } void -LteEnbRrc::DoRecvHandoverRequest (EpcX2SapUser::HandoverRequestParams params) +LteEnbRrc::DoRecvHandoverRequest (EpcX2SapUser::HandoverRequestParams req) { NS_LOG_FUNCTION (this); NS_LOG_LOGIC ("Recv X2 message: HANDOVER REQUEST"); - NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); - NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId); - NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); - NS_LOG_LOGIC ("mmeUeS1apId = " << params.mmeUeS1apId); + NS_LOG_LOGIC ("oldEnbUeX2apId = " << req.oldEnbUeX2apId); + NS_LOG_LOGIC ("sourceCellId = " << req.sourceCellId); + NS_LOG_LOGIC ("targetCellId = " << req.targetCellId); + NS_LOG_LOGIC ("mmeUeS1apId = " << req.mmeUeS1apId); - NS_ASSERT (params.targetCellId == m_cellId); + NS_ASSERT (req.targetCellId == m_cellId); + + if (m_admitHandoverRequest == false) + { + NS_LOG_INFO ("rejecting handover request from cellId " << req.sourceCellId); + EpcX2Sap::HandoverPreparationFailureParams res; + res.oldEnbUeX2apId = req.oldEnbUeX2apId; + res.sourceCellId = req.sourceCellId ; + res.targetCellId = req.targetCellId ; + res.cause = 0; + res.criticalityDiagnostics = 0; + m_x2SapProvider->SendHandoverPreparationFailure (res); + return; + } uint16_t rnti = AddUe (UeManager::HANDOVER_JOINING); LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue anrcrv = m_cmacSapProvider->AllocateNcRaPreamble (rnti); @@ -1207,11 +1266,11 @@ LteEnbRrc::DoRecvHandoverRequest (EpcX2SapUser::HandoverRequestParams params) } Ptr ueManager = GetUeManager (rnti); - ueManager->SetSource (params.sourceCellId, params.oldEnbUeX2apId); - ueManager->SetImsi (params.mmeUeS1apId); + ueManager->SetSource (req.sourceCellId, req.oldEnbUeX2apId); + ueManager->SetImsi (req.mmeUeS1apId); - for (std::vector ::iterator it = params.bearers.begin (); - it != params.bearers.end (); + for (std::vector ::iterator it = req.bearers.begin (); + it != req.bearers.end (); ++it) { ueManager->SetupDataRadioBearer (it->erabLevelQosParameters, it->gtpTeid, it->transportLayerAddress); @@ -1235,10 +1294,10 @@ LteEnbRrc::DoRecvHandoverRequest (EpcX2SapUser::HandoverRequestParams params) NS_LOG_LOGIC ("Send X2 message: HANDOVER REQUEST ACK"); EpcX2SapProvider::HandoverRequestAckParams ackParams; - ackParams.oldEnbUeX2apId = params.oldEnbUeX2apId; + ackParams.oldEnbUeX2apId = req.oldEnbUeX2apId; ackParams.newEnbUeX2apId = rnti; - ackParams.sourceCellId = params.sourceCellId; - ackParams.targetCellId = params.targetCellId; + ackParams.sourceCellId = req.sourceCellId; + ackParams.targetCellId = req.targetCellId; ackParams.rrcContext = encodedHandoverCommand; NS_LOG_LOGIC ("oldEnbUeX2apId = " << ackParams.oldEnbUeX2apId); @@ -1289,7 +1348,9 @@ LteEnbRrc::DoRecvHandoverPreparationFailure (EpcX2SapUser::HandoverPreparationFa NS_LOG_LOGIC ("cause = " << params.cause); NS_LOG_LOGIC ("criticalityDiagnostics = " << params.criticalityDiagnostics); - NS_ASSERT ("Processing of HANDOVER PREPARATION FAILURE X2 message IS NOT IMPLEMENTED"); + uint16_t rnti = params.oldEnbUeX2apId; + Ptr ueManager = GetUeManager (rnti); + ueManager->RecvHandoverPreparationFailure (params.targetCellId); } void diff --git a/src/lte/model/lte-enb-rrc.h b/src/lte/model/lte-enb-rrc.h index 28e2ebbc5..049c324de 100644 --- a/src/lte/model/lte-enb-rrc.h +++ b/src/lte/model/lte-enb-rrc.h @@ -71,6 +71,7 @@ public: CONNECTED_NORMALLY, CONNECTION_RECONFIGURATION, CONNECTION_REESTABLISHMENT, + HANDOVER_PREPARATION, HANDOVER_JOINING, HANDOVER_PATH_SWITCH, HANDOVER_LEAVING, @@ -140,6 +141,13 @@ public: */ void ScheduleRrcConnectionReconfiguration (); + /** + * Start the handover preparation and send the handover request + * + * \param cellId id of the target cell + */ + void PrepareHandover (uint16_t cellId); + /** * In the X2-based handover procedure, at the source eNB, trigger * handover by sending to the UE a RRC Connection @@ -183,12 +191,20 @@ public: */ std::vector GetErabList (); + /** * send the UE CONTEXT RELEASE X2 message to the source eNB, thus * successfully terminating an X2 handover procedure * */ void SendUeContextRelease (); + + /** + * Take the necessary actions in response to the reception of an X2 HO preparation failure message + * + * \param cellId id of the target cell + */ + void RecvHandoverPreparationFailure (uint16_t cellId); // methods forwarded from RRC SAP @@ -352,6 +368,7 @@ private: TracedCallback m_stateTransitionTrace; uint16_t m_sourceX2apId; uint16_t m_sourceCellId; + uint16_t m_targetCellId; }; @@ -687,6 +704,8 @@ private: uint16_t m_lastAllocatedConfigurationIndex; bool m_reconfigureUes; + bool m_admitHandoverRequest; + // imsi cellid rnti TracedCallback m_connectionEstablishedTrace; // imsi cellid rnti diff --git a/src/lte/test/test-lte-x2-handover.cc b/src/lte/test/test-lte-x2-handover.cc index 3b8c10f13..c62f610b0 100644 --- a/src/lte/test/test-lte-x2-handover.cc +++ b/src/lte/test/test-lte-x2-handover.cc @@ -55,10 +55,10 @@ public: * * \return */ - LteX2HandoverTestCase (uint32_t nUes, uint32_t nDedicatedBearers, std::list handoverEventList, std::string handoverEventListName, bool useUdp, std::string schedulerType); + LteX2HandoverTestCase (uint32_t nUes, uint32_t nDedicatedBearers, std::list handoverEventList, std::string handoverEventListName, bool useUdp, std::string schedulerType, bool admitHo); private: - static std::string BuildNameString (uint32_t nUes, uint32_t nDedicatedBearers, std::string handoverEventListName, bool useUdp, std::string schedulerType); + static std::string BuildNameString (uint32_t nUes, uint32_t nDedicatedBearers, std::string handoverEventListName, bool useUdp, std::string schedulerType, bool admitHo); virtual void DoRun (void); void CheckConnected (Ptr ueDevice, Ptr enbDevice); @@ -69,6 +69,7 @@ private: bool m_epc; bool m_useUdp; std::string m_schedulerType; + bool m_admitHo; Ptr m_lteHelper; Ptr m_epcHelper; @@ -97,19 +98,20 @@ private: }; -std::string LteX2HandoverTestCase::BuildNameString (uint32_t nUes, uint32_t nDedicatedBearers, std::string handoverEventListName, bool useUdp, std::string schedulerType) +std::string LteX2HandoverTestCase::BuildNameString (uint32_t nUes, uint32_t nDedicatedBearers, std::string handoverEventListName, bool useUdp, std::string schedulerType, bool admitHo) { std::ostringstream oss; oss << " nUes=" << nUes << " nDedicatedBearers=" << nDedicatedBearers << " udp=" << useUdp << " " << schedulerType + << " admitHo=" << admitHo << " hoList: " << handoverEventListName; return oss.str (); } -LteX2HandoverTestCase::LteX2HandoverTestCase (uint32_t nUes, uint32_t nDedicatedBearers, std::list handoverEventList, std::string handoverEventListName, bool useUdp, std::string schedulerType) - : TestCase (BuildNameString (nUes, nDedicatedBearers, handoverEventListName, useUdp, schedulerType)), +LteX2HandoverTestCase::LteX2HandoverTestCase (uint32_t nUes, uint32_t nDedicatedBearers, std::list handoverEventList, std::string handoverEventListName, bool useUdp, std::string schedulerType, bool admitHo) + : TestCase (BuildNameString (nUes, nDedicatedBearers, handoverEventListName, useUdp, schedulerType, admitHo)), m_nUes (nUes), m_nDedicatedBearers (nDedicatedBearers), m_handoverEventList (handoverEventList), @@ -117,6 +119,7 @@ LteX2HandoverTestCase::LteX2HandoverTestCase (uint32_t nUes, uint32_t nDedicated m_epc (true), m_useUdp (useUdp), m_schedulerType (schedulerType), + m_admitHo (admitHo), m_maxHoDuration (Seconds (0.1)), m_statsDuration (Seconds (0.5)) { @@ -125,7 +128,7 @@ LteX2HandoverTestCase::LteX2HandoverTestCase (uint32_t nUes, uint32_t nDedicated void LteX2HandoverTestCase::DoRun () { - NS_LOG_FUNCTION (this << BuildNameString (m_nUes, m_nDedicatedBearers, m_handoverEventListName, m_useUdp, m_schedulerType)); + NS_LOG_FUNCTION (this << BuildNameString (m_nUes, m_nDedicatedBearers, m_handoverEventListName, m_useUdp, m_schedulerType, m_admitHo)); Config::SetDefault ("ns3::UdpClient::Interval", TimeValue (MilliSeconds(100))); Config::SetDefault ("ns3::UdpClient::MaxPackets", UintegerValue(1000000)); @@ -161,6 +164,13 @@ LteX2HandoverTestCase::DoRun () NetDeviceContainer enbDevices; enbDevices = m_lteHelper->InstallEnbDevice (enbNodes); + for (NetDeviceContainer::Iterator it = enbDevices.Begin (); + it != enbDevices.End (); + ++it) + { + Ptr enbRrc = (*it)->GetObject ()->GetRrc (); + enbRrc->SetAttribute ("AdmitHandoverRequest", BooleanValue (m_admitHo)); + } NetDeviceContainer ueDevices; ueDevices = m_lteHelper->InstallUeDevice (ueNodes); @@ -370,7 +380,7 @@ LteX2HandoverTestCase::DoRun () &LteX2HandoverTestCase::CheckConnected, this, ueDevices.Get (hoEventIt->ueDeviceIndex), - enbDevices.Get (hoEventIt->targetEnbDeviceIndex)); + enbDevices.Get (m_admitHo ? hoEventIt->targetEnbDeviceIndex : hoEventIt->sourceEnbDeviceIndex)); Simulator::Schedule (hoEndTime, &LteX2HandoverTestCase::SaveStatsAfterHandover, this, hoEventIt->ueDeviceIndex); Time checkStatsAfterHoTime = hoEndTime + m_statsDuration; @@ -577,75 +587,93 @@ LteX2HandoverTestSuite::LteX2HandoverTestSuite () hel7.push_back (ue2fwd); hel7.push_back (ue2bwd); - AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel1, hel0name, true, "ns3::RrFfMacScheduler")); - return; - // nUes, nDBearers, helist, name, useUdp, scheduler - AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel0, hel0name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel0, hel0name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 5, hel0, hel0name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 5, hel0, hel0name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel1, hel1name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel1, hel1name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel1, hel1name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel2, hel2name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel2, hel2name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel2, hel2name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel3, hel3name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel3, hel3name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel3, hel3name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel3, hel3name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel3, hel3name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel3, hel3name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel4, hel4name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel4, hel4name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel4, hel4name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel5, hel5name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel5, hel5name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel5, hel5name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel3, hel3name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel3, hel3name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel3, hel3name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel4, hel4name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel4, hel4name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel4, hel4name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel5, hel5name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel5, hel5name, true, "ns3::RrFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel5, hel5name, true, "ns3::RrFfMacScheduler")); + // nUes, nDBearers, helist, name, useUdp, scheduler, admitHo + AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel0, hel0name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel0, hel0name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 5, hel0, hel0name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 5, hel0, hel0name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel1, hel1name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel1, hel1name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel1, hel1name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel1, hel1name, true, "ns3::RrFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel1, hel1name, true, "ns3::RrFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel1, hel1name, true, "ns3::RrFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel1, hel1name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel1, hel1name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel1, hel1name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel1, hel1name, true, "ns3::RrFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel1, hel1name, true, "ns3::RrFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel1, hel1name, true, "ns3::RrFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel2, hel2name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel2, hel2name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel2, hel2name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel3, hel3name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel3, hel3name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel3, hel3name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel3, hel3name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel3, hel3name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel3, hel3name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel4, hel4name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel4, hel4name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel4, hel4name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel5, hel5name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel5, hel5name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel5, hel5name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel3, hel3name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel3, hel3name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel3, hel3name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel4, hel4name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel4, hel4name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel4, hel4name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel5, hel5name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel5, hel5name, true, "ns3::RrFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel5, hel5name, true, "ns3::RrFfMacScheduler", true)); - // nUes, nDBearers, helist, name, useUdp, scheduler - AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel0, hel0name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel0, hel0name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 5, hel0, hel0name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 5, hel0, hel0name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel1, hel1name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel1, hel1name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel1, hel1name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel2, hel2name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel2, hel2name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel2, hel2name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel3, hel3name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel3, hel3name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel3, hel3name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel3, hel3name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel3, hel3name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel3, hel3name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel4, hel4name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel4, hel4name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel4, hel4name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel5, hel5name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel5, hel5name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel5, hel5name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel3, hel3name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel3, hel3name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel3, hel3name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel4, hel4name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel4, hel4name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel4, hel4name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel5, hel5name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel5, hel5name, true, "ns3::PfFfMacScheduler")); - AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel5, hel5name, true, "ns3::PfFfMacScheduler")); + + // nUes, nDBearers, helist, name, useUdp, scheduler, admitHo + AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel0, hel0name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel0, hel0name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 5, hel0, hel0name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 5, hel0, hel0name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel1, hel1name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel1, hel1name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel1, hel1name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel1, hel1name, true, "ns3::PfFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel1, hel1name, true, "ns3::PfFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel1, hel1name, true, "ns3::PfFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel1, hel1name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel1, hel1name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel1, hel1name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel1, hel1name, true, "ns3::PfFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel1, hel1name, true, "ns3::PfFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel1, hel1name, true, "ns3::PfFfMacScheduler", false)); + AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel2, hel2name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel2, hel2name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel2, hel2name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 0, hel3, hel3name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 1, hel3, hel3name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 1, 2, hel3, hel3name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel3, hel3name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel3, hel3name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel3, hel3name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel4, hel4name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel4, hel4name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel4, hel4name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 0, hel5, hel5name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 1, hel5, hel5name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 2, 2, hel5, hel5name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel3, hel3name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel3, hel3name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel3, hel3name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel4, hel4name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel4, hel4name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel4, hel4name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 0, hel5, hel5name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 1, hel5, hel5name, true, "ns3::PfFfMacScheduler", true)); + AddTestCase (new LteX2HandoverTestCase ( 3, 2, hel5, hel5name, true, "ns3::PfFfMacScheduler", true)); + } static LteX2HandoverTestSuite g_lteX2HandoverTestSuiteInstance;