src/lte/model/lte-enb-rrc.cc
changeset 9439 5107601b7a75
parent 9438 05361705484a
child 9442 ea15d4676dff
equal deleted inserted replaced
9438:05361705484a 9439:5107601b7a75
   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;      
   546 {
   589 {
   547   NS_LOG_FUNCTION (this);
   590   NS_LOG_FUNCTION (this);
   548   SwitchToState (CONNECTED_NORMALLY);
   591   SwitchToState (CONNECTED_NORMALLY);
   549 }
   592 }
   550 
   593 
       
   594 
       
   595 // methods forwarded from CMAC SAP
   551 
   596 
   552 void
   597 void
   553 UeManager::CmacUeConfigUpdateInd (LteEnbCmacSapUser::UeConfig cmacParams)
   598 UeManager::CmacUeConfigUpdateInd (LteEnbCmacSapUser::UeConfig cmacParams)
   554 {
   599 {
   555   NS_LOG_FUNCTION (this << m_rnti);
   600   NS_LOG_FUNCTION (this << m_rnti);
   568 
   613 
   569   // reconfigure the UE RRC
   614   // reconfigure the UE RRC
   570   ScheduleRrcConnectionReconfiguration ();
   615   ScheduleRrcConnectionReconfiguration ();
   571 }
   616 }
   572 
   617 
       
   618 
       
   619 // methods forwarded from PDCP SAP
   573 
   620 
   574 void
   621 void
   575 UeManager::DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params)
   622 UeManager::DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params)
   576 {
   623 {
   577   NS_LOG_FUNCTION (this);
   624   NS_LOG_FUNCTION (this);
  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     {