VOS_UINT8 NAS_MM_IsNeedDiscardMmcMmSysInfoInd( VOS_VOID ) { /* MM在TC状态不处理来自MMC的系统消息。 GMM中在Gmm_MsgDistribute_GMM_TC_ACTIVE 中已做了限制 */ if (TEST_CONTROL_ACTIVE == g_MmGlobalInfo.ucState) { return VOS_TRUE; } /* 通话和等待建链过程,不处理系统消息,转发后丢弃,等待新的系统消息 */ if (NAS_MML_NET_RAT_TYPE_GSM == NAS_MML_GetCurrNetRatType()) { if ((WAIT_FOR_OUTGOING_MM_CONNECTION == g_MmGlobalInfo.ucState) || (WAIT_FOR_ADDITIONAL_OUTGOING_MM_CONNECTION == g_MmGlobalInfo.ucState) || (MM_CONNECTION_ACTIVE == g_MmGlobalInfo.ucState)) { if ( MM_TIMER_RUNNING == NAS_MM_QryTimerStatus(MM_TIMER_CS_HO_WAIT_SYSINFO) ) { Mm_TimerStop(MM_TIMER_CS_HO_WAIT_SYSINFO); /* 通知MMC HO SUCC */ NAS_MM_SndMmcCsRegResultInd(MM_MMC_LU_PROC_FALSE, MM_MMC_LU_RESULT_SUCCESS, NAS_MML_REG_FAIL_CAUSE_HO_SUCC); } return VOS_TRUE; } } return VOS_FALSE; }
VOS_UINT8 NAS_MM_RcvMmcMmSysInfoInd_PreProc( VOS_VOID *pRcvMsg ) { VOS_UINT8 ucEventID; ucEventID = 5; NAS_MM_LogMmCtxInfo(); /* 停MM_TIMER_HO_WAIT_SYSINFO或MM_TIMER_EMERGENCY_CSFB_HO_WAIT_SYSINFO的处理与原来相同: 只有在CSFB标志存在时,才停定时器. 如果需要做LAU,等待LAU结果;如果不需要做LAU, MM报注册假流程 其他情况下不停定时器,等定时器超时 */ if ( MM_TIMER_RUNNING == NAS_MM_QryTimerStatus(MM_TIMER_CS_HO_WAIT_SYSINFO) ) { Mm_TimerStop(MM_TIMER_CS_HO_WAIT_SYSINFO); /* 通知MMC HO SUCC */ NAS_MM_SndMmcCsRegResultInd(MM_MMC_LU_PROC_FALSE, MM_MMC_LU_RESULT_SUCCESS, NAS_MML_REG_FAIL_CAUSE_HO_SUCC); } /* 是否需要忽略系统消息 */ if (VOS_TRUE == NAS_MM_IsNeedDiscardMmcMmSysInfoInd()) { return MM_EVENT_ID_INVALID; } /* 检查系统消息的合法性 */ if (VOS_FALSE == NAS_MM_CheckMmcMmSysInfoIE(pRcvMsg)) { return MM_EVENT_ID_INVALID; } if (NAS_MML_NET_RAT_TYPE_GSM == NAS_MML_GetCurrNetRatType()) { NAS_MM_UpdateNetworkInfo_GasSysInfo(pRcvMsg); } else { NAS_MM_UpdateNetworkInfo_WasSysInfo(pRcvMsg); } if (VOS_TRUE == NAS_MM_IsCsNotSupport(pRcvMsg)) { NAS_MM_ProcMmcMmSysInfoInd_CsNotSupport_PreProc(); return MM_EVENT_ID_INVALID; } if (VOS_FALSE == NAS_MML_GetSimCsRegStatus()) { NAS_MM_ProcMmcMmSysInfoInd_NoImsi_PreProc(); return MM_EVENT_ID_INVALID; } return ucEventID; }
VOS_VOID MM_DelayCsServiceGsmTimeout() { NAS_LOG(WUEPS_PID_MM, MM_GSMDIFMSG, PS_PRINT_INFO, "MM_DelayCsServiceGsmTimeout: INFO: Timer MM_TIMER_DELAY_CS_SERVICE_GSM expire!"); Mm_TimerStop(MM_TIMER_DELAY_CS_SERVICE_GSM); if (MM_IDLE_NORMAL_SERVICE == g_MmGlobalInfo.ucState) { Mm_ComCheckDelayMmConn( MM_TRUE ); } return; }
VOS_VOID MM_DelayLuGsmTimeout() { NAS_LOG(WUEPS_PID_MM, MM_GSMDIFMSG, PS_PRINT_INFO, "MM_DelayLuGsmTimeout: INFO: Timer MM_TIMER_DELAY_LU_GSM expire!"); Mm_TimerStop(MM_TIMER_DELAY_LU_GSM); if ((LOCATION_UPDATING_PENDING == g_MmGlobalInfo.ucState) || (MM_IDLE_ATTEMPTING_TO_UPDATE == g_MmGlobalInfo.ucState)) { Mm_ComLuOnly(); } return; }
VOS_UINT8 NAS_MM_RcvMmcCoverageLostInd_PreProc( VOS_VOID *pRcvMsg ) { VOS_UINT8 ucEventID; ucEventID = 21; /* 停MM_TIMER_NORMAL_CSFB_HO_WAIT_SYSINFO或MM_TIMER_EMERGENCY_CSFB_HO_WAIT_SYSINFO的处理与原来相同: 只有在CSFB标志存在时,才停定时器. 如果需要做LAU,等待LAU结果;如果不需要做LAU, MM报注册假流程 其他情况下不停定时器,等定时器超时 */ if ( MM_TIMER_RUNNING == NAS_MM_QryTimerStatus(MM_TIMER_CS_HO_WAIT_SYSINFO) ) { Mm_TimerStop(MM_TIMER_CS_HO_WAIT_SYSINFO); } return ucEventID; }
VOS_UINT8 Mm_Timer_Event_Analy(VOS_UINT32 *aulRcvMsg) { VOS_UINT8 ucEventId = MM_EVENT_ID_INVALID; VOS_UINT8 ucTimerId; PS_LOG1(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: TimerExpired: ", (VOS_UINT8)aulRcvMsg[1]); if (MM_TIMER_PROTECT_SUSPEND != aulRcvMsg[1]) { ucTimerId = (VOS_UINT8)aulRcvMsg[1]; if (ucTimerId >= MM_TIMER_NUM) { PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_WARNING, "Mm_Timer_Event_Analy:WARNING: TIMER ID is illegal."); return ucEventId; } if (MM_TIMER_STOP == gstMmTimer[ucTimerId].ucTimerStatus) { PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_WARNING, "Mm_Timer_Event_Analy:WARNING: The TIMER has been stopped."); if( VOS_ERRNO_RELTM_STOP_TIMERINVALID == Mm_StopRelTimer(WUEPS_PID_MM, ucTimerId, &gstMmTimer[ucTimerId].hTimer)) { /* 停止失败:已经停止或Timer不存在 */ PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_WARNING, "Mm_Timer_Event_Analy:WARNING: TIMER STOP FAILURE!"); } return ucEventId; } else { Mm_TimerStop( (VOS_UINT8)aulRcvMsg[1] ); } } NAS_TIMER_EventReport(aulRcvMsg[1], WUEPS_PID_MM, NAS_OM_EVENT_TIMER_OPERATION_EXPIRED); switch ( aulRcvMsg[1] ) { case MM_TIMER_T3210: ucEventId = 51; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM T3210 TIME OUT"); break; case MM_TIMER_T3211: ucEventId = 52; g_T3211Flag = 0; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM T3211 TIME OUT"); break; case MM_TIMER_T3212: ucEventId = 53; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM T3212 TIME OUT"); break; case MM_TIMER_T3213: ucEventId = 54; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM T3213 TIME OUT"); break; case MM_TIMER_T3214: ucEventId = 55; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM T3214 TIME OUT"); break; case MM_TIMER_T3216: ucEventId = 56; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM T3216 TIME OUT"); break; case MM_TIMER_T3218: ucEventId = 57; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM T3218 TIME OUT"); break; case MM_TIMER_T3220: ucEventId = 58; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM T3220 TIME OUT"); break; case MM_TIMER_T3230: ucEventId = 59; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM T3230 TIME OUT"); break; case MM_TIMER_T3240: ucEventId = 60; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM T3240 TIME OUT"); break; case MM_TIMER_PROTECT_AGENT: ucEventId = 75; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM_TIMER_PROTECT_AGENT TIME OUT"); break; case MM_TIMER_PROTECT_DETACH: ucEventId = 76; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM_TIMER_PROTECT_DETACH TIME OUT"); break; case MM_TIMER_PROTECT_SIGNALLING: ucEventId = 77; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM_TIMER_PROTECT_SIGNALLING TIME OUT"); break; case MM_TIMER_PROTECT_CC: ucEventId = 79; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM_TIMER_PROTECT_CC TIME OUT"); break; case MM_TIMER_PROTECT_CCBS: ucEventId = 82; PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "Mm_Timer_Event_Analy:INFO: MM_TIMER_PROTECT_CCBS TIME OUT"); break; case MM_TIMER_PROTECT_SUSPEND: /* 调用保护定时器的超时处理 */ MM_SuspendTimeout(); ucEventId = MM_EVENT_ID_INVALID; break; case MM_TIMER_DELAY_LU_GSM: MM_DelayLuGsmTimeout(); ucEventId = MM_EVENT_ID_INVALID; break; case MM_TIMER_DELAY_CS_SERVICE_GSM: MM_DelayCsServiceGsmTimeout(); ucEventId = MM_EVENT_ID_INVALID; break; case MM_TIMER_WAIT_CONNECT_REL: NAS_MM_WaitConnectRelTimeOut(); ucEventId = MM_EVENT_ID_INVALID; break; case MM_TIMER_NORMAL_CSFB_HO_WAIT_SYSINFO: NAS_MM_NormalCsfbHoWaitSysinfoTimeOut(); ucEventId = MM_EVENT_ID_INVALID; break; case MM_TIMER_EMERGENCY_CSFB_HO_WAIT_SYSINFO: #if (FEATURE_ON == FEATURE_LTE) NAS_MM_EmergencyCallCsfbWaitHoSysInfoTimeOut(); #endif ucEventId = MM_EVENT_ID_INVALID; break; case MM_TIMER_CS_HO_WAIT_SYSINFO: NAS_MM_CsHoWaitSysinfoTimeOut(); ucEventId = MM_EVENT_ID_INVALID; break; case MM_TIMER_MODE_I_CS_PS_POWER_OFF_PROTECT: NAS_MM_ModeICsPsPowerOffProtectTimeOut(); break; case MM_TIMER_PROTECT_CS_DETACH: NAS_MM_RcvMmTimerProtectCsDetachExpired(); ucEventId = MM_EVENT_ID_INVALID; break; case MM_TIMER_WAIT_GET_HO_SECU_INFO_CNF: #if (FEATURE_ON == FEATURE_LTE) NAS_MM_RcvMmTimerGetHoSecuInfoCnfExpired(); #endif break; case MM_TIMER_PROTECT_LAU_CSMT_FLG: NAS_MM_RcvProtectingLauCsmtFlgExpired(); break; default: PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_WARNING, "Mm_Timer_Event_Analy:WARNING: TimerId is Error"); break; } return ucEventId; }
VOS_VOID MmMsgProc (struct MsgCB* pMsg) { VOS_VOID *pRcvMsg = VOS_NULL_PTR; /* 接收消息使用的头地址定义 */ MSG_HEADER_STRU *pMsgHeader; /* 定义MSG_HEADER_STRU类型指针 */ VOS_UINT32 aulRcvTimerMsg[4]; /* 接收消息使用的临时内存定义 */ REL_TIMER_MSG *pTimerMsg = VOS_NULL_PTR; VOS_UINT8 ucEventId = MM_EVENT_ID_INVALID; MM_MSG_MM_STATUS_STRU Msg; if (VOS_NULL_PTR == pMsg) { MM_WARN_LOG( "\nMM:MmMsgProc:MM Msg is null!"); return; } NAS_MM_LogMmStateInfo(g_MmGlobalInfo.ucState); #ifdef __PS_WIN32_RECUR__ if ((WUEPS_PID_MM == pMsg->ulSenderPid) && (WUEPS_PID_MM == pMsg->ulReceiverPid)) { NAS_MM_RestoreContextData(pMsg); } #endif if (g_NasMmImportFunc.ucFuncEnvironment != NAS_MML_GetCurrNetRatType() ) { MM_SndMsgFuncChg(); } /* 等待主Task发来的MM启动消息 */ switch (gucMmProcessFlg) { case WAIT_FOR_NORMAL_MSG: /* 等待处理正常消息: */ pRcvMsg = (VOS_VOID *)pMsg; if (PC_PID_TOOL == pMsg->ulSenderPid) { ucEventId = 78; } else if (VOS_PID_TIMER == pMsg->ulSenderPid) { pTimerMsg = (REL_TIMER_MSG *)pMsg; aulRcvTimerMsg[1] = pTimerMsg->ulName; aulRcvTimerMsg[2] = pTimerMsg->ulPara; ucEventId = Mm_Timer_Event_Analy(aulRcvTimerMsg); } else if ( WUEPS_PID_OM == pMsg->ulSenderPid ) { pMsgHeader = (MSG_HEADER_STRU *)pMsg; /*if (AGENT_MM_INQUIRE == ulMsgId )*/ if (AGENT_MM_INQUIRE == pMsgHeader->ulMsgName) { ucEventId = 78; } else { ucEventId = MM_EVENT_ID_INVALID; } } else if (WUEPS_PID_ADMIN == pMsg->ulSenderPid) { pMsgHeader = (MSG_HEADER_STRU *)pMsg; if (WUEPS_RESET_REQ == pMsgHeader->ulMsgName) { Mm_TimerStop(MM_TIMER_STOP_ALL); if (MM_TIMER_START == gstMmTimerSuspend.ucTimerStatus) { if (VOS_OK != Mm_StopRelTimer(WUEPS_PID_MM, MM_TIMER_PROTECT_SUSPEND, &(gstMmTimerSuspend.stTimer))) { PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_WARNING, "MmMsgProc:WARNING: Mm_StopRelTimer VOS_ERRNO_RELTM_STOP_TIMERINVALID."); } gstMmTimerSuspend.ucTimerStatus = MM_TIMER_STOPPED; } PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_WARNING, "MmMsgProc:WARNING: ADMIN Reset order."); gucMmProcessFlg = WAIT_FOR_WUEPS_START; /* 等待ADMIN发送启动原语 */ break; } } else { pMsgHeader = ( MSG_HEADER_STRU* )pMsg; /* 得到消息头 */ ucEventId = Mm_Event_Analy(pMsgHeader); } PS_LOG2(WUEPS_PID_MM, VOS_NULL, PS_PRINT_INFO, "MmMsgProc:INFO: MM* Receive Msg,EventId,State:",ucEventId,g_MmGlobalInfo.ucState); if ( MM_EVENT_ID_STATUS_95 == ucEventId ) { PS_MEM_SET(&g_MmMsgMmInfo, 0, sizeof(MM_MSG_MM_INFO_STRU)); Msg.MmIeRjctCause.ucRejCause = NAS_MML_REG_FAIL_CAUSE_SEMANTICALLY_INCORRECT_MSG; Mm_ComMsgMmStatusSnd(&Msg); ucEventId = MM_EVENT_ID_INVALID; } if ( MM_EVENT_ID_STATUS_96 == ucEventId ) { PS_MEM_SET(&g_MmMsgMmInfo, 0, sizeof(MM_MSG_MM_INFO_STRU)); Msg.MmIeRjctCause.ucRejCause = NAS_MML_REG_FAIL_CAUSE_INVALID_MANDATORY_INF; Mm_ComMsgMmStatusSnd(&Msg); ucEventId = MM_EVENT_ID_INVALID; } g_MmSubLyrShare.MmShare.MmSuspendEvent = ucEventId; if ( MM_EVENT_ID_INVALID != ucEventId ) { gaMmStateTable[ucEventId - 1][g_MmGlobalInfo.ucState](pRcvMsg); } /* 收到GU模系统消息后,需要更新MM中保存的net type */ if ( 5 == ucEventId) { g_MmGlobalInfo.enPreRatType = NAS_MML_GetCurrNetRatType(); } break; case WAIT_FOR_WUEPS_START: /* 等待WUEPS_START_REQ消息 */ if (VOS_PID_TIMER == pMsg->ulSenderPid) { } else { pMsgHeader = ( MSG_HEADER_STRU* )pMsg; /* 得到消息头 */ if (( WUEPS_START_REQ == pMsgHeader->ulMsgName) && ( WUEPS_PID_ADMIN == pMsgHeader->ulSenderPid )) { /* 是WUEPS_START_REQ消息 */ #ifdef __PS_WIN32_RECUR__ Mm_ComInit(); #endif gucMmProcessFlg = WAIT_FOR_MMCMM_START_REQ; /* 状态迁移到"等待MMCMM_START_REQ消息" */ } else { /* 无操作; */ } } break; case WAIT_FOR_MMCMM_START_REQ: /* 等待MMCMM_START_REQ消息: */ if (VOS_PID_TIMER == pMsg->ulSenderPid) { } else { pRcvMsg = (VOS_VOID *)pMsg; /* 读取消息地址 */ pMsgHeader = ( MSG_HEADER_STRU* )pMsg; /* 得到消息头 */ if (( MMCMM_START_REQ == pMsgHeader->ulMsgName) && ( WUEPS_PID_MMC == pMsgHeader->ulSenderPid )) { /* 是MMCGMM_START_REQ消息 */ Mm_ComInit(); ucEventId = Mm_Event_Analy(pMsgHeader); if ( MM_EVENT_ID_INVALID != ucEventId ) { gaMmStateTable[ucEventId - 1] [g_MmGlobalInfo.ucState](pRcvMsg); gucMmProcessFlg = WAIT_FOR_NORMAL_MSG; /* 状态迁移到"等待处理正常消息" */ #ifndef __PS_WIN32_RECUR__ if ( VOS_TRUE == NAS_MML_IsSndOmPcRecurMsgValid() ) { NAS_MM_SndOutsideContextData(); } #endif } } /*A32D11534==>*/ else if ((( MMCC_EST_REQ == pMsgHeader->ulMsgName) && ( WUEPS_PID_CC == pMsgHeader->ulSenderPid )) || (( MMSS_EST_REQ == pMsgHeader->ulMsgName) && ( WUEPS_PID_SS == pMsgHeader->ulSenderPid )) || (( MMSMS_EST_REQ == pMsgHeader->ulMsgName) &&( WUEPS_PID_SMS == pMsgHeader->ulSenderPid ))) { ucEventId = Mm_Event_Analy(pMsgHeader); if ( MM_EVENT_ID_INVALID != ucEventId ) { gaMmStateTable[ucEventId - 1][MM_STATE_NULL](pRcvMsg); } } /*<==A32D11534*/ else { /* 无操作; */ } } break; default: PS_LOG(WUEPS_PID_MM, VOS_NULL, PS_PRINT_WARNING, "MmMsgProc:WARNING: gucMmProcessFlg is Abnormal"); break; } /* #ifndef __PS_WIN32_RECUR__ NAS_MML_SetUePcRecurFlg(VOS_TRUE); #endif */ }