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_UINT32 NAS_MMC_RcvRrMmRelInd_SysCfg_WaitRrcConnRelInd( 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; VOS_UINT32 ulRrcConnExistFlag; /* 获取SYSCFG状态机的入口消息信息 */ pstEntryMsg = NAS_MMC_GetCurrEntryMsg(); pstSysCfgMsg = (MMA_MMC_SYS_CFG_SET_REQ_STRU*)(pstEntryMsg->aucEntryMsgBuffer); /* 判断信令链接是否已经完成释放 */ ulRrcConnExistFlag = NAS_MML_IsRrcConnExist(); if ( VOS_TRUE == ulRrcConnExistFlag ) { /* 信令链接未释放完成,继续等待信令链接释放消息 */ return VOS_TRUE; } /* 信令链接完成释放,停定时器 */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_RRC_CONN_REL); /* 取得目标模的接入技术,并发送SYSCFG请求 */ enNextRat = NAS_MMC_GetNextSettingRat_SysCfg(); NAS_MMC_SetRatModeSysCfgReq_SysCfg(enNextRat, pstSysCfgMsg); return VOS_TRUE; }
VOS_VOID NAS_MMC_SndResumeRsp( NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enRat ) { switch(enRat) { case NAS_MML_NET_RAT_TYPE_WCDMA: /* 发送RRMM_RESUME_RSP */ NAS_MMC_SndAsResumeRsp(WUEPS_PID_WRR); #if (FEATURE_ON == FEATURE_LTE) /* 通知LMM恢复结果 */ if (NAS_MML_NET_RAT_TYPE_LTE == NAS_MMC_GetSuspendOrigenRatType(NAS_MMC_GetCurrEntryMsg())) { NAS_MMC_SndLmmResumeNotify(); } #endif break; case NAS_MML_NET_RAT_TYPE_GSM: NAS_MMC_SndAsResumeRsp(UEPS_PID_GAS); #if (FEATURE_ON == FEATURE_LTE) if (NAS_MML_NET_RAT_TYPE_LTE == NAS_MMC_GetSuspendOrigenRatType(NAS_MMC_GetCurrEntryMsg())) { NAS_MMC_SndLmmResumeNotify(); } #endif break; #if (FEATURE_ON == FEATURE_LTE) case NAS_MML_NET_RAT_TYPE_LTE: break; #endif default: NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_SndResumeRsp:Unexpected Rat Type!"); break; } return; }
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_ProcResumeRspFromLteToHrpd_InterSysCellResel(VOS_VOID) { #if ((FEATURE_ON == FEATURE_CL_INTERWORK) || ((FEATURE_ON == FEATURE_UE_MODE_CDMA) && (FEATURE_ON == FEATURE_LTE))) if (MMC_RESUME_ORIGEN_HRPD == NAS_MMC_GetResumeOrign_InterSysCellResel()) { /* 通知LMM当前已经恢复 */ NAS_MMC_SndLmmResumeNotify(); /* 发送状态机成功的结果 */ #if (FEATURE_ON == FEATURE_CL_INTERWORK) NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_CELLRESELECT, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); #endif #if ((FEATURE_ON == FEATURE_UE_MODE_CDMA) && (FEATURE_ON == FEATURE_LTE)) if (MMC_SUSPEND_CAUSE_CELLRESELECT == NAS_MMC_GetSuspendCause(NAS_MMC_GetCurrEntryMsg())) { NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_CELLRESELECT, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); } else /* 非重选,即重定向 */ { NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_REDIRECTION, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); } #endif /* 退出当前状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; } else #endif { return VOS_FALSE; } }
VOS_UINT32 NAS_MMC_RcvLmmMmcStatusInd_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; LMM_MMC_STATUS_IND_STRU *pstLmmStatusIndMsg = VOS_NULL_PTR; NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enNextRat; pstLmmStatusIndMsg = (LMM_MMC_STATUS_IND_STRU*)pstMsg; /* 获取SYSCFG状态机的入口消息信息 */ pstEntryMsg = NAS_MMC_GetCurrEntryMsg(); pstSysCfgMsg = (MMA_MMC_SYS_CFG_SET_REQ_STRU*)(pstEntryMsg->aucEntryMsgBuffer); if ( VOS_FALSE == pstLmmStatusIndMsg->bitOpConnState) { NAS_NORMAL_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvLmmMmcStatusInd_SysCfg_WaitEpsConnRelInd:bitOpConnState IS VOS_FALSE"); return VOS_TRUE; } /* 更新LMM的链接状态 */ switch (pstLmmStatusIndMsg->ulConnState) { case MMC_LMM_CONN_ESTING: case MMC_LMM_CONNECTED_SIG: NAS_MML_SetEpsSigConnStatusFlg(VOS_TRUE); NAS_MML_SetEpsServiceConnStatusFlg(VOS_FALSE); break; case MMC_LMM_CONNECTED_DATA: NAS_MML_SetEpsServiceConnStatusFlg(VOS_TRUE); break; case MMC_LMM_CONN_IDLE: NAS_MML_SetEpsSigConnStatusFlg(VOS_FALSE); NAS_MML_SetEpsServiceConnStatusFlg(VOS_FALSE); break; default: break; } /* 如果存在信令连接,则继续等待 */ if (VOS_TRUE == NAS_MML_IsRrcConnExist()) { return VOS_TRUE; } /* 停止等待链接释放定时器 */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_EPS_CONN_REL_IND); /* 取得目标模的接入技术,并发送SYSCFG请求 */ enNextRat = NAS_MMC_GetNextSettingRat_SysCfg(); NAS_MMC_SetRatModeSysCfgReq_SysCfg(enNextRat, pstSysCfgMsg); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvLmmSysCfgCnf_SysCfg_WaitLmmSysCfgCnf( 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; LMM_MMC_SYS_CFG_CNF_STRU *pstSysCfgCnf = VOS_NULL_PTR; NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enNextRat; VOS_UINT32 ulNeedSyscfgPlmnSrch; NAS_MML_PLMN_RAT_PRIO_STRU *pstPrePrioRatList; /* 停止等待LMM的SYSCFG回复定时器 */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_LMM_SYSCFG_CNF); /* 若syscfg设置失败,进行错误打印,退出SYSCFG状态机 */ pstSysCfgCnf = (LMM_MMC_SYS_CFG_CNF_STRU *)pstMsg; if ( MMC_LMM_FAIL == pstSysCfgCnf->ulRst) { NAS_ERROR_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvLmmSysCfgCnf_SysCfg_WaitLmmSysCfgCnf:ERROR:SYSCFG SET FAIL!"); /* 向MMA回复SYSCFG设置失败消息 */ NAS_MMC_SndMmaSysCfgCnf(MMA_MMC_SYS_CFG_SET_FAILURE_OTHER); /* syscfg设置失败需要恢复之前的接入技术和优先级 */ pstPrePrioRatList = NAS_MMC_GetPrePrioRatList_SysCfg(); NAS_MML_SetMsSysCfgPrioRatList(pstPrePrioRatList); /* 通知上层状态机SYSCFG状态机运行结果,syscfg设置失败,不需要搜网 */ NAS_MMC_SndSysCfgRslt(VOS_FALSE, VOS_FALSE); /* 退出SYSCFG状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; } /* 获取syscfg状态机入口消息信息 */ pstEntryMsg = NAS_MMC_GetCurrEntryMsg(); pstSysCfgMsg = (MMA_MMC_SYS_CFG_SET_REQ_STRU *)(pstEntryMsg->aucEntryMsgBuffer); /* 未完成SYSCFG的所有模式设置,向接入模发送SYSCFG设置请求 */ enNextRat = NAS_MMC_GetNextSettingRat_SysCfg(); if (NAS_MML_NET_RAT_TYPE_BUTT != enNextRat) { NAS_MMC_SetRatModeSysCfgReq_SysCfg(enNextRat, pstSysCfgMsg); return VOS_TRUE; } /* 完成了所有模式的SYSCFG设置,保存SYSCFG设置内容信息 */ NAS_MMC_SaveUserSyscfgInfo_SysCfg(pstSysCfgMsg); /* SYSCFG设置完成后,进行小区信息的更新 */ NAS_MMC_UpdateCellInfo_SysCfg(); /* 向MMA回复SYSCFG设置成功原语 */ NAS_MMC_SndMmaSysCfgCnf(MMA_MMC_SYS_CFG_SET_SUCCESS); /* 若需要发起搜网,发出由SYSCFG引起的内部搜网信息 */ ulNeedSyscfgPlmnSrch = NAS_MMC_GetPlmnSearchFlag_SysCfg(); /* 通知上层状态机SYSCFG状态机运行结果,syscfg设置成功 */ NAS_MMC_SndSysCfgRslt(VOS_TRUE, ulNeedSyscfgPlmnSrch); /* 退出SYSCFG状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; }