merge
authorMarco Miozzo <marco.miozzo@cttc.es>
Tue, 04 Dec 2012 11:20:31 +0100
changeset 9466 19ea1eaed7be
parent 9465 731494b1b3f1 (current diff)
parent 9464 e2e3b9b3585a (diff)
child 9467 c8454e7171dd
merge
src/lte/test/test-lte-rrc.cc
--- a/src/lte/model/lte-enb-rrc.cc	Tue Dec 04 11:19:32 2012 +0100
+++ b/src/lte/model/lte-enb-rrc.cc	Tue Dec 04 11:20:31 2012 +0100
@@ -102,6 +102,7 @@
     "CONNECTED_NORMALLY",
     "CONNECTION_RECONFIGURATION",
     "CONNECTION_REESTABLISHMENT",
+    "HANDOVER_PREPARATION",
     "HANDOVER_JOINING",
     "HANDOVER_PATH_SWITCH",
     "HANDOVER_LEAVING",
@@ -381,6 +382,7 @@
     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
@@ -403,6 +405,50 @@
 }
 
 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)
 {
   NS_LOG_FUNCTION (this);
@@ -482,6 +528,23 @@
     }
 }
 
+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 @@
                    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 @@
   NS_ASSERT (m_configured);
 
   Ptr<UeManager> 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 @@
 }
 
 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 (req.targetCellId == m_cellId);
 
-  NS_ASSERT (params.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 @@
     }    
 
   Ptr<UeManager> 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 <EpcX2Sap::ErabToBeSetupItem>::iterator it = params.bearers.begin ();
-       it != params.bearers.end ();
+  for (std::vector <EpcX2Sap::ErabToBeSetupItem>::iterator it = req.bearers.begin ();
+       it != req.bearers.end ();
        ++it)
     {
       ueManager->SetupDataRadioBearer (it->erabLevelQosParameters, it->gtpTeid, it->transportLayerAddress);
@@ -1235,10 +1294,10 @@
   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 @@
   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> ueManager = GetUeManager (rnti);
+  ueManager->RecvHandoverPreparationFailure (params.targetCellId);
 }
 
 void
--- a/src/lte/model/lte-enb-rrc.h	Tue Dec 04 11:19:32 2012 +0100
+++ b/src/lte/model/lte-enb-rrc.h	Tue Dec 04 11:20:31 2012 +0100
@@ -71,6 +71,7 @@
       CONNECTED_NORMALLY,
       CONNECTION_RECONFIGURATION,
       CONNECTION_REESTABLISHMENT,
+      HANDOVER_PREPARATION,
       HANDOVER_JOINING,
       HANDOVER_PATH_SWITCH,
       HANDOVER_LEAVING,
@@ -141,6 +142,13 @@
   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 
    * Reconfiguration message including Mobility Control Info
@@ -183,12 +191,20 @@
    */
   std::vector<EpcX2Sap::ErabToBeSetupItem> 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 @@
   TracedCallback<uint64_t, uint16_t, uint16_t, State, State> m_stateTransitionTrace;
   uint16_t m_sourceX2apId;
   uint16_t m_sourceCellId;
+  uint16_t m_targetCellId;
 };
 
 
@@ -687,6 +704,8 @@
   uint16_t m_lastAllocatedConfigurationIndex;
   bool m_reconfigureUes;
 
+  bool m_admitHandoverRequest;
+
   //             imsi      cellid    rnti   
   TracedCallback<uint64_t, uint16_t, uint16_t> m_connectionEstablishedTrace;
   //             imsi      cellid    rnti   
--- a/src/lte/test/test-lte-rrc.cc	Tue Dec 04 11:19:32 2012 +0100
+++ b/src/lte/test/test-lte-rrc.cc	Tue Dec 04 11:20:31 2012 +0100
@@ -276,11 +276,13 @@
       AddTestCase (new LteRrcConnectionEstablishmentTestCase (  4,        0,        20,            300,             1, useIdealRrc));
       AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 20,        0,        10,              1,             1, useIdealRrc));
       AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 50,        0,         0,              0,             1, useIdealRrc));
-  // // time consuming tests with a lot of UEs
-  // AddTestCase (new LteRrcConnectionEstablishmentTestCase (100,        0,        10,              0,             1));
-  // AddTestCase (new LteRrcConnectionEstablishmentTestCase (100,        0,        10,              1,             1));
-  // AddTestCase (new LteRrcConnectionEstablishmentTestCase (200,        0,        10,              0,             1));
-  // AddTestCase (new LteRrcConnectionEstablishmentTestCase (200,        0,        10,              1,             1));
+
+      // // time consuming tests with a lot of UEs
+      // AddTestCase (new LteRrcConnectionEstablishmentTestCase (100,        0,        10,              0,             1, useIdealRrc));
+      // AddTestCase (new LteRrcConnectionEstablishmentTestCase (100,        0,        10,              1,             1, useIdealRrc));
+      // AddTestCase (new LteRrcConnectionEstablishmentTestCase (200,        0,        10,              0,             1, useIdealRrc));
+      // AddTestCase (new LteRrcConnectionEstablishmentTestCase (200,        0,        10,              1,             1, useIdealRrc));
+    }
 
     }
 }
--- a/src/lte/test/test-lte-x2-handover.cc	Tue Dec 04 11:19:32 2012 +0100
+++ b/src/lte/test/test-lte-x2-handover.cc	Tue Dec 04 11:20:31 2012 +0100
@@ -55,10 +55,10 @@
    * 
    * \return 
    */
-  LteX2HandoverTestCase (uint32_t nUes, uint32_t nDedicatedBearers, std::list<HandoverEvent> handoverEventList, std::string handoverEventListName, bool useUdp, std::string schedulerType);
+  LteX2HandoverTestCase (uint32_t nUes, uint32_t nDedicatedBearers, std::list<HandoverEvent> 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<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
 
@@ -69,6 +69,7 @@
   bool m_epc;
   bool m_useUdp;
   std::string m_schedulerType;
+  bool m_admitHo;
   Ptr<LteHelper> m_lteHelper;
   Ptr<EpcHelper> m_epcHelper;
   
@@ -97,19 +98,20 @@
 };
 
 
-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<HandoverEvent> 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<HandoverEvent> 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 @@
     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 @@
 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 @@
 
   NetDeviceContainer enbDevices;
   enbDevices = m_lteHelper->InstallEnbDevice (enbNodes);
+  for (NetDeviceContainer::Iterator it = enbDevices.Begin ();
+       it != enbDevices.End ();
+       ++it)
+    {
+      Ptr<LteEnbRrc> enbRrc = (*it)->GetObject<LteEnbNetDevice> ()->GetRrc ();
+      enbRrc->SetAttribute ("AdmitHandoverRequest", BooleanValue (m_admitHo));
+    }
 
   NetDeviceContainer ueDevices;
   ueDevices = m_lteHelper->InstallUeDevice (ueNodes);
@@ -370,7 +380,7 @@
                            &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 @@
   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;