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_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; }