517 case HANDOVER_JOINING: |
517 case HANDOVER_JOINING: |
518 NS_LOG_INFO ("Send UE CONTEXT RELEASE from target eNB to source eNB"); |
518 NS_LOG_INFO ("Send UE CONTEXT RELEASE from target eNB to source eNB"); |
519 EpcX2SapProvider::UeContextReleaseParams ueCtxReleaseParams; |
519 EpcX2SapProvider::UeContextReleaseParams ueCtxReleaseParams; |
520 ueCtxReleaseParams.oldEnbUeX2apId = m_sourceX2apId; |
520 ueCtxReleaseParams.oldEnbUeX2apId = m_sourceX2apId; |
521 ueCtxReleaseParams.newEnbUeX2apId = m_rnti; |
521 ueCtxReleaseParams.newEnbUeX2apId = m_rnti; |
|
522 ueCtxReleaseParams.sourceCellId = m_sourceCellId; |
522 m_rrc->m_x2SapProvider->SendUeContextRelease (ueCtxReleaseParams); |
523 m_rrc->m_x2SapProvider->SendUeContextRelease (ueCtxReleaseParams); |
523 SwitchToState (CONNECTED_NORMALLY); |
524 SwitchToState (CONNECTED_NORMALLY); |
|
525 break; |
524 |
526 |
525 default: |
527 default: |
526 NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); |
528 NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); |
527 break; |
529 break; |
528 } |
530 } |
1124 NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); |
1126 NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); |
1125 |
1127 |
1126 NS_ASSERT (params.targetCellId == m_cellId); |
1128 NS_ASSERT (params.targetCellId == m_cellId); |
1127 |
1129 |
1128 uint16_t rnti = AddUe (UeManager::HANDOVER_JOINING); |
1130 uint16_t rnti = AddUe (UeManager::HANDOVER_JOINING); |
|
1131 LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue anrcrv = m_cmacSapProvider->AllocateNcRaPreamble (rnti); |
|
1132 if (anrcrv.valid == false) |
|
1133 { |
|
1134 NS_LOG_INFO (this << "failed to allocate a preamble for non-contention based RA => cannot accept HO"); |
|
1135 RemoveUe (rnti); |
|
1136 NS_FATAL_ERROR ("should trigger HO Preparation Failure, but it is not implemented"); |
|
1137 return; |
|
1138 } |
|
1139 |
1129 Ptr<UeManager> ueManager = GetUeManager (rnti); |
1140 Ptr<UeManager> ueManager = GetUeManager (rnti); |
1130 ueManager->SetSource (params.sourceCellId, params.oldEnbUeX2apId); |
1141 ueManager->SetSource (params.sourceCellId, params.oldEnbUeX2apId); |
1131 |
1142 |
1132 for (std::vector <EpcX2Sap::ErabToBeSetupItem>::iterator it = params.bearers.begin (); |
1143 for (std::vector <EpcX2Sap::ErabToBeSetupItem>::iterator it = params.bearers.begin (); |
1133 it != params.bearers.end (); |
1144 it != params.bearers.end (); |
1137 } |
1148 } |
1138 |
1149 |
1139 LteRrcSap::RrcConnectionReconfiguration handoverCommand = ueManager->GetRrcConnectionReconfigurationForHandover (); |
1150 LteRrcSap::RrcConnectionReconfiguration handoverCommand = ueManager->GetRrcConnectionReconfigurationForHandover (); |
1140 handoverCommand.haveMobilityControlInfo = true; |
1151 handoverCommand.haveMobilityControlInfo = true; |
1141 handoverCommand.mobilityControlInfo.targetPhysCellId = m_cellId; |
1152 handoverCommand.mobilityControlInfo.targetPhysCellId = m_cellId; |
|
1153 handoverCommand.mobilityControlInfo.haveCarrierFreq = true; |
1142 handoverCommand.mobilityControlInfo.carrierFreq.dlCarrierFreq = m_dlEarfcn; |
1154 handoverCommand.mobilityControlInfo.carrierFreq.dlCarrierFreq = m_dlEarfcn; |
1143 handoverCommand.mobilityControlInfo.carrierFreq.ulCarrierFreq = m_ulEarfcn; |
1155 handoverCommand.mobilityControlInfo.carrierFreq.ulCarrierFreq = m_ulEarfcn; |
1144 handoverCommand.mobilityControlInfo.haveCarrierBandwidth = true; |
1156 handoverCommand.mobilityControlInfo.haveCarrierBandwidth = true; |
1145 handoverCommand.mobilityControlInfo.carrierBandwidth.dlBandwidth = m_dlBandwidth; |
1157 handoverCommand.mobilityControlInfo.carrierBandwidth.dlBandwidth = m_dlBandwidth; |
1146 handoverCommand.mobilityControlInfo.carrierBandwidth.ulBandwidth = m_ulBandwidth; |
1158 handoverCommand.mobilityControlInfo.carrierBandwidth.ulBandwidth = m_ulBandwidth; |
1147 handoverCommand.mobilityControlInfo.newUeIdentity = rnti; |
1159 handoverCommand.mobilityControlInfo.newUeIdentity = rnti; |
1148 LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue anrcrv = m_cmacSapProvider->AllocateNcRaPreamble (); |
1160 handoverCommand.mobilityControlInfo.haveRachConfigDedicated = true; |
1149 if (anrcrv.valid == true) |
1161 handoverCommand.mobilityControlInfo.rachConfigDedicated.raPreambleIndex = anrcrv.raPreambleId; |
1150 { |
1162 handoverCommand.mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex = anrcrv.raPrachMaskIndex; |
1151 handoverCommand.mobilityControlInfo.haveRachConfigDedicated = true; |
|
1152 handoverCommand.mobilityControlInfo.rachConfigDedicated.raPreambleIndex = anrcrv.raPreambleId; |
|
1153 handoverCommand.mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex = anrcrv.raPrachMaskIndex; |
|
1154 } |
|
1155 else |
|
1156 { |
|
1157 handoverCommand.mobilityControlInfo.haveRachConfigDedicated = false; |
|
1158 } |
|
1159 Ptr<Packet> encodedHandoverCommand = m_rrcSapUser->EncodeHandoverCommand (handoverCommand); |
1163 Ptr<Packet> encodedHandoverCommand = m_rrcSapUser->EncodeHandoverCommand (handoverCommand); |
1160 |
1164 |
1161 NS_LOG_LOGIC ("Send X2 message: HANDOVER REQUEST ACK"); |
1165 NS_LOG_LOGIC ("Send X2 message: HANDOVER REQUEST ACK"); |
1162 |
1166 |
1163 EpcX2SapProvider::HandoverRequestAckParams ackParams; |
1167 EpcX2SapProvider::HandoverRequestAckParams ackParams; |
1408 |
1412 |
1409 void |
1413 void |
1410 LteEnbRrc::RemoveSrsConfigurationIndex (uint16_t srcCi) |
1414 LteEnbRrc::RemoveSrsConfigurationIndex (uint16_t srcCi) |
1411 { |
1415 { |
1412 NS_LOG_FUNCTION (this << srcCi); |
1416 NS_LOG_FUNCTION (this << srcCi); |
1413 NS_FATAL_ERROR ("I though this method was unused so far..."); |
|
1414 std::set<uint16_t>::iterator it = m_ueSrsConfigurationIndexSet.find (srcCi); |
1417 std::set<uint16_t>::iterator it = m_ueSrsConfigurationIndexSet.find (srcCi); |
1415 NS_ASSERT_MSG (it != m_ueSrsConfigurationIndexSet.end (), "request to remove unkwown SRS CI " << srcCi); |
1418 NS_ASSERT_MSG (it != m_ueSrsConfigurationIndexSet.end (), "request to remove unkwown SRS CI " << srcCi); |
1416 m_ueSrsConfigurationIndexSet.erase (it); |
1419 m_ueSrsConfigurationIndexSet.erase (it); |
1417 NS_ASSERT (m_srsCurrentPeriodicityId > 1); |
1420 NS_ASSERT (m_srsCurrentPeriodicityId >= 1 && m_srsCurrentPeriodicityId <= SRS_ENTRIES); |
1418 if (m_ueSrsConfigurationIndexSet.size () < g_srsPeriodicity[m_srsCurrentPeriodicityId - 1]) |
1421 if (m_ueSrsConfigurationIndexSet.size () < g_srsPeriodicity[m_srsCurrentPeriodicityId - 1]) |
1419 { |
1422 { |
1420 // reduce the periodicity |
1423 // reduce the periodicity |
1421 m_ueSrsConfigurationIndexSet.clear (); |
1424 m_ueSrsConfigurationIndexSet.clear (); |
1422 m_srsCurrentPeriodicityId--; |
1425 m_srsCurrentPeriodicityId--; |