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_ProcessMmcMsg( struct MsgCB *pstMsg ) { VOS_UINT32 ulEventType; VOS_UINT32 ulRslt; MSG_HEADER_STRU *pstMsgHeader; REL_TIMER_MSG *pRcvTimerMsg; NAS_UTRANCTRL_FSM_ID_ENUM_UINT32 enPreFsmId; pstMsgHeader = (MSG_HEADER_STRU *)pstMsg; /* 取得当前消息的事件类型 */ ulEventType = NAS_UTRANCTRL_GetMsgEventType(pstMsg); /* UTRANCTRL 模块的定时器需要在超时时统一停止定时器,方便勾出SDT消息 */ if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid) { pRcvTimerMsg = (REL_TIMER_MSG *)pstMsg; /* UTRANCTRL的定时器超时则这里进行停止,MMC的定时器在MMC模块停止 */ if (pRcvTimerMsg->ulName >= NAS_UTRANCTRL_TIMER_ID_START_INDEX) { NAS_UTRANCTRL_StopTimer((NAS_MMC_TIMER_ID_ENUM_UINT16)(pRcvTimerMsg->ulName)); } } #if defined(__PC_TRACE_RECUR__) /* 无条件处理回放消息 */ if (NAS_UTRANCTRL_OM_MSG_LOG_RUNNING_CONTEXT_FOR_PC_REPLAY == pstMsgHeader->ulMsgName) { NAS_UTRANCTRL_RestoreContextData_Main(ulEventType, pstMsg); return VOS_TRUE; } #endif /* 判断当前是否需要进Utran状态机处理*/ if ( VOS_FALSE == NAS_UTRANCTRL_IsNeedUtranCtrlFsmProcMsg(pstMsg)) { return VOS_FALSE; } /* 状态机处理之前,取得当前的状态机名称 */ enPreFsmId = NAS_UTRANCTRL_GetCurrFsmId(); /* 在当前状态机中处理当前消息 */ ulRslt = NAS_UTRANCTRL_ProcessMsgInFsm(ulEventType, pstMsg); /* 由空闲态转到其他状态,则需要继续处理当前消息 */ if ((NAS_UTRANCTRL_FSM_MAIN != NAS_UTRANCTRL_GetCurrFsmId()) && (NAS_UTRANCTRL_FSM_MAIN == enPreFsmId)) { /* 状态机处理之前,取得当前的状态机名称 */ enPreFsmId = NAS_UTRANCTRL_GetCurrFsmId(); ulRslt = NAS_UTRANCTRL_ProcessMsgInFsm(ulEventType, pstMsg); } /* 从其它状态机切换到IDLE状态机,清除缓存的搜网或SYSCFG请求消息 */ if ((NAS_UTRANCTRL_FSM_MAIN == NAS_UTRANCTRL_GetCurrFsmId()) && (NAS_UTRANCTRL_FSM_MAIN != enPreFsmId)) { NAS_UTRANCTRL_ClearBufferedSndUtranReqMsg(); } /* 返回消息的处理结果 */ return ulRslt; }
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; }