VOS_UINT32 NAS_UTRANCTRL_RcvTdSysInfo_ModeChange_Init( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_UTRANCTRL_UTRAN_MODE_ENUM_UINT8 enCurrUtranMode; enCurrUtranMode = NAS_UTRANCTRL_GetCurrUtranMode(); /* 保持当前入口消息 */ NAS_UTRANCTRL_SaveCurEntryMsg(ulEventType, pstMsg); /* TD为主模时,将当前UtranMode通知L/G/W */ #if (FEATURE_ON == FEATURE_LTE) if (VOS_TRUE == NAS_MML_IsPlatformSupportLte()) { NAS_UTRANCTRL_SndLmmUtranModeReq(enCurrUtranMode); NAS_UTRANCTRL_SetWaitSlaveModeUtranModeCnfFlg_ModeChange(NAS_UTRANCTRL_WAIT_LMM_UTRAN_MODE_CNF); } #endif if (VOS_TRUE == NAS_MML_IsPlatformSupportGsm()) { NAS_UTRANCTRL_SndGuAsUtranModeReq(UEPS_PID_GAS, enCurrUtranMode); NAS_UTRANCTRL_SetWaitSlaveModeUtranModeCnfFlg_ModeChange(NAS_UTRANCTRL_WAIT_GAS_UTRAN_MODE_CNF); } /* 如果平台只支持W/TD中的一个,或者两者都不支持,会在NAS_UTRANCTRL_MsgProc或NAS_UTRANCTRL_ProcessMmcMsg返回VOS_FALSE 不会进到Utran的状态机里,所以此处不需要判断平台是否支持W/TD */ NAS_UTRANCTRL_SndGuAsUtranModeReq(WUEPS_PID_WRR, enCurrUtranMode); NAS_UTRANCTRL_SetWaitSlaveModeUtranModeCnfFlg_ModeChange(NAS_UTRANCTRL_WAIT_WAS_UTRAN_MODE_CNF); /*迁到等待从模回复状态 */ NAS_UTRANCTRL_FSM_SetCurrState(NAS_UTRANCTRL_MODE_CHANGE_STA_WAIT_SLAVEMODE_CNF); /*启等待从模回复定时器 */ NAS_UTRANCTRL_StartTimer(TI_NAS_UTRANCTRL_WAIT_SLAVEMODE_UTRAN_MODE_CNF, TI_NAS_UTRANCTRL_WAIT_SLAVEMODE_UTRAN_MODE_CNF_LEN); return VOS_TRUE; }
VOS_VOID NAS_MML_MsgProc( struct MsgCB *pRcvMsg ) { NAS_MML_INTERNAL_MSG_BUF_STRU *pstNextMsg = VOS_NULL_PTR; pNasMmPIdMsgProc pMsgProc = VOS_NULL_PTR; MSG_HEADER_STRU *pstMsgHeader = VOS_NULL_PTR; #ifndef __PS_WIN32_RECUR__ VOS_UINT32 ulIsSndOmPcRecurMsgValid; #endif VOS_UINT32 ulRslt; struct MsgCB *pstNextDestMsg; /* 入口参数检查 */ if ( VOS_NULL_PTR == pRcvMsg ) { NAS_ERROR_LOG(WUEPS_PID_MMC, "NAS_MML_MsgProc:Empty Msg"); return; } if (VOS_TRUE == NAS_MML_GetSvlteSupportFlag()) { NAS_MML_ConvertOamSendPid(&pRcvMsg->ulSenderPid); } pMsgProc = NAS_MML_FindPidMsgProc(pRcvMsg->ulReceiverPid); /* 未找到处理函数直接返回 */ if ( VOS_NULL_PTR == pMsgProc ) { NAS_ERROR_LOG(WUEPS_PID_MMC, "NAS_MML_MsgProc:Invalid rcv pid"); return; } /* 先处理外部消息 */ pMsgProc(pRcvMsg); /* 外部消息处理完成后处理内部消息 */ pstNextMsg = NAS_MML_GetNextInternalMsg(); while (VOS_NULL_PTR != pstNextMsg) { #if (FEATURE_ON == FEATURE_LTE) if (PS_PID_MM == pstNextMsg->ulSenderPid) { pstMsgHeader = (MSG_HEADER_STRU *)pstNextMsg; NAS_MML_LogMsgInfo(pstMsgHeader); } #endif pMsgProc = NAS_MML_FindPidMsgProc(pstNextMsg->ulReceiverPid); /* 未找到处理函数直接返回 */ if ( VOS_NULL_PTR == pMsgProc ) { NAS_ERROR_LOG(WUEPS_PID_MMC, "NAS_MML_MsgProc:Invalid rcv pid"); } #if (FEATURE_ON == FEATURE_LTE) else if ((VOS_FALSE == NAS_MML_IsPlatformSupportLte()) && (PS_PID_MM == pstNextMsg->ulReceiverPid)) { NAS_INFO_LOG(WUEPS_PID_MMC, "NAS_MML_MsgProc:Platform not support Lte"); } #endif else { /* 将该消息钩出来,以便于在PSTAS中显示 */ DIAG_TraceReport(pstNextMsg); /* 将当前消息进入UTRANCTRL模块进行处理 */ ulRslt = NAS_UTRANCTRL_MsgProc((struct MsgCB *)pstNextMsg, &pstNextDestMsg); /* 消息在UTRANCTRL模块处理完成,直接返回,不进入后续处理 */ if ( VOS_FALSE == ulRslt ) { pMsgProc((struct MsgCB *)pstNextDestMsg); } } /* 寻找下一条内部消息 */ pstNextMsg = NAS_MML_GetNextInternalMsg(); } #ifndef __PS_WIN32_RECUR__ ulIsSndOmPcRecurMsgValid = NAS_MML_IsSndOmPcRecurMsgValid(); if ( (VOS_TRUE == NAS_MML_GetUePcRecurFlg()) && (VOS_TRUE == ulIsSndOmPcRecurMsgValid)) { NAS_MML_SetUePcRecurFlg(VOS_FALSE); NAS_MMC_SndOutsideContextData(); NAS_MM_SndOutsideContextData(); NAS_GMM_SndOutsideContextData(); } #endif return; }