VOS_UINT32 NAS_UTRANCTRL_RcvTdSysInfo_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enPreUtranMode; enPreUtranMode = NAS_UTRANCTRL_GetPreUtranMode(); /* 自动模式收到TDS消息,可能是FDD 模式切换成TDD模式,需要更新当前模式 */ if (NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO == NAS_UTRANCTRL_GetCurUtranSwitchMode()) { NAS_UTRANCTRL_SetCurrUtranMode(NAS_UTRANCTRL_UTRAN_MODE_TDD); NAS_UTRANCTRL_SetSearchedSpecTdMccFlg(VOS_TRUE); } /* 模式不变不通知RRC */ if (enPreUtranMode == NAS_UTRANCTRL_GetCurrUtranMode()) { /* 消息未被处理完成需继续处理 */ return VOS_FALSE; } /* 把当前UtranMode写到NV中 */ NAS_UTRANCTRL_WriteUtranModeNvim(NAS_UTRANCTRL_UTRAN_MODE_TDD); /* 更新上次发给接入层的UtranMode */ NAS_UTRANCTRL_SetPreUtranMode(NAS_UTRANCTRL_GetCurrUtranMode()); /* 进入ModeChange状态机 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MODE_CHANGE); return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_RcvWasSysInfo_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enPreUtranMode; enPreUtranMode = NAS_UTRANCTRL_GetPreUtranMode(); /* 自动模式收到WAS消息,统一切换成FDD模式,写入NV中 */ if (NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO == NAS_UTRANCTRL_GetCurUtranSwitchMode()) { /* 更新当前的工作模式 */ NAS_UTRANCTRL_SetCurrUtranMode(NAS_UTRANCTRL_UTRAN_MODE_FDD); } /* 模式不变不通知RRC */ if (enPreUtranMode == NAS_UTRANCTRL_GetCurrUtranMode()) { /* 消息未被处理完成需继续进入MMC状态机处理 */ return VOS_FALSE; } /* 把当前UtranMode写到NV中 */ NAS_UTRANCTRL_WriteUtranModeNvim(NAS_UTRANCTRL_UTRAN_MODE_FDD); /* 更新上次发给接入层的UtranMode */ NAS_UTRANCTRL_SetPreUtranMode(NAS_UTRANCTRL_GetCurrUtranMode()); /* 进入ModeChange状态机 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MODE_CHANGE); return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_RcvGasPlmnSrchCnf_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_PLMN_SEARCH_CNF_STRU *pstSrchCnfMsg = VOS_NULL_PTR; pstSrchCnfMsg = (RRMM_PLMN_SEARCH_CNF_STRU *)pstMsg; /* 如果指定搜网成功或列表搜网时或自动切换模式标记关闭时直接返回进入MMC状态机处理 */ if ((NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO != NAS_UTRANCTRL_GetCurUtranSwitchMode()) || (RRC_PLMN_SEARCH_RLT_SPEC == pstSrchCnfMsg->ulSearchRlt) || (RRC_PLMN_SEARCH_RLT_LIST == pstSrchCnfMsg->ulSearchRlt) || (RRC_PLMN_SEARCH_RLT_LIST_REJ == pstSrchCnfMsg->ulSearchRlt) || (RRC_PLMN_SEARCH_RLT_LIST_FAIL == pstSrchCnfMsg->ulSearchRlt)) { /* 进入MMC状态机处理 */ return VOS_FALSE; } /* 根据搜网列表更新中国网络标记 */ NAS_UTRANCTRL_UpdateSearchedSpecTdMccFLg(NAS_UTRANCTRL_GetSpecTdMccListNum(), NAS_UTRANCTRL_GetSpecTdMccList(), &(pstSrchCnfMsg->PlmnIdList)); /* 根据中国网络标记设置utran工作模式 */ if (VOS_TRUE == NAS_UTRANCTRL_GetSearchedSpecTdMccFlg()) { NAS_UTRANCTRL_SetCurrUtranMode(NAS_UTRANCTRL_UTRAN_MODE_TDD); } /* 进入状态机处理 */ return VOS_FALSE; }
VOS_UINT32 NAS_UTRANCTRL_RcvWasRrMmRelInd_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { /* 如果当前UTRANCTRL模的等搜网回复时状态定时器运行,则停止定时器 */ if ( NAS_MMC_TIMER_STATUS_RUNING != NAS_UTRANCTRL_GetTimerStatus(TI_NAS_UTRANCTRL_WAIT_WAS_PLMN_SEARCH_CNF)) { /* 当前消息进入后续MMC状态机处理 */ return VOS_FALSE; } /* WAS搜网时接入层复位,搜TD模 */ NAS_UTRANCTRL_StopTimer(TI_NAS_UTRANCTRL_WAIT_WAS_PLMN_SEARCH_CNF); if ( NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO == NAS_UTRANCTRL_GetCurUtranSwitchMode() ) { /* 切换到适配模块的选网状态机进行处理 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_PLMN_SELECTION); /* 当前消息进入适配层选网状态机处理 */ return VOS_TRUE; } /* 当前消息进入后续MMC状态机处理 */ return VOS_FALSE; }
VOS_UINT32 NAS_UTRANCTRL_RcvTiWaitWasPlmnSearchCnfExpired_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_UTRANCTRL_ENTRY_MSG_STRU *pstBufferEntryMsg = VOS_NULL_PTR; NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enUtranMode; enUtranMode = NAS_UTRANCTRL_GetCurrUtranMode(); /* 获得当前缓存的缓冲区地址 */ pstBufferEntryMsg = NAS_UTRANCTRL_GetBufferUtranSndMmcMsgAddr(); /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvTiWaitWasPlmnSearchCnfExpired_Main: ENTERED"); /* CSFB标志存在时,并且当前是FDD模式,不再搜TD */ if ((VOS_TRUE == NAS_MML_IsCsfbServiceStatusExist()) && (NAS_UTRANCTRL_UTRAN_MODE_FDD == enUtranMode)) { /* 构造指定搜网回复失败消息到内存的缓存区域 */ NAS_UTRANCTRL_BuildRrMmPlmnSearchCnfFailMsg(WUEPS_PID_WRR, WUEPS_PID_MMC, (RRMM_PLMN_SEARCH_CNF_STRU *)pstBufferEntryMsg->aucEntryMsgBuffer); /* 保存构造指定搜网回复失败消息事件类型 */ pstBufferEntryMsg->ulEventType = NAS_UTRANCTRL_GetMsgEventType( (struct MsgCB *)pstBufferEntryMsg->aucEntryMsgBuffer ); /* 设置需要替换入口消息标记 */ NAS_UTRANCTRL_SetReplaceMmcMsgFlg(VOS_TRUE); /* 当前消息进入后续MMC状态机处理 */ return VOS_FALSE; } /* 如果当前为UTRAN MODE AUTO SWITCH模式,则需要启动UTRANCTRL模块的搜网状态机 */ if ( NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO == NAS_UTRANCTRL_GetCurUtranSwitchMode() ) { /* 切换到适配模块的选网状态机进行处理 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_PLMN_SELECTION); /* 进入适配层选网状态机处理 */ return VOS_TRUE; } /* 构造指定搜网回复失败消息到内存的缓存区域 */ NAS_UTRANCTRL_BuildRrMmPlmnSearchCnfFailMsg(WUEPS_PID_WRR, WUEPS_PID_MMC, (RRMM_PLMN_SEARCH_CNF_STRU *)pstBufferEntryMsg->aucEntryMsgBuffer); /* 保存构造指定搜网回复失败消息事件类型 */ pstBufferEntryMsg->ulEventType = NAS_UTRANCTRL_GetMsgEventType( (struct MsgCB *)pstBufferEntryMsg->aucEntryMsgBuffer ); /* 设置需要替换入口消息标记 */ NAS_UTRANCTRL_SetReplaceMmcMsgFlg(VOS_TRUE); /* 当前消息进入后续MMC状态机处理 */ return VOS_FALSE; }
NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 NAS_UTRANCTRL_GetCurrUtranMode(VOS_VOID) { /* !!获取当前的UTRAN模式,如果外部模块调用需要确保为驻留状态,否则可能会不准确 */ #if (FEATURE_ON == FEATURE_UE_MODE_TDS) VOS_UINT32 ulSupportFddFlg; VOS_UINT32 ulSupportTddFlg; ulSupportTddFlg = NAS_MML_IsPlatformSupportUtranTdd(); ulSupportFddFlg = NAS_MML_IsPlatformSupportUtranFdd(); #endif /* 平台对W和TD都不支持时,UtranMode为BUTT */ if (VOS_FALSE == NAS_MML_IsPlatformSupportUtran()) { return NAS_UTRANCTRL_UTRAN_MODE_BUTT; } #if (FEATURE_ON == FEATURE_UE_MODE_TDS) /* 平台接入技术能力只支持W时,UtranMode为FDD */ if (VOS_FALSE == ulSupportTddFlg) { return NAS_UTRANCTRL_UTRAN_MODE_FDD; } /* 平台接入技术能力只支持TD时,UtranMode为TDD */ if (VOS_FALSE == ulSupportFddFlg) { return NAS_UTRANCTRL_UTRAN_MODE_TDD; } if (NAS_UTRANCTRL_UTRAN_SWITCH_MODE_FDD_ONLY == NAS_UTRANCTRL_GetCurUtranSwitchMode()) { return NAS_UTRANCTRL_UTRAN_MODE_FDD; } if (NAS_UTRANCTRL_UTRAN_SWITCH_MODE_TDD_ONLY == NAS_UTRANCTRL_GetCurUtranSwitchMode()) { return NAS_UTRANCTRL_UTRAN_MODE_TDD; } return NAS_UTRANCTRL_GetUtranCtrlCtx()->stMsCfgInfo.stCustomCfg.enCurrUtranMode; #else return NAS_UTRANCTRL_UTRAN_MODE_FDD; #endif }
VOS_UINT32 NAS_UTRANCTRL_RcvLmmSysInfo_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { LMM_MMC_SYS_INFO_IND_STRU *pstLmmSysInfoMsg; NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enPreUtranMode; NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enCurrUtranMode; MMC_LMM_PLMN_ID_STRU stLmmPlmn; NAS_MML_PLMN_ID_STRU stGUNasPlmn; pstLmmSysInfoMsg = (LMM_MMC_SYS_INFO_IND_STRU*)pstMsg; enPreUtranMode = NAS_UTRANCTRL_GetPreUtranMode(); stLmmPlmn = (pstLmmSysInfoMsg->stLteSysInfo.stSpecPlmnIdList.astSuitPlmnList[0]); /* 把LMM的PLMN转换成GU NAS的PLMN格式 */ NAS_MMC_ConvertLmmPlmnToGUNasFormat(&stLmmPlmn, &stGUNasPlmn); /* 自动模式收到GAS消息,需要更新当前模式 */ if (NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO == NAS_UTRANCTRL_GetCurUtranSwitchMode()) { /* 如果当前的MCC不在TD的PLMN LIST列表中,UTRAN MODE为FDD */ if (VOS_FALSE == NAS_MML_IsMccInDestMccList(stGUNasPlmn.ulMcc, NAS_UTRANCTRL_GetSpecTdMccListNum(), NAS_UTRANCTRL_GetSpecTdMccList())) { enCurrUtranMode = NAS_UTRANCTRL_UTRAN_MODE_FDD; } else { enCurrUtranMode = NAS_UTRANCTRL_UTRAN_MODE_TDD; NAS_UTRANCTRL_SetSearchedSpecTdMccFlg(VOS_TRUE); } NAS_UTRANCTRL_SetCurrUtranMode(enCurrUtranMode); } /* 模式不变不通知RRC */ if (enPreUtranMode == NAS_UTRANCTRL_GetCurrUtranMode()) { /* 消息未被处理完成需继续处理 */ return VOS_FALSE; } /* 把当前UtranMode写到NV中 */ NAS_UTRANCTRL_WriteUtranModeNvim(NAS_UTRANCTRL_GetCurrUtranMode()); /* 更新上次发给接入层的UtranMode */ NAS_UTRANCTRL_SetPreUtranMode(NAS_UTRANCTRL_GetCurrUtranMode()); /* 进入ModeChange状态机 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MODE_CHANGE); return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_RcvGasSysInfo_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { GRRMM_SYS_INFO_IND_ST *pstGrrSysInfo; NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enPreUtranMode; NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enCurrUtranMode; pstGrrSysInfo = (GRRMM_SYS_INFO_IND_ST *)pstMsg; enPreUtranMode = NAS_UTRANCTRL_GetPreUtranMode(); /* 自动模式收到GAS消息,解析系统消息中的MCC,更新当前模式并写NV */ if (NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO == NAS_UTRANCTRL_GetCurUtranSwitchMode()) { /* 如果当前的MCC不在TD的PLMN LIST列表中,UTRAN MODE为FDD */ if (VOS_FALSE == NAS_MML_IsMccInDestMccList(pstGrrSysInfo->PlmnId.ulMcc, NAS_UTRANCTRL_GetSpecTdMccListNum(), NAS_UTRANCTRL_GetSpecTdMccList())) { enCurrUtranMode = NAS_UTRANCTRL_UTRAN_MODE_FDD; } else { enCurrUtranMode = NAS_UTRANCTRL_UTRAN_MODE_TDD; NAS_UTRANCTRL_SetSearchedSpecTdMccFlg(VOS_TRUE); } NAS_UTRANCTRL_SetCurrUtranMode(enCurrUtranMode); } /* 模式不变不通知RRC */ if (enPreUtranMode == NAS_UTRANCTRL_GetCurrUtranMode()) { /* 消息未被处理完成需继续进入MMC状态机处理 */ return VOS_FALSE; } /* 把当前UtranMode写到NV中 */ NAS_UTRANCTRL_WriteUtranModeNvim(NAS_UTRANCTRL_GetCurrUtranMode()); /* 更新上次发给接入层的UtranMode */ NAS_UTRANCTRL_SetPreUtranMode(NAS_UTRANCTRL_GetCurrUtranMode()); /* 进入ModeChange状态机 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MODE_CHANGE); return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_RcvPlmnSpecialReq_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { if (NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO == NAS_UTRANCTRL_GetCurUtranSwitchMode()) { NAS_UTRANCTRL_SetSearchedSpecTdMccFlg(VOS_FALSE); } NAS_UTRANCTRL_SetSwithOnPlmnSearchFlag(VOS_FALSE); /* 消息未被处理完成需继续处理 */ return VOS_FALSE; }
VOS_UINT32 NAS_UTRANCTRL_RcvMmcInterSearchReq_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { if (NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO == NAS_UTRANCTRL_GetCurUtranSwitchMode()) { NAS_UTRANCTRL_SetSearchedSpecTdMccFlg(VOS_FALSE); } NAS_UTRANCTRL_SetSwithOnPlmnSearchFlag(VOS_FALSE); /* 当前消息进入后续MMC状态机处理 */ return VOS_FALSE; }
VOS_UINT32 NAS_UTRANCTRL_RcvRcvLmmPlmnSrchCnf_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { LMM_MMC_PLMN_SRCH_CNF_STRU *pstLmmSrchCnfMsg; RRC_PLMN_ID_LIST_STRU *pstGuPlmnIdList; pstLmmSrchCnfMsg = (LMM_MMC_PLMN_SRCH_CNF_STRU*)pstMsg; /* 如果指定搜网成功或列表搜网时或自动切换模式标记关闭时直接返回进入MMC状态机处理 */ if ((NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO != NAS_UTRANCTRL_GetCurUtranSwitchMode()) || (MMC_LMM_PLMN_SRCH_RLT_SPEC_SUCC == pstLmmSrchCnfMsg->enRlst) || (MMC_LMM_PLMN_SRCH_RLT_LIST_SUCC == pstLmmSrchCnfMsg->enRlst) || (MMC_LMM_PLMN_SRCH_RLT_LIST_REJ == pstLmmSrchCnfMsg->enRlst)) { /* 进入MMC状态机处理 */ return VOS_FALSE; } pstGuPlmnIdList = (RRC_PLMN_ID_LIST_STRU*)PS_MEM_ALLOC(WUEPS_PID_MMC, sizeof(RRC_PLMN_ID_LIST_STRU)); if (VOS_NULL_PTR == pstGuPlmnIdList) { NAS_ERROR_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_RcvRcvLmmPlmnSrchCnf_Main:Invalid pstGuPlmnIdList"); return VOS_FALSE; } /*转换L格式的搜索列表成为GU格式的*/ NAS_MMC_ConvertLmmPlmnIdListToGUFormat_PlmnList(&(pstLmmSrchCnfMsg->stPlmnIdList), pstGuPlmnIdList); /* 根据搜网列表更新中国网络标记 */ NAS_UTRANCTRL_UpdateSearchedSpecTdMccFLg(NAS_UTRANCTRL_GetSpecTdMccListNum(), NAS_UTRANCTRL_GetSpecTdMccList(), pstGuPlmnIdList); /* 根据中国网络标记设置utran工作模式 */ if (VOS_TRUE == NAS_UTRANCTRL_GetSearchedSpecTdMccFlg()) { NAS_UTRANCTRL_SetCurrUtranMode(NAS_UTRANCTRL_UTRAN_MODE_TDD); } PS_MEM_FREE(WUEPS_PID_MMC, pstGuPlmnIdList); /* 进入MMC状态机处理 */ return VOS_FALSE; }
VOS_UINT32 NAS_UTRANCTRL_RcvWasPlmnSrchCnf_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_PLMN_SEARCH_CNF_STRU *pstSrchCnfMsg; NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enUtranMode; VOS_UINT32 ulExistHongKongMcc; NAS_MMC_DPLMN_NPLMN_CFG_INFO_STRU *pstDPlmnNPlmnInfo = VOS_NULL_PTR; VOS_UINT8 ucSwitchOnPlmnSearchFlag; ulExistHongKongMcc = VOS_FALSE; pstDPlmnNPlmnInfo = NAS_MMC_GetDPlmnNPlmnCfgInfo(); ucSwitchOnPlmnSearchFlag = NAS_UTRANCTRL_GetSwithOnPlmnSearchFlag(); enUtranMode = NAS_UTRANCTRL_GetCurrUtranMode(); pstSrchCnfMsg = (RRMM_PLMN_SEARCH_CNF_STRU *)pstMsg; /* 如果是LIST搜网的结果回复则直接透传到MMC状态机处理 */ /* 降圈复杂度 */ if (VOS_TRUE == NAS_MML_IsPlmnListSrchRslt(pstSrchCnfMsg->ulSearchRlt)) { /* 进入MMC状态机处理 */ return VOS_FALSE; } /* 如果当前UTRANCTRL模的等指定搜网回复时状态定时器运行则停止定时器 */ if (NAS_MMC_TIMER_STATUS_RUNING == NAS_UTRANCTRL_GetTimerStatus(TI_NAS_UTRANCTRL_WAIT_WAS_PLMN_SEARCH_CNF)) { NAS_UTRANCTRL_StopTimer(TI_NAS_UTRANCTRL_WAIT_WAS_PLMN_SEARCH_CNF); } /* 非自动切换模式,消息直接透传到MMC状态机处理 */ if (NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO != NAS_UTRANCTRL_GetCurUtranSwitchMode()) { /* 清除缓存的搜网请求消息 */ NAS_UTRANCTRL_ClearBufferedSndUtranReqMsg(); /* 进入MMC状态机处理 */ return VOS_FALSE; } /* 自动切换模式下如果是搜网失败NORF/快速指定搜网或指定搜网成功直接透传快速指定搜网回复到MMC状态机处理 */ if ((RRC_PLMN_SEARCH_SPEC_FAST == NAS_UTRANCTRL_GetBufferedPlmnSearchReqType()) || (RRC_PLMN_SEARCH_RLT_SPEC == pstSrchCnfMsg->ulSearchRlt) || (RRC_PLMN_SEARCH_RLT_SPEC_NO_RF == pstSrchCnfMsg->ulSearchRlt)) { /* 清除缓存的搜网请求消息 */ NAS_UTRANCTRL_ClearBufferedSndUtranReqMsg(); /* 进入MMC状态机处理 */ return VOS_FALSE; } /* 自动切换模式下,CSFB标志存在时,并且当前是FDD模式,不再搜TD */ if ((VOS_TRUE == NAS_MML_IsCsfbServiceStatusExist()) && (NAS_UTRANCTRL_UTRAN_MODE_FDD == enUtranMode)) { /* 清除缓存的搜网请求消息 */ NAS_UTRANCTRL_ClearBufferedSndUtranReqMsg(); /* 进入MMC状态机处理 */ return VOS_FALSE; } /* 指定搜网失败根据搜网列表更新中国网络标记 */ NAS_UTRANCTRL_UpdateSearchedSpecTdMccFLg(NAS_UTRANCTRL_GetSpecTdMccListNum(), NAS_UTRANCTRL_GetSpecTdMccList(), &(pstSrchCnfMsg->PlmnIdList)); /* 根据中国网络标记设置utran工作模式 */ if (VOS_TRUE == NAS_UTRANCTRL_GetSearchedSpecTdMccFlg()) { NAS_UTRANCTRL_SetCurrUtranMode(NAS_UTRANCTRL_UTRAN_MODE_TDD); } ulExistHongKongMcc = NAS_UTRANCTRL_IsSpecPlmnMccInGuRrcPlmnIdList(NAS_UTRANCTRL_HONGKONG_MCC, &(pstSrchCnfMsg->PlmnIdList)); if ((NAS_UTRANCTRL_UTRAN_MODE_FDD == NAS_UTRANCTRL_GetCurrUtranMode()) && (VOS_FALSE == ulExistHongKongMcc) && (VOS_TRUE == pstDPlmnNPlmnInfo->ucActiveFlg) && (VOS_TRUE == ucSwitchOnPlmnSearchFlag) && ((pstSrchCnfMsg->PlmnIdList.ulHighPlmnNum != 0) || (pstSrchCnfMsg->PlmnIdList.ulLowPlmnNum != 0))) { /* 开机搜网场景,如果was搜网结果中没有一个网络mcc在tds mcc列表中且不包括香港网络,且高低质量网络个数不全为0, 则跳过tds搜网,清除缓存*/ NAS_UTRANCTRL_ClearBufferedSndUtranReqMsg(); /* 进入MMC状态机处理 */ return VOS_FALSE; } /* 切换到适配模块的选网状态机进行处理 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_PLMN_SELECTION); /* was的搜网回复消息在适配模块的选网状态机进行处理 */ return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_RcvTdPlmnSrchCnf_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_PLMN_SEARCH_CNF_STRU *pstSrchCnfMsg = VOS_NULL_PTR; VOS_UINT32 ulIsOtherModemPlmnInTdMccList; NAS_MML_PLMN_ID_STRU *pstOtherModemPlmnId = VOS_NULL_PTR; NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enUtranMode; enUtranMode = NAS_UTRANCTRL_GetCurrUtranMode(); pstSrchCnfMsg = (RRMM_PLMN_SEARCH_CNF_STRU *)pstMsg; /* 如果是LIST搜网的结果回复则直接透传到MMC状态机处理 */ /* 降圈复杂度 */ if (VOS_TRUE == NAS_MML_IsPlmnListSrchRslt(pstSrchCnfMsg->ulSearchRlt)) { /* 进入MMC状态机处理 */ return VOS_FALSE; } /* 如果当前UTRANCTRL模的等指定搜网回复时状态定时器运行则停止定时器 */ if (NAS_MMC_TIMER_STATUS_RUNING == NAS_UTRANCTRL_GetTimerStatus(TI_NAS_UTRANCTRL_WAIT_TD_PLMN_SEARCH_CNF)) { NAS_UTRANCTRL_StopTimer(TI_NAS_UTRANCTRL_WAIT_TD_PLMN_SEARCH_CNF); } /* 非自动切换模式,消息直接透传到MMC状态机处理 */ if (NAS_UTRANCTRL_UTRAN_SWITCH_MODE_AUTO != NAS_UTRANCTRL_GetCurUtranSwitchMode()) { /* 清除缓存的搜网请求消息 */ NAS_UTRANCTRL_ClearBufferedSndUtranReqMsg(); /* 进入MMC状态机处理 */ return VOS_FALSE; } /* 自动切换模式下如果是快速指定搜网或指定搜网成功直接透传快速指定搜网回复到MMC状态机处理 */ if ((RRC_PLMN_SEARCH_SPEC_FAST == NAS_UTRANCTRL_GetBufferedPlmnSearchReqType()) || (RRC_PLMN_SEARCH_RLT_SPEC == pstSrchCnfMsg->ulSearchRlt)) { /* 清除缓存的搜网请求消息 */ NAS_UTRANCTRL_ClearBufferedSndUtranReqMsg(); /* 进入MMC状态机处理 */ return VOS_FALSE; } /* 自动切换模式下,CSFB标志存在时,并且当前是FDD模式,不再搜TD */ if ((VOS_TRUE == NAS_MML_IsCsfbServiceStatusExist()) && (NAS_UTRANCTRL_UTRAN_MODE_TDD == enUtranMode)) { /* 清除缓存的搜网请求消息 */ NAS_UTRANCTRL_ClearBufferedSndUtranReqMsg(); /* 进入MMC状态机处理 */ return VOS_FALSE; } /* 根据搜网列表更新中国网络标记 */ NAS_UTRANCTRL_UpdateSearchedSpecTdMccFLg(NAS_UTRANCTRL_GetSpecTdMccListNum(), NAS_UTRANCTRL_GetSpecTdMccList(), &(pstSrchCnfMsg->PlmnIdList)); /* 根据中国网络标记设置utran工作模式 */ if (VOS_TRUE == NAS_UTRANCTRL_GetSearchedSpecTdMccFlg()) { NAS_UTRANCTRL_SetCurrUtranMode(NAS_UTRANCTRL_UTRAN_MODE_TDD); /* 进入MMC状态机处理 */ return VOS_FALSE; } pstOtherModemPlmnId = NAS_MMC_GetOtherModemPlmnId(); ulIsOtherModemPlmnInTdMccList = NAS_MML_IsMccInDestMccList(pstOtherModemPlmnId->ulMcc, NAS_UTRANCTRL_GetSpecTdMccListNum(), NAS_UTRANCTRL_GetSpecTdMccList()); if ((VOS_TRUE == NAS_MMC_GetUtranSkipWPlmnSearchFlag()) && (VOS_TRUE == ulIsOtherModemPlmnInTdMccList)) { /* 如果副卡已驻留中国网络跳过搜w网络,清除缓存的搜网请求消息 */ NAS_UTRANCTRL_ClearBufferedSndUtranReqMsg(); /* 进入MMC状态机处理 */ return VOS_FALSE; } /* 切换到适配模块的选网状态机进行处理 */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_PLMN_SELECTION); /* tdrrc的搜网回复消息在适配模块的选网状态机进行处理 */ return VOS_TRUE; }