VOS_VOID NAS_MMC_SndLmmEquPlmn_InterSysChangeLte() { NAS_MML_EQUPLMN_INFO_STRU *pstEquPlmnInfo = VOS_NULL_PTR; NAS_MML_EQUPLMN_INFO_STRU stSndEquPlmnInfo; NAS_MML_PLMN_WITH_RAT_STRU *pstUserSpecPlmnId = VOS_NULL_PTR; VOS_UINT32 ulEplmnValidFlg; VOS_UINT32 ulRegFlag; VOS_UINT32 ulIsSimPlmnIdInDestBcchPlmnList; VOS_UINT32 ulIsBcchPlmnIdInDestSimPlmnList; PS_MEM_SET(&stSndEquPlmnInfo, 0, sizeof(NAS_MML_EQUPLMN_INFO_STRU)); pstEquPlmnInfo = NAS_MML_GetEquPlmnList(); PS_MEM_CPY(&stSndEquPlmnInfo, pstEquPlmnInfo, sizeof(NAS_MML_EQUPLMN_INFO_STRU)); pstUserSpecPlmnId = NAS_MMC_GetUserSpecPlmnId(); ulEplmnValidFlg = NAS_MML_GetEplmnValidFlg(); ulRegFlag = NAS_MMC_GetUserSpecPlmnRegisterStatus(); ulIsSimPlmnIdInDestBcchPlmnList = NAS_MML_IsSimPlmnIdInDestBcchPlmnList(&(pstUserSpecPlmnId->stPlmnId), stSndEquPlmnInfo.ucEquPlmnNum, stSndEquPlmnInfo.astEquPlmnAddr); ulIsBcchPlmnIdInDestSimPlmnList = NAS_MML_IsBcchPlmnIdInDestSimPlmnList(&(pstUserSpecPlmnId->stPlmnId), stSndEquPlmnInfo.ucEquPlmnNum, stSndEquPlmnInfo.astEquPlmnAddr); /* 手动模式下,如果用户指定的网络不在EPLMN列表中,则通知LMM当前的EPLMN信息为用户指定的网络 否则通知LMM当前EPLMN信息 */ if (NAS_MMC_PLMN_SELECTION_MODE_MANUAL == NAS_MMC_GetPlmnSelectionMode()) { if ( (VOS_FALSE == ulIsSimPlmnIdInDestBcchPlmnList) && (VOS_FALSE == ulIsBcchPlmnIdInDestSimPlmnList) ) { if ( (VOS_TRUE == ulRegFlag) /* 指定PLMN注册成功 */ && (VOS_TRUE == ulEplmnValidFlg) ) /* EPLMN 标志存在 */ { /* 将指定搜放在最后 */ stSndEquPlmnInfo.ucEquPlmnNum++; stSndEquPlmnInfo.ucEquPlmnNum = (stSndEquPlmnInfo.ucEquPlmnNum <= NAS_MML_MAX_EQUPLMN_NUM) ? stSndEquPlmnInfo.ucEquPlmnNum : NAS_MML_MAX_EQUPLMN_NUM; stSndEquPlmnInfo.astEquPlmnAddr[stSndEquPlmnInfo.ucEquPlmnNum - 1].ulMcc = pstUserSpecPlmnId->stPlmnId.ulMcc; stSndEquPlmnInfo.astEquPlmnAddr[stSndEquPlmnInfo.ucEquPlmnNum - 1].ulMnc = pstUserSpecPlmnId->stPlmnId.ulMnc; } else { /* 只准备通知用户指定的网络 */ stSndEquPlmnInfo.ucEquPlmnNum = 1; stSndEquPlmnInfo.astEquPlmnAddr[0].ulMcc = pstUserSpecPlmnId->stPlmnId.ulMcc; stSndEquPlmnInfo.astEquPlmnAddr[0].ulMnc = pstUserSpecPlmnId->stPlmnId.ulMnc; } } } NAS_MMC_BuildSndLmmEquPlmnInfo(&stSndEquPlmnInfo); NAS_MMC_SndLmmEquPlmnReq(&stSndEquPlmnInfo); NAS_MMC_SndOmEquPlmn(); return; }
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; }