VOS_UINT32 NAS_MMC_StartResumeTimer_InterSysCellResel(VOS_VOID) { #if ((FEATURE_ON == FEATURE_CL_INTERWORK) || ((FEATURE_ON == FEATURE_UE_MODE_CDMA) && (FEATURE_ON == FEATURE_LTE))) if (VOS_TRUE == NAS_MMC_IsInterSysReselectToHrpd(NAS_MMC_GetCurrEntryMsg())) { #if (FEATURE_ON == FEATURE_CL_INTERWORK) (VOS_VOID)NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_CMMCA_RESUME_IND, TI_NAS_MMC_WAIT_CMMCA_RESUME_IND_LEN); #endif #if ((FEATURE_ON == FEATURE_UE_MODE_CDMA) && (FEATURE_ON == FEATURE_LTE)) /* 重定向,定时器时长为180s */ if (MMC_SUSPEND_CAUSE_REDIRECTION == NAS_MMC_GetSuspendCause(NAS_MMC_GetCurrEntryMsg())) { (VOS_VOID)NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MSCC_INTERSYS_HRPD_NTF, TI_NAS_MMC_WAIT_MSCC_INTERSYS_HRPD_NTF_REDIR_LEN); } /* 重选,定时器时长为35s */ else /* (MMC_SUSPEND_CAUSE_CELLRESELECT == NAS_MMC_GetSuspendCause(NAS_MMC_GetCurrEntryMsg())) */ { (VOS_VOID)NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MSCC_INTERSYS_HRPD_NTF, TI_NAS_MMC_WAIT_MSCC_INTERSYS_HRPD_NTF_RESELCT_LEN); } #endif return VOS_TRUE; } else #endif { return VOS_FALSE; } }
VOS_VOID NAS_MMC_SetRatModeSysCfgReq_SysCfg( NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enCurrRat, MMA_MMC_SYS_CFG_SET_REQ_STRU *pstSysCfgMsg ) { /* 根据接入模式,进行SYSCFG的设置 */ switch ( enCurrRat ) { #if (FEATURE_ON == FEATURE_LTE) case NAS_MML_NET_RAT_TYPE_LTE: /* 向L模下发SYSCFG设置请求 */ NAS_MMC_SndLmmSyscfgReq(pstSysCfgMsg); NAS_MMC_AddSysCfgIndex_SysCfg(); /* 进行SYSCFG状态机的子状态的迁移 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_SYSCFG_STA_WAIT_LMM_SYSCFG_CNF); /* 启动等待回复定时器 */ NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_LMM_SYSCFG_CNF, TI_NAS_MMC_WAIT_LMM_SYSCFG_CNF_LEN); break; #endif case NAS_MML_NET_RAT_TYPE_WCDMA: /* 向W模下发SYSCFG设置请求 */ NAS_MMC_SndAsSyscfgReq(pstSysCfgMsg, WUEPS_PID_WRR); NAS_MMC_AddSysCfgIndex_SysCfg(); /* 进行SYSCFG状态机的子状态的迁移 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_SYSCFG_STA_WAIT_WAS_SYSCFG_CNF); /* 启动等待回复定时器 */ NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_WAS_SYSCFG_CNF, TI_NAS_MMC_WAIT_WAS_SYSCFG_CNF_LEN); break; case NAS_MML_NET_RAT_TYPE_GSM: /* 向G模下发SYSCFG设置请求 */ NAS_MMC_SndAsSyscfgReq(pstSysCfgMsg, UEPS_PID_GAS); NAS_MMC_AddSysCfgIndex_SysCfg(); /* 进行SYSCFG状态机的子状态的迁移 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_SYSCFG_STA_WAIT_GAS_SYSCFG_CNF); /* 启动等待回复定时器 */ NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_GAS_SYSCFG_CNF, TI_NAS_MMC_WAIT_GAS_SYSCFG_CNF_LEN); break; default: NAS_ERROR_LOG(WUEPS_PID_MMC, "NAS_MMC_SetRatModeSysCfgReq_SysCfg():Invalid net rat type"); break; } return; }
VOS_UINT32 NAS_MMC_RcvGmmSuspendRsp_InterSysHo_WaitMmSuspendRsp( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { /* 标记已收到GMM_suspend_RSP */ NAS_MMC_ClearSuspendRspFlag_InterSysHo( NAS_MMC_GMM_SUSPEND_RSP_FLG ); /* 未收齐GMM,MM的SUSPNED_RSP,返回继续等待 */ if ( NAS_MMC_SUSPEND_RSP_NULL_FLG != NAS_MMC_GetSuspendRspFlg_InterSysHo() ) { return VOS_TRUE; } /* 停止定时器TI_NAS_MMC_WAIT_MM_SUSPEND_RSP */ NAS_MMC_StopTimer ( TI_NAS_MMC_WAIT_MM_SUSPEND_RSP ); /* 向接入层发送挂起成功 */ NAS_MMC_SndSuspendRsp(NAS_MML_GetCurrNetRatType(), RRC_NAS_SUSPEND_SUCCESS); NAS_MMC_FSM_SetCurrState( NAS_MMC_INTER_SYS_HO_STA_WAIT_AS_RESUME_IND ); NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND, TI_NAS_MMC_WAIT_AS_RESUME_IND_LEN); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvLmmResumeInd_InterSysHo_WaitAsResumeInd( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_RESUME_IND_ST stResumeIndMsg; /* 停止TI_NAS_MMC_WAIT_AS_RESUME_IND */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND); /* 设置当前网络为LTE */ NAS_MML_SetCurrNetRatType(NAS_MML_NET_RAT_TYPE_LTE); /* 由于L的RESUME_IND消息不包含CS,PSresume结果,此时按照恢复成功生成RESUME消息 */ NAS_MMC_BulidResumeMsg(NAS_MML_NET_RAT_TYPE_LTE ,&stResumeIndMsg); /* 将resume 的结果包含在GMM_MMC_RESUME_INd 消息中,并向GMM发送 */ NAS_MMC_SndGmmResumeInd_Handover(&stResumeIndMsg, VOS_FALSE); NAS_MMC_SetResumeRspFlag_InterSysHo(NAS_MMC_GMM_RESUME_RSP_FLG); NAS_MMC_SetPsSigExistFlag_InterSysHo(VOS_FALSE); /* 将resume 的结果包含在MM_MMC_RESUME_IND消息中,并向MM发送:NAS_MMC_SndMmResumeInd */ NAS_MMC_SndMmResumeInd_Handover(&stResumeIndMsg, VOS_FALSE); NAS_MMC_SetResumeRspFlag_InterSysHo(NAS_MMC_MM_RESUME_RSP_FLG); NAS_MMC_SetCsSigExistFlag_InterSysHo(VOS_FALSE); /* 迁入到NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_RESUME_RSP状态 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_RESUME_RSP); /* 启动定时器TI_NAS_MMC_WAIT_MM_RESUME_RSP */ NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MM_RESUME_RSP, TI_NAS_MMC_WAIT_MM_RESUME_RSP_LEN); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvMmcAbortFsmMsg_InterSysOos_WaitAsResumeInd( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { /* 停止TI_NAS_MMC_WAIT_AS_RESUME_IND */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND); /* 向当前AS发送 RRMM_SUSPEND_REL_REQ */ if ( NAS_MML_NET_RAT_TYPE_WCDMA == NAS_MML_GetCurrNetRatType()) { NAS_MMC_SndAsSuspendRelReq(WUEPS_PID_WRR); } else { NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvMmcAbortFsmMsg_InterSysOos_WaitAsResumeInd:could not support current rat!"); return VOS_FALSE; } /* 迁移状态到等待SUSPEND_REL_CNF */ NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_OOS_STA_WAIT_WAS_SUSPEND_REL_CNF); NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_WAS_SUSPEND_REL_CNF, TI_NAS_MMC_WAIT_WAS_SUSPEND_REL_CNF_LEN); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvGasResumeInd_InterSysHo_WaitAsResumeInd( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_RESUME_IND_ST *pstResumeIndMsg = VOS_NULL_PTR; NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enOldNtType; /* 停止MMC_WAIT_AS_RESUME_IND_TIMER */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND); if ( NAS_MML_NET_RAT_TYPE_GSM != NAS_MML_GetCurrNetRatType()) { /* 清除小区信息以及信号量 */ NAS_MML_InitRssiValue(NAS_MML_GetCampCellInfo()); } NAS_MML_SetCurrNetRatType(NAS_MML_NET_RAT_TYPE_GSM); /* 生成RESUME消息 */ pstResumeIndMsg = (RRMM_RESUME_IND_ST *)pstMsg; enOldNtType = NAS_MMC_GetSuspendOrigenRatType(NAS_MMC_GetCurrEntryMsg()); /* GU之间的切换,CS信令连接存在 */ if (NAS_MML_NET_RAT_TYPE_WCDMA == enOldNtType) { NAS_MMC_SetCsSigExistFlag_InterSysHo(VOS_TRUE); } /* 将resume 的结果包含在GMM_MMC_RESUME_INd 消息中,并向GMM发送 */ NAS_MMC_SndMmResumeInd_Handover(pstResumeIndMsg, NAS_MMC_GetCsSigExistFlag_InterSysHo()); NAS_MMC_SetResumeRspFlag_InterSysHo(NAS_MMC_GMM_RESUME_RSP_FLG); NAS_MMC_SetCsSigExistFlag_InterSysHo(VOS_FALSE); /* 将resume 的结果包含在MM_MMC_RESUME_IND消息中,并向MM发送 */ NAS_MMC_SndGmmResumeInd_Handover(pstResumeIndMsg, NAS_MMC_GetPsSigExistFlag_InterSysHo()); NAS_MMC_SetResumeRspFlag_InterSysHo(NAS_MMC_MM_RESUME_RSP_FLG); NAS_MMC_SetPsSigExistFlag_InterSysHo(VOS_FALSE); /* 迁入到NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_RESUME_RSP状态 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_RESUME_RSP); NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MM_RESUME_RSP, TI_NAS_MMC_WAIT_MM_RESUME_RSP_LEN); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvTiWaitEpsConnRelIndExpired_SysCfg_WaitEpsConnRelInd( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { MMA_MMC_SYS_CFG_SET_REQ_STRU *pstSysCfgMsg = VOS_NULL_PTR; NAS_MMC_ENTRY_MSG_STRU *pstEntryMsg = VOS_NULL_PTR; NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enNextRat; /* 打印异常信息 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvTiWaitEpsConnRelIndExpired_SysCfg_WaitEpsConnRelInd:TI_NAS_MMC_WAIT_EPS_CONN_REL_IND timeout"); /* 获取SYSCFG状态机的入口消息信息 */ pstEntryMsg = NAS_MMC_GetCurrEntryMsg(); pstSysCfgMsg = (MMA_MMC_SYS_CFG_SET_REQ_STRU*)(pstEntryMsg->aucEntryMsgBuffer); enNextRat = NAS_MML_NET_RAT_TYPE_BUTT; /* 如果信令连接存在, 而且是主动释放连接,则进行搜网动作 */ if (VOS_TRUE == NAS_MMC_GetRelRequestFlag_SysCfg()) { NAS_MMC_SetRelRequestFlag_SysCfg(VOS_FALSE); /* 取得目标模的接入技术,并发送SYSCFG请求 */ enNextRat = NAS_MMC_GetNextSettingRat_SysCfg(); NAS_MMC_SetRatModeSysCfgReq_SysCfg(enNextRat, pstSysCfgMsg); /* 向当前接入模式发送SYSCFG请求 */ NAS_MMC_SetRatModeSysCfgReq_SysCfg(enNextRat, pstSysCfgMsg); /* 向MM、GMM发送搜网指示 */ NAS_MMC_SndGmmPlmnSchInit(); NAS_MMC_SndMmPlmnSchInit(); return VOS_TRUE; } /* 发送主动释放请求到LMM,重新启动等待连接释放定时器 */ NAS_MMC_SetRelRequestFlag_SysCfg(VOS_TRUE); NAS_MMC_SndLmmRelReq(); NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_EPS_CONN_REL_IND, TI_NAS_MMC_WAIT_EPS_CONN_REL_IND_LEN); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvRrMmRelInd_InterSysHo_WaitAsResumeInd( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_REL_IND_STRU *pstRelInd = VOS_NULL_PTR; RRMM_RESUME_IND_ST stResumeIndMsg; pstRelInd = (RRMM_REL_IND_STRU*)pstMsg; /* 释放原因为Utran release时,需要继续HO流程,继续等待resume ind, 其它认为流程结束,代表WAS恢复,即等同WAS发送了resume ind,但连接已不存在 */ if (RRC_REL_CAUSE_UTRAN_RELEASE == pstRelInd->ulRelCause) { return VOS_TRUE; } if ( NAS_MML_NET_RAT_TYPE_WCDMA != NAS_MML_GetCurrNetRatType()) { /* 清除小区信息以及信号量 */ NAS_MML_InitRssiValue(NAS_MML_GetCampCellInfo()); } NAS_MML_SetCurrNetRatType(NAS_MML_NET_RAT_TYPE_WCDMA); /* 停止MMC_WAIT_AS_RESUME_IND_TIMER */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND); /* 将resume 的结果包含在GMM_MMC_RESUME_INd 消息中,并向GMM发送 */ PS_MEM_SET(&stResumeIndMsg, 0x0, sizeof(stResumeIndMsg)); NAS_MMC_SndMmResumeInd_Handover(&stResumeIndMsg, NAS_MMC_GetCsSigExistFlag_InterSysHo()); NAS_MMC_SetResumeRspFlag_InterSysHo(NAS_MMC_GMM_RESUME_RSP_FLG); NAS_MMC_SetCsSigExistFlag_InterSysHo(VOS_FALSE); /* 将resume 的结果包含在MM_MMC_RESUME_IND消息中,并向MM发送 */ NAS_MMC_SndGmmResumeInd_Handover(&stResumeIndMsg, NAS_MMC_GetPsSigExistFlag_InterSysHo()); NAS_MMC_SetResumeRspFlag_InterSysHo(NAS_MMC_MM_RESUME_RSP_FLG); NAS_MMC_SetPsSigExistFlag_InterSysHo(VOS_FALSE); /* 迁入到NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_RESUME_RSP状态 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_RESUME_RSP); NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MM_RESUME_RSP, TI_NAS_MMC_WAIT_MM_RESUME_RSP_LEN); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvGasSuspendInd_InterSysHo_Init( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_SUSPEND_IND_ST *pstHoSuspendMsg; pstHoSuspendMsg = (RRMM_SUSPEND_IND_ST *)pstMsg; /* 保存入口消息 */ NAS_MMC_SaveCurEntryMsg(ulEventType, pstMsg); #if (FEATURE_ON == FEATURE_LTE) /* MMC只在以下三个场景中用原语MMC_LMM_EPLMN_NOTIFY_REQ通知LMM:3异系统变换中,GU发生挂起,目标系统为LTE时 */ if ( MMC_SUSPEND_DESTINATION_LTE == pstHoSuspendMsg->ucSuspendDestination ) { /* 通知LTE等效PLMN */ NAS_MMC_SndLmmEquPlmn_InterSysChangeLte(); } #endif /* 向MM发起挂起指示 */ NAS_MMC_SndMmSuspendInd(pstHoSuspendMsg); /* 设置MM挂起回复标记 */ NAS_MMC_SetSuspendRspFlag_InterSysHo(NAS_MMC_MM_SUSPEND_RSP_FLG); /* 向GMM发起挂起指示 */ NAS_MMC_SndGmmSuspendInd(pstHoSuspendMsg); /* 设置GMM挂起回复标记 */ NAS_MMC_SetSuspendRspFlag_InterSysHo(NAS_MMC_GMM_SUSPEND_RSP_FLG); /* 状态迁移到NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_SUSPEND_RSP */ NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_SUSPEND_RSP); /* 启动等待MM回复定时器 */ NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MM_SUSPEND_RSP, TI_NAS_MMC_WAIT_MM_SUSPEND_RSP_LEN); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvWasResumeInd_InterSysOos_WaitWasSuspendRelCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { /* 对冲场景的处理:刚给接入层发过RRMM_SUSPEND_REL_REQ就收到接入层的RRMM_RESUME_IND 按照收到RRMM_RESUME_IND消息处理,后续收到RRMM_SUSPEND_REL_CNF丢弃 */ RRMM_RESUME_IND_ST *pstResumeIndMsg = VOS_NULL_PTR; /* 停止MMC_WAIT_AS_RESUME_IND_TIMER */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND); if ( NAS_MML_NET_RAT_TYPE_WCDMA != NAS_MML_GetCurrNetRatType()) { /* 清除小区信息以及信号量 */ NAS_MML_InitRssiValue(NAS_MML_GetCampCellInfo()); } NAS_MML_SetCurrNetRatType(NAS_MML_NET_RAT_TYPE_WCDMA); /* 生成RESUME消息 */ pstResumeIndMsg = (RRMM_RESUME_IND_ST *)pstMsg; /* 将resume 的结果包含在GMM_MMC_RESUME_INd 消息中,并向GMM发送 */ NAS_MMC_SndGmmResumeInd(pstResumeIndMsg); NAS_MMC_SetResumeRspFlag_InterSysOos(NAS_MMC_GMM_RESUME_RSP_FLG); /* 将resume 的结果包含在MM_MMC_RESUME_IND消息中,并向MM发送 */ NAS_MMC_SndMmResumeInd(pstResumeIndMsg); NAS_MMC_SetResumeRspFlag_InterSysOos(NAS_MMC_MM_RESUME_RSP_FLG); /* 迁入到NAS_MMC_INTER_SYS_OOS_STA_WAIT_MM_RESUME_RSP状态 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_OOS_STA_WAIT_MM_RESUME_RSP); NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MM_RESUME_RSP, TI_NAS_MMC_WAIT_MM_RESUME_RSP_LEN); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvRrMmRelInd_InterSysOos_WaitAsResumeInd( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_RESUME_IND_ST stResumeIndMsg; /* 无需判断原因值 */ /* 停止TI_NAS_MMC_WAIT_AS_RESUME_IND */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_AS_RESUME_IND); if ( NAS_MML_NET_RAT_TYPE_WCDMA != NAS_MML_GetCurrNetRatType()) { /* 清除小区信息以及信号量 */ NAS_MML_InitRssiValue(NAS_MML_GetCampCellInfo()); } NAS_MML_SetCurrNetRatType(NAS_MML_NET_RAT_TYPE_WCDMA); /* 生成RESUME消息 */ NAS_MMC_BulidResumeMsg(NAS_MML_GetCurrNetRatType(), &stResumeIndMsg); /* 将resume 的结果包含在GMM_MMC_RESUME_INd 消息中,并向GMM发送 */ NAS_MMC_SndGmmResumeInd(&stResumeIndMsg); NAS_MMC_SetResumeRspFlag_InterSysOos(NAS_MMC_GMM_RESUME_RSP_FLG); NAS_MMC_SndMmResumeInd(&stResumeIndMsg); NAS_MMC_SetResumeRspFlag_InterSysOos(NAS_MMC_MM_RESUME_RSP_FLG); /* 迁入到NAS_MMC_INTER_SYS_OOS_STA_WAIT_MM_RESUME_RSP状态 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_OOS_STA_WAIT_MM_RESUME_RSP); NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MM_RESUME_RSP, TI_NAS_MMC_WAIT_MM_RESUME_RSP_LEN); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvLmmSuspendInd_InterSysHo_Init( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_SUSPEND_IND_ST stSndSuspendMsg; LMM_MMC_SUSPEND_IND_STRU *pstLSuspendMsg = VOS_NULL_PTR; pstLSuspendMsg = (LMM_MMC_SUSPEND_IND_STRU*)pstMsg; /* 保存入口消息 */ NAS_MMC_SaveCurEntryMsg(ulEventType, pstMsg); /* 转换L的挂起消息为GU格式的 */ NAS_MMC_ConvertLmmSuspendMsgToGUtype(pstLSuspendMsg, &stSndSuspendMsg); /* 向MM发起挂起指示 */ NAS_MMC_SndMmSuspendInd(&stSndSuspendMsg); /* 设置MM挂起回复标记 */ NAS_MMC_SetSuspendRspFlag_InterSysHo(NAS_MMC_MM_SUSPEND_RSP_FLG); /* 向GMM发起挂起指示 */ NAS_MMC_SndGmmSuspendInd(&stSndSuspendMsg); /* 设置GMM挂起回复标记 */ NAS_MMC_SetSuspendRspFlag_InterSysHo(NAS_MMC_GMM_SUSPEND_RSP_FLG); /* 状态迁移到NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_SUSPEND_RSP */ NAS_MMC_FSM_SetCurrState(NAS_MMC_INTER_SYS_HO_STA_WAIT_MM_SUSPEND_RSP); /* 启动等待MM回复定时器 */ NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_MM_SUSPEND_RSP, TI_NAS_MMC_WAIT_MM_SUSPEND_RSP_LEN); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvMmaSysCfgSetReq_SysCfg_Init( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { MMA_MMC_SYS_CFG_SET_REQ_STRU *pstSysCfgMsg = VOS_NULL_PTR; VOS_UINT32 ulRrcConnExistFlag; VOS_UINT32 ulNeedSyscfgPlmnSrch; NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enCurrRat; VOS_UINT32 ulFlg; VOS_UINT32 ulUsimStausFlg; NAS_MMC_PLMN_SELECTION_MODE_ENUM_UINT8 enPlmnSelectionMode; NAS_MML_PLMN_RAT_PRIO_STRU *pstPrePrioRatList; NAS_MML_PLMN_RAT_PRIO_STRU stSyscfgPrioRatList; pstPrePrioRatList = NAS_MML_GetMsPrioRatList(); /* 取得当前的SYSCFG消息 */ pstSysCfgMsg = (MMA_MMC_SYS_CFG_SET_REQ_STRU *)pstMsg; /* 若用户设置的SYSCFG消息只有漫游特性改变,则不需要通知接入层 */ if ( VOS_TRUE == pstSysCfgMsg->ucOnlyRoamParaChanged ) { /* 向MMA回复SYSCFG设置成功原语 */ NAS_MMC_SndMmaSysCfgCnf(MMA_MMC_SYS_CFG_SET_SUCCESS); /* 默认漫游设置不需要进行搜网 */ ulNeedSyscfgPlmnSrch = VOS_FALSE; /* 判断SYSCFG对ROAM特性的设置是否需要导致搜网 */ ulUsimStausFlg = NAS_MML_IsUsimStausValid(); ulFlg = NAS_MMC_CheckRoamSettingPlmnSelection_SysCfg(pstSysCfgMsg); if ( (VOS_TRUE == ulUsimStausFlg) && (VOS_TRUE == ulFlg) ) { ulNeedSyscfgPlmnSrch = VOS_TRUE; /*手动模式时,syscfg需要触发搜网时,需要将当前正常服务的plmn和接入技术保存一下作为用户重选的plmn id和接入技术 */ enPlmnSelectionMode = NAS_MMC_GetPlmnSelectionMode(); if ( NAS_MMC_PLMN_SELECTION_MODE_MANUAL == enPlmnSelectionMode) { /* 保存指定搜网前驻留的PlmnID及接入技术 */ NAS_MMC_SaveUserReselPlmnInfo(); } } /* 保存用户设置的漫游信息 */ NAS_MML_SetRoamCapability(pstSysCfgMsg->enRoamCapability); /* 通知上层状态机SYSCFG状态机运行结果,syscfg设置成功 */ NAS_MMC_SndSysCfgRslt(VOS_TRUE, ulNeedSyscfgPlmnSrch); /* 退出SYSCFG状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; } /* 保存入口消息 */ NAS_MMC_SaveCurEntryMsg(ulEventType, pstMsg); /* 根据当前模信息,完成向接入层下发SYSCFG顺序表的设置 */ NAS_MMC_SetSysCfgSendingOrder_SysCfg( NAS_MMC_GetDestModeRat_SysCfg(pstSysCfgMsg) ); /* 判断SYSCFG设置是否需要发起搜网 */ ulNeedSyscfgPlmnSrch = NAS_MMC_IsPlmnSelectionNeeded_SysCfg(pstSysCfgMsg); /* 保存搜网信息到状态机上下文中 */ NAS_MMC_SetPlmnSearchFlag_SysCfg(ulNeedSyscfgPlmnSrch); /*手动模式时,syscfg需要触发搜网时,需要将当前正常服务的plmn和接入技术保存一下作为用户重选的plmn id和接入技术 */ enPlmnSelectionMode = NAS_MMC_GetPlmnSelectionMode(); if ( ( NAS_MMC_PLMN_SELECTION_MODE_MANUAL == enPlmnSelectionMode) && (VOS_TRUE == ulNeedSyscfgPlmnSrch)) { /* 保存指定搜网前驻留的PlmnID及接入技术 */ NAS_MMC_SaveUserReselPlmnInfo(); } /* 保持syscfg设置前的接入技术和优先级 */ NAS_MMC_SetPrePrioRatList_SysCfg(pstPrePrioRatList); /* 赋值用户设置的接入技术优先级 */ PS_MEM_CPY(&stSyscfgPrioRatList, &(pstSysCfgMsg->stRatPrioList), sizeof(NAS_MML_PLMN_RAT_PRIO_STRU) ); NAS_MML_SetMsSysCfgPrioRatList(&stSyscfgPrioRatList); /* 获取当前模的信令链接存在信息 */ ulRrcConnExistFlag = NAS_MML_IsRrcConnExist(); if ( (VOS_TRUE == ulNeedSyscfgPlmnSrch) && (VOS_FALSE == ulRrcConnExistFlag) ) { /* 向GMM发送搜网指示 */ NAS_MMC_SndGmmPlmnSchInit(); /* 向MM发送搜网指示 */ NAS_MMC_SndMmPlmnSchInit(); } /* 当前不需要搜网或不存在信令链接 */ if ( (VOS_FALSE == ulNeedSyscfgPlmnSrch) || (VOS_FALSE == ulRrcConnExistFlag) ) { /* 获取需要设置SYSCFG的接入技术 */ enCurrRat = NAS_MMC_GetNextSettingRat_SysCfg(); NAS_MMC_SetRatModeSysCfgReq_SysCfg(enCurrRat, pstSysCfgMsg); return VOS_TRUE; } /* 当前SYSCFG设置完后需要搜网,且当前有信令链接存在,则进行如下设置 */ #if (FEATURE_ON == FEATURE_LTE) /* 取得当前的接入模式 */ enCurrRat = NAS_MML_GetCurrNetRatType(); if ( NAS_MML_NET_RAT_TYPE_LTE == enCurrRat ) { /* 当前为L模,向lmm下发链接释放请求 */ NAS_MMC_SndLmmRelReq(); NAS_MMC_SetRelRequestFlag_SysCfg(VOS_TRUE); /* 进行SYSCFG状态机的子状态的迁移:迁移到等待链接释放子状态 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_SYSCFG_STA_WAIT_EPS_CONN_REL_IND); /* 启动等待L模回复定时器 */ NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_EPS_CONN_REL_IND, TI_NAS_MMC_WAIT_EPS_CONN_REL_IND_LEN); return VOS_TRUE; } #endif /* 当前在GU模下,主动请求释放链接 */ NAS_MMC_SndMmRelReq(); NAS_MMC_SndGmmRelReq(); NAS_MMC_SetSpecPlmnSearchState(NAS_MMC_SPEC_PLMN_SEARCH_RUNNING); NAS_MMC_SetRelRequestFlag_SysCfg(VOS_TRUE); /* 进行SYSCFG状态机的子状态的迁移:迁移到等待链接释放子状态 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_SYSCFG_STA_WAIT_RRC_CONN_REL_IND); /* 启动等待回复定时器 */ NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_RRC_CONN_REL, TI_NAS_MMC_WAIT_RRC_CONN_REL_LEN); return VOS_TRUE; }