101 "CONNECTION_SETUP", |
101 "CONNECTION_SETUP", |
102 "CONNECTED_NORMALLY", |
102 "CONNECTED_NORMALLY", |
103 "CONNECTION_RECONFIGURATION", |
103 "CONNECTION_RECONFIGURATION", |
104 "CONNECTION_REESTABLISHMENT", |
104 "CONNECTION_REESTABLISHMENT", |
105 "HANDOVER_JOINING", |
105 "HANDOVER_JOINING", |
|
106 "HANDOVER_PATH_SWITCH", |
106 "HANDOVER_LEAVING", |
107 "HANDOVER_LEAVING", |
107 }; |
108 }; |
108 |
109 |
109 std::string ToString (UeManager::State s) |
110 std::string ToString (UeManager::State s) |
110 { |
111 { |
261 { |
262 { |
262 m_sourceX2apId = sourceX2apId; |
263 m_sourceX2apId = sourceX2apId; |
263 m_sourceCellId = sourceCellId; |
264 m_sourceCellId = sourceCellId; |
264 } |
265 } |
265 |
266 |
|
267 void |
|
268 UeManager::SetImsi (uint64_t imsi) |
|
269 { |
|
270 m_imsi = imsi; |
|
271 } |
|
272 |
266 uint8_t |
273 uint8_t |
267 UeManager::SetupDataRadioBearer (EpsBearer bearer, uint32_t gtpTeid, Ipv4Address transportLayerAddress) |
274 UeManager::SetupDataRadioBearer (EpsBearer bearer, uint32_t gtpTeid, Ipv4Address transportLayerAddress) |
268 { |
275 { |
269 NS_LOG_FUNCTION (this << (uint32_t) m_rnti); |
276 NS_LOG_FUNCTION (this << (uint32_t) m_rnti); |
270 |
277 |
447 ret.push_back (etbsi); |
454 ret.push_back (etbsi); |
448 } |
455 } |
449 return ret; |
456 return ret; |
450 } |
457 } |
451 |
458 |
|
459 void |
|
460 UeManager::SendUeContextRelease () |
|
461 { |
|
462 NS_LOG_FUNCTION (this); |
|
463 switch (m_state) |
|
464 { |
|
465 case HANDOVER_PATH_SWITCH: |
|
466 NS_LOG_INFO ("Send UE CONTEXT RELEASE from target eNB to source eNB"); |
|
467 EpcX2SapProvider::UeContextReleaseParams ueCtxReleaseParams; |
|
468 ueCtxReleaseParams.oldEnbUeX2apId = m_sourceX2apId; |
|
469 ueCtxReleaseParams.newEnbUeX2apId = m_rnti; |
|
470 ueCtxReleaseParams.sourceCellId = m_sourceCellId; |
|
471 m_rrc->m_x2SapProvider->SendUeContextRelease (ueCtxReleaseParams); |
|
472 SwitchToState (CONNECTED_NORMALLY); |
|
473 break; |
|
474 |
|
475 default: |
|
476 NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); |
|
477 break; |
|
478 } |
|
479 } |
|
480 |
|
481 |
|
482 // methods forwarded from RRC SAP |
|
483 |
452 void |
484 void |
453 UeManager::CompleteSetupUe (LteEnbRrcSapProvider::CompleteSetupUeParameters params) |
485 UeManager::CompleteSetupUe (LteEnbRrcSapProvider::CompleteSetupUeParameters params) |
454 { |
486 { |
455 NS_LOG_FUNCTION (this); |
487 NS_LOG_FUNCTION (this); |
456 m_srb0->m_rlc->SetLteRlcSapUser (params.srb0SapUser); |
488 m_srb0->m_rlc->SetLteRlcSapUser (params.srb0SapUser); |
513 case HANDOVER_LEAVING: |
545 case HANDOVER_LEAVING: |
514 NS_LOG_INFO ("ignoring RecvRrcConnectionReconfigurationCompleted in state " << ToString (m_state)); |
546 NS_LOG_INFO ("ignoring RecvRrcConnectionReconfigurationCompleted in state " << ToString (m_state)); |
515 break; |
547 break; |
516 |
548 |
517 case HANDOVER_JOINING: |
549 case HANDOVER_JOINING: |
518 NS_LOG_INFO ("Send UE CONTEXT RELEASE from target eNB to source eNB"); |
550 { |
519 EpcX2SapProvider::UeContextReleaseParams ueCtxReleaseParams; |
551 NS_LOG_INFO ("Send PATH SWITCH REQUEST to the MME"); |
520 ueCtxReleaseParams.oldEnbUeX2apId = m_sourceX2apId; |
552 EpcEnbS1SapProvider::PathSwitchRequestParameters params; |
521 ueCtxReleaseParams.newEnbUeX2apId = m_rnti; |
553 params.rnti = m_rnti; |
522 ueCtxReleaseParams.sourceCellId = m_sourceCellId; |
554 params.cellId = m_rrc->m_cellId; |
523 m_rrc->m_x2SapProvider->SendUeContextRelease (ueCtxReleaseParams); |
555 params.mmeUeS1Id = m_imsi; |
524 SwitchToState (CONNECTED_NORMALLY); |
556 SwitchToState (HANDOVER_PATH_SWITCH); |
|
557 for (std::map <uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it = m_drbMap.begin (); |
|
558 it != m_drbMap.end (); |
|
559 ++it) |
|
560 { |
|
561 EpcEnbS1SapProvider::BearerToBeSwitched b; |
|
562 b.epsBearerId = it->second->m_epsBearerIdentity; |
|
563 b.teid = it->second->m_gtpTeid; |
|
564 params.bearersToBeSwitched.push_back (b); |
|
565 } |
|
566 m_rrc->m_s1SapProvider->PathSwitchRequest (params); |
|
567 } |
525 break; |
568 break; |
526 |
569 |
527 default: |
570 default: |
528 NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); |
571 NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); |
529 break; |
572 break; |
1035 EpcX2SapProvider::HandoverRequestParams params; |
1082 EpcX2SapProvider::HandoverRequestParams params; |
1036 params.oldEnbUeX2apId = rnti; |
1083 params.oldEnbUeX2apId = rnti; |
1037 params.cause = EpcX2SapProvider::HandoverDesirableForRadioReason; |
1084 params.cause = EpcX2SapProvider::HandoverDesirableForRadioReason; |
1038 params.sourceCellId = m_cellId; |
1085 params.sourceCellId = m_cellId; |
1039 params.targetCellId = cellId; |
1086 params.targetCellId = cellId; |
1040 params.mmeUeS1apId = 1234567; |
1087 params.mmeUeS1apId = ueManager->GetImsi (); |
1041 params.ueAggregateMaxBitRateDownlink = 200 * 1000; |
1088 params.ueAggregateMaxBitRateDownlink = 200 * 1000; |
1042 params.ueAggregateMaxBitRateUplink = 100 * 1000; |
1089 params.ueAggregateMaxBitRateUplink = 100 * 1000; |
1043 params.bearers = ueManager->GetErabList (); |
1090 params.bearers = ueManager->GetErabList (); |
1044 |
1091 |
1045 LteRrcSap::HandoverPreparationInfo hpi; |
1092 LteRrcSap::HandoverPreparationInfo hpi; |
1108 uint8_t bid = ueManager->SetupDataRadioBearer (request.bearer, request.gtpTeid, request.transportLayerAddress); |
1155 uint8_t bid = ueManager->SetupDataRadioBearer (request.bearer, request.gtpTeid, request.transportLayerAddress); |
1109 NS_ASSERT_MSG ( request.bearerId == 0 || bid == request.bearerId, "bearer ID mismatch (" << (uint32_t) bid << " != " << (uint32_t) request.bearerId << ", the assumption that ID are allocated in the same way by MME and RRC is not valid any more"); |
1156 NS_ASSERT_MSG ( request.bearerId == 0 || bid == request.bearerId, "bearer ID mismatch (" << (uint32_t) bid << " != " << (uint32_t) request.bearerId << ", the assumption that ID are allocated in the same way by MME and RRC is not valid any more"); |
1110 ueManager->ScheduleRrcConnectionReconfiguration (); |
1157 ueManager->ScheduleRrcConnectionReconfiguration (); |
1111 } |
1158 } |
1112 |
1159 |
|
1160 void |
|
1161 LteEnbRrc::DoPathSwitchRequestAcknowledge (EpcEnbS1SapUser::PathSwitchRequestAcknowledgeParameters params) |
|
1162 { |
|
1163 Ptr<UeManager> ueManager = GetUeManager (params.rnti); |
|
1164 ueManager->SendUeContextRelease (); |
|
1165 } |
1113 |
1166 |
1114 void |
1167 void |
1115 LteEnbRrc::DoRecvHandoverRequest (EpcX2SapUser::HandoverRequestParams params) |
1168 LteEnbRrc::DoRecvHandoverRequest (EpcX2SapUser::HandoverRequestParams params) |
1116 { |
1169 { |
1117 NS_LOG_FUNCTION (this); |
1170 NS_LOG_FUNCTION (this); |
1135 return; |
1188 return; |
1136 } |
1189 } |
1137 |
1190 |
1138 Ptr<UeManager> ueManager = GetUeManager (rnti); |
1191 Ptr<UeManager> ueManager = GetUeManager (rnti); |
1139 ueManager->SetSource (params.sourceCellId, params.oldEnbUeX2apId); |
1192 ueManager->SetSource (params.sourceCellId, params.oldEnbUeX2apId); |
|
1193 ueManager->SetImsi (params.mmeUeS1apId); |
1140 |
1194 |
1141 for (std::vector <EpcX2Sap::ErabToBeSetupItem>::iterator it = params.bearers.begin (); |
1195 for (std::vector <EpcX2Sap::ErabToBeSetupItem>::iterator it = params.bearers.begin (); |
1142 it != params.bearers.end (); |
1196 it != params.bearers.end (); |
1143 ++it) |
1197 ++it) |
1144 { |
1198 { |