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_RcvRrmmPlmnSearchCnf_PlmnSelection_WaitTdPlmnSearchCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_PLMN_SEARCH_CNF_STRU *pstSrchCnfMsg = VOS_NULL_PTR; pstSrchCnfMsg = (RRMM_PLMN_SEARCH_CNF_STRU *)pstMsg; /* 停止保护定时器 */ NAS_UTRANCTRL_StopTimer(TI_NAS_UTRANCTRL_WAIT_TD_PLMN_SEARCH_CNF); /* 如果搜网成功 */ if (RRC_PLMN_SEARCH_RLT_SPEC == pstSrchCnfMsg->ulSearchRlt) { /* 状态机切换到MAIN */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MAIN); /* 进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); } /* 根据当前工作模式为FDD则需要回到W下 */ if (NAS_UTRANCTRL_UTRAN_MODE_FDD == NAS_UTRANCTRL_GetCurrUtranMode()) { /* 挂起TD */ NAS_UTRANCTRL_SndGuAsSuspendReq(TPS_PID_RRC); /* 迁移状态到等待回W时TD的挂起回复状态 */ NAS_UTRANCTRL_FSM_SetCurrState(NAS_UTRANCTRL_PLMN_SELECTION_STA_WAIT_TD_SUSPEND_CNF_BACK_W); /* 启动保护定时器 */ NAS_UTRANCTRL_StartTimer(TI_NAS_UTRANCTRL_WAIT_TD_SUSPEND_CNF, TI_NAS_UTRANCTRL_WAIT_TD_SUSPEND_CNF_LEN); /* 消息处理完成不需继续处理 */ return VOS_TRUE; } /* 状态机切换到MAIN */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MAIN); /* 消息处理完成继续进入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_RcvRrmmPlmnSearchCnf_PlmnSelection_WaitWasPlmnSearchCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_PLMN_SEARCH_CNF_STRU *pstSrchCnfMsg; pstSrchCnfMsg = (RRMM_PLMN_SEARCH_CNF_STRU *)pstMsg; /* 停止保护定时器 */ NAS_UTRANCTRL_StopTimer(TI_NAS_UTRANCTRL_WAIT_WAS_PLMN_SEARCH_CNF); /* 如果搜网成功 */ if (RRC_PLMN_SEARCH_RLT_SPEC == pstSrchCnfMsg->ulSearchRlt) { /* 状态机切换到MAIN */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MAIN); /* 进MMC状态机处理 */ return VOS_FALSE; } /* 如果搜网失败,原因为NO RF,则直接进MMC处理,设置当前为FDD模式 */ if (RRC_PLMN_SEARCH_RLT_SPEC_NO_RF == pstSrchCnfMsg->ulSearchRlt) { NAS_UTRANCTRL_SetCurrUtranMode(NAS_UTRANCTRL_UTRAN_MODE_FDD); /* 状态机切换到MAIN */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MAIN); /* 进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); } else if ((0 != pstSrchCnfMsg->PlmnIdList.ulHighPlmnNum) || (0 != pstSrchCnfMsg->PlmnIdList.ulLowPlmnNum)) { /* 未搜到中国网络并且W携带非空列表,更新工作模式为FDD */ NAS_UTRANCTRL_SetCurrUtranMode(NAS_UTRANCTRL_UTRAN_MODE_FDD); } else { /* W携带空列表不修改工作模式 */ } /* 根据当前工作模式为TDD则需要回到TD下 */ if (NAS_UTRANCTRL_UTRAN_MODE_TDD == NAS_UTRANCTRL_GetCurrUtranMode()) { NAS_UTRANCTRL_SndGuAsSuspendReq(WUEPS_PID_WRR); /* 迁移状态到等待回TD时W的挂起回复状态 */ NAS_UTRANCTRL_FSM_SetCurrState(NAS_UTRANCTRL_PLMN_SELECTION_STA_WAIT_WAS_SUSPEND_CNF_BACK_TD); /* 启动保护定时器 */ NAS_UTRANCTRL_StartTimer(TI_NAS_UTRANCTRL_WAIT_WAS_SUSPEND_CNF, TI_NAS_UTRANCTRL_WAIT_WAS_SUSPEND_CNF_LEN); /* 消息处理完成不需继续处理 */ return VOS_TRUE; } /* 状态机切换到MAIN */ NAS_UTRANCTRL_SwitchCurrFsmCtx(NAS_UTRANCTRL_FSM_MAIN); /* 消息处理完成继续进入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; }