VOS_UINT32 NAS_MMC_IsExistCachedUserSearchMsg( VOS_VOID ) { VOS_UINT32 ulCacheMsgIdx; VOS_UINT32 ulExistFlg; ulExistFlg = NAS_MMC_IsExistCacheMsg(NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_PLMN_LIST_REQ), &ulCacheMsgIdx); if ( VOS_TRUE == ulExistFlg ) { return VOS_TRUE; } /* 收到内部搜网或列表搜网请求,判断是否有指定搜网或列表搜网,不保存该消息*/ ulExistFlg = NAS_MMC_IsExistCacheMsg(NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_PLMN_SPECIAL_REQ), &ulCacheMsgIdx); if ( VOS_TRUE == ulExistFlg ) { return VOS_TRUE; } #if (FEATURE_ON == FEATURE_CSG) ulExistFlg = NAS_MMC_IsExistCacheMsg(NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_CSG_LIST_SEARCH_REQ), &ulCacheMsgIdx); if ( VOS_TRUE == ulExistFlg ) { return VOS_TRUE; } #endif return VOS_FALSE; }
VOS_VOID NAS_MSCC_MsgProc (struct MsgCB* pstMsg) { MSG_HEADER_STRU *pstMsgHeader = VOS_NULL_PTR; REL_TIMER_MSG *pRcvTimerMsg = VOS_NULL_PTR; VOS_UINT32 ulEventType; VOS_UINT32 usOldStackDepth; VOS_UINT32 usNewStackDepth; pstMsgHeader = (MSG_HEADER_STRU *)pstMsg; NAS_MSCC_LogMsgInfo(pstMsgHeader); /* If the sender pid is timer then stop the timer */ if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid) { pRcvTimerMsg = (REL_TIMER_MSG *)pstMsg; ulEventType = NAS_BuildEventType(pstMsgHeader->ulSenderPid, pRcvTimerMsg->ulName); /* Stop the particular protection timer */ NAS_MSCC_StopTimer(pRcvTimerMsg->ulName); } else { ulEventType = NAS_BuildEventType(pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName); } if (VOS_TRUE == NAS_MSCC_PreProcessMsg(ulEventType, pstMsg)) { return; } usOldStackDepth = NAS_MSCC_GetFsmStackDepth(); /* Process the message in current FSM,if */ if (VOS_TRUE == NAS_MSCC_ProcessMsgInFsm(ulEventType, pstMsg)) { /* Process the internal message */ NAS_MSCC_ProcessMsccIntMsg(); usNewStackDepth = NAS_MSCC_GetFsmStackDepth(); /* If there is FSM pop then process the message in buffer message */ if (usNewStackDepth < usOldStackDepth) { NAS_MSCC_ProcessBufferMsg(); } } else { (VOS_VOID)NAS_MSCC_PostProcessMsg(ulEventType, pstMsg); } NAS_MSCC_UpdateMsgExitTime(); return; }
NAS_MML_NET_RAT_TYPE_ENUM_UINT8 NAS_MMC_GetSuspendDestinationRatType( NAS_MMC_ENTRY_MSG_STRU *pstEntryMsg ) { #if (FEATURE_ON == FEATURE_LTE) LMM_MMC_SUSPEND_IND_STRU *pstLSuspendMsg = VOS_NULL_PTR; #endif RRMM_SUSPEND_IND_ST stGuSuspendMsg; NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enRat; enRat = NAS_MML_NET_RAT_TYPE_BUTT; /* 根据消息类型,转换入口消息 */ switch (pstEntryMsg->ulEventType) { case NAS_BuildEventType(WUEPS_PID_WRR, RRMM_SUSPEND_IND): case NAS_BuildEventType(UEPS_PID_GAS, RRMM_SUSPEND_IND): stGuSuspendMsg = *(RRMM_SUSPEND_IND_ST*)(pstEntryMsg->aucEntryMsgBuffer); break; #if (FEATURE_ON == FEATURE_LTE) case NAS_BuildEventType(PS_PID_MM, ID_LMM_MMC_SUSPEND_IND): pstLSuspendMsg = (LMM_MMC_SUSPEND_IND_STRU*)(pstEntryMsg->aucEntryMsgBuffer); /* 转换L的挂起消息为GU的 */ NAS_MMC_ConvertLmmSuspendMsgToGUtype(pstLSuspendMsg, &stGuSuspendMsg); break; #endif default: NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_GetSuspendDestinationRatType:Invalid Event Type!"); return enRat; } /* 根据挂起目的方,获取挂起前的网络类型 */ switch(stGuSuspendMsg.ucSuspendDestination) { case MMC_SUSPEND_DESTINATION_GSM: enRat = NAS_MML_NET_RAT_TYPE_GSM; break; case MMC_SUSPEND_DESTINATION_WCDMA: enRat = NAS_MML_NET_RAT_TYPE_WCDMA; break; #if (FEATURE_ON == FEATURE_LTE) case MMC_SUSPEND_DESTINATION_LTE: enRat = NAS_MML_NET_RAT_TYPE_LTE; break; #endif default: NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_GetSuspendDestinationRatType:Unexpected Rat Type!"); return enRat; } return enRat; }
VOS_UINT32 NAS_MMC_IsNeedCacheMsg( VOS_UINT32 ulEventType, VOS_VOID *pstMsg ) { VOS_UINT32 ulExistFlg; VOS_UINT32 ulCacheEventType; switch (ulEventType) { /* 收到关机请求,清除所有缓存消息,返回消息需要保存*/ case NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_POWER_OFF_REQ): NAS_MMC_ClearAllCacheMsg(); break; /* 收到MSCC发生的指定搜网和列表搜网*/ case NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_PLMN_SPECIAL_REQ): case NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_PLMN_LIST_REQ): case NAS_BuildEventType(VOS_PID_TIMER, TI_NAS_MMC_PERIOD_TRYING_USER_PLMN_LIST): #if (FEATURE_ON == FEATURE_CSG) case NAS_BuildEventType(UEPS_PID_MSCC, ID_MSCC_MMC_CSG_LIST_SEARCH_REQ): case NAS_BuildEventType(VOS_PID_TIMER, TI_NAS_MMC_PERIOD_TRYING_USER_CSG_LIST_SEARCH): #endif /* 清除缓存内部指定搜网 */ ulCacheEventType = NAS_BuildEventType(WUEPS_PID_MMC, MMCMMC_INTER_PLMN_SEARCH_REQ); NAS_MMC_ClearCacheMsg(ulCacheEventType); break; case NAS_BuildEventType(WUEPS_PID_MMC, MMCMMC_INTER_PLMN_SEARCH_REQ): /* 收到内部搜网请求,判断是否有指定搜网,不保存该消息*/ ulExistFlg = NAS_MMC_IsExistCachedUserSearchMsg(); if ( VOS_TRUE == ulExistFlg) { return VOS_FALSE; } /* 收到内部搜网请求,判断是否有内部搜网,清除以前保存的搜网*/ /* 清除缓存内部指定搜网 */ ulCacheEventType = NAS_BuildEventType(WUEPS_PID_MMC, MMCMMC_INTER_PLMN_SEARCH_REQ); NAS_MMC_ClearCacheMsg(ulCacheEventType); break; default: break; } /* 默认返回保存该消息 */ return VOS_TRUE; }
LOCAL VOS_VOID NAS_CC_ProcMnccSrvccCallInfoNtf( MNCC_SRVCC_CALL_INFO_NOTIFY_STRU *pstSrvccCallInfoNtf ) { VOS_UINT8 aucTi[MNCC_MAX_ENTITY_NUM]; VOS_UINT8 ucTiNum; PS_MEM_SET(aucTi, 0x00, sizeof(aucTi)); if (0 != pstSrvccCallInfoNtf->ucCallNum) { /* 构造CC实体信息 */ NAS_CC_CreateCcEntityWithCallEntityInfo((VOS_VOID*)pstSrvccCallInfoNtf); /* 构造通知MM模块的TI数组信息 */ NAS_CC_GetEntityTiInfo(&ucTiNum, aucTi); /* 通知MM模块MMCC_SRVCC_CALL_INFO_NOTIFY消息 */ NAS_CC_SendMmccSrvccCallInfoNtf(ucTiNum, aucTi); } else { NAS_CC_SendMmccRelReq(NAS_CC_INVALID_TI_VALUE, MMCC_RELEASE_ALL); } NAS_CC_ProcessSpecTypeBufferMsg(NAS_BuildEventType(WUEPS_PID_MM, MMCC_SYNC_IND)); return; }
VOS_UINT32 NAS_MMC_IsExistCachedUserSearchMsg( VOS_VOID ) { VOS_UINT32 ulCacheMsgIdx; VOS_UINT32 ulExistFlg; ulExistFlg = NAS_MMC_IsExistCacheMsg(NAS_BuildEventType(WUEPS_PID_MMA, ID_MMA_MMC_PLMN_LIST_REQ), &ulCacheMsgIdx); if ( VOS_TRUE == ulExistFlg ) { return VOS_TRUE; } /* 收到内部搜网或列表搜网请求,判断是否有指定搜网或列表搜网,不保存该消息*/ ulExistFlg = NAS_MMC_IsExistCacheMsg(NAS_BuildEventType(WUEPS_PID_MMA, ID_MMA_MMC_PLMN_SPECIAL_REQ), &ulCacheMsgIdx); if ( VOS_TRUE == ulExistFlg ) { return VOS_TRUE; } return VOS_FALSE; }
VOS_UINT32 NAS_MMC_IsInterSysReselectToHrpd( NAS_MMC_ENTRY_MSG_STRU *pstEntryMsg ) { #if (FEATURE_ON == FEATURE_LTE) LMM_MMC_SUSPEND_IND_STRU *pstLSuspendMsg = VOS_NULL_PTR; #endif RRMM_SUSPEND_IND_ST stGuSuspendMsg; /* 根据消息类型,转换入口消息 */ switch (pstEntryMsg->ulEventType) { case NAS_BuildEventType(WUEPS_PID_WRR, RRMM_SUSPEND_IND): case NAS_BuildEventType(UEPS_PID_GAS, RRMM_SUSPEND_IND): return VOS_FALSE; #if (FEATURE_ON == FEATURE_LTE) case NAS_BuildEventType(PS_PID_MM, ID_LMM_MMC_SUSPEND_IND): pstLSuspendMsg = (LMM_MMC_SUSPEND_IND_STRU*)(pstEntryMsg->aucEntryMsgBuffer); /* 转换L的挂起消息为GU的 */ NAS_MMC_ConvertLmmSuspendMsgToGUtype(pstLSuspendMsg, &stGuSuspendMsg); break; #endif default: NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_GetSuspendOrigenRatType:Invalid Event Type!"); return VOS_FALSE; } if (MMC_SUSPEND_DESTINATION_HRPD == stGuSuspendMsg.ucSuspendDestination) { return VOS_TRUE; } else { return VOS_FALSE; } }
MMC_SUSPEND_CAUSE_ENUM_UINT8 NAS_MMC_GetSuspendCause( NAS_MMC_ENTRY_MSG_STRU *pstEntryMsg ) { #if (FEATURE_ON == FEATURE_LTE) LMM_MMC_SUSPEND_IND_STRU *pstLSuspendMsg = VOS_NULL_PTR; #endif RRMM_SUSPEND_IND_ST stGuSuspendMsg; MMC_SUSPEND_CAUSE_ENUM_UINT8 enSuspendCause; enSuspendCause = MMC_SUSPEND_CAUSE_BUTT; /* 根据消息类型,转换入口消息 */ switch (pstEntryMsg->ulEventType) { case NAS_BuildEventType(WUEPS_PID_WRR, RRMM_SUSPEND_IND): case NAS_BuildEventType(UEPS_PID_GAS, RRMM_SUSPEND_IND): stGuSuspendMsg = *(RRMM_SUSPEND_IND_ST*)(pstEntryMsg->aucEntryMsgBuffer); enSuspendCause = stGuSuspendMsg.ucSuspendCause; break; #if (FEATURE_ON == FEATURE_LTE) case NAS_BuildEventType(PS_PID_MM, ID_LMM_MMC_SUSPEND_IND): pstLSuspendMsg = (LMM_MMC_SUSPEND_IND_STRU*)(pstEntryMsg->aucEntryMsgBuffer); /* 转换L的挂起消息为GU的 */ NAS_MMC_ConvertLmmSuspendMsgToGUtype(pstLSuspendMsg, &stGuSuspendMsg); enSuspendCause = stGuSuspendMsg.ucSuspendCause; break; #endif default: NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_GetSuspendOrigenRatType:Invalid Event Type!"); return enSuspendCause; } return enSuspendCause; }
VOS_UINT32 NAS_UTRANCTRL_GetBufferedPlmnSearchReqType(VOS_VOID) { RRMM_PLMN_SEARCH_REQ_STRU stPlmnSearchReqMsg; VOS_UINT32 ulEventType; ulEventType = NAS_UTRANCTRL_GetBufferedSndUtranReqMsgAddr()->ulEventType; /* 当期缓存的UTRAN的请求消息如果不是指定搜网请求消息则说明有异常 */ if (ulEventType != NAS_BuildEventType(WUEPS_PID_MMC, RRMM_PLMN_SEARCH_REQ)) { NAS_WARNING_LOG( WUEPS_PID_MMC, "NAS_UTRANCTRL_GetBufferedPlmnSearchReqType Invalid Event type!" ); return RRC_PLMN_SEARCH_TYPE_BUTT; } stPlmnSearchReqMsg = *(RRMM_PLMN_SEARCH_REQ_STRU*)(NAS_UTRANCTRL_GetBufferedSndUtranReqMsgAddr()->aucEntryMsgBuffer); return stPlmnSearchReqMsg.ulSearchType; }
VOS_VOID NAS_MSCC_ProcessMsccIntMsg(VOS_VOID) { MSG_HEADER_STRU *pstIntMsg = VOS_NULL_PTR; VOS_UINT32 ulEventType; pstIntMsg = (MSG_HEADER_STRU *)NAS_MSCC_GetNextIntMsg(); while (VOS_NULL_PTR != pstIntMsg) { NAS_MSCC_MNTN_TraceIntMsg(pstIntMsg->ulSenderPid, pstIntMsg->ulLength + VOS_MSG_HEAD_LENGTH, (VOS_VOID *)pstIntMsg); ulEventType = NAS_BuildEventType(pstIntMsg->ulSenderPid, (VOS_UINT16)pstIntMsg->ulMsgName); /* Preprocess the message if it in preproc table */ if (VOS_TRUE == NAS_MSCC_PreProcessMsg(ulEventType, (struct MsgCB*)pstIntMsg)) { /* If the message is processed then free Msg pointer */ PS_MEM_FREE(pstIntMsg->ulSenderPid, pstIntMsg); /* Get next internal message */ pstIntMsg = (MSG_HEADER_STRU *)NAS_MSCC_GetNextIntMsg(); continue; } /* There is no entry in Pre process table then process in current FSM */ /* Send the message to process in current FSM */ (VOS_VOID)NAS_MSCC_ProcessMsgInFsm(ulEventType, (struct MsgCB *)pstIntMsg); /* Free the message */ PS_MEM_FREE(pstIntMsg->ulSenderPid, pstIntMsg); /* Get next internal message */ pstIntMsg = (MSG_HEADER_STRU *)NAS_MSCC_GetNextIntMsg(); } return; }
VOS_VOID NAS_MMC_MsgProc( struct MsgCB *pstMsg ) { MSG_HEADER_STRU *pstMsgHeader; REL_TIMER_MSG *pRcvTimerMsg; VOS_UINT32 ulEventType; VOS_UINT32 ulRet; VOS_UINT32 usOldStackDepth; VOS_UINT32 usNewStackDepth; if ( VOS_NULL_PTR == pstMsg ) { NAS_ERROR_LOG(WUEPS_PID_MMC, "NAS_MMC_MsgProc:null pointer"); return; } pstMsgHeader = (MSG_HEADER_STRU *)pstMsg; /* 动作表里的时间消息不能靠消息头名称进行区分,依靠其结构体的ulName域进行区分 所以此处进行分别处理 */ if ( VOS_PID_TIMER == pstMsgHeader->ulSenderPid ) { pRcvTimerMsg = (REL_TIMER_MSG *)pstMsg; ulEventType = NAS_BuildEventType(pstMsgHeader->ulSenderPid, pRcvTimerMsg->ulName); /* 停止对应的定时器,更新定时器的状态 */ NAS_MMC_StopTimer((NAS_MMC_TIMER_ID_ENUM_UINT16)(pRcvTimerMsg->ulName)); } else { ulEventType = NAS_BuildEventType(pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName); } /* 如果已经处理完成则直接返回 */ if ( VOS_TRUE == NAS_MMC_PreProcessMsg(ulEventType, pstMsg)) { return; } /* 获取当前MMC的栈深度 */ usOldStackDepth = NAS_MMC_GetFsmStackDepth(); /* 进入状态机处理 */ ulRet = NAS_MMC_ProcessMsgInFsm(ulEventType, pstMsg); /* 状态机中会收到连接释放、状态机退出等消息,所以不能直接返回 还需要判断能否处理缓存*/ usNewStackDepth = NAS_MMC_GetFsmStackDepth(); /* 如果栈的深度减少,说明肯定进行了退栈操作,需要优先处理该状态机的结果消息,直接返回 */ if ( usNewStackDepth < usOldStackDepth ) { /* 记录退栈操作,只要发生了退栈后续就可以处理缓存 */ NAS_MMC_SetFsmStackPopFlg(VOS_TRUE); return; } /* 该消息在状态机中已经处理完成,可尝试处理一下缓存 */ if ( VOS_TRUE == ulRet) { /* 当前仅收到状态机的退出消息才能够处理缓存 */ if (VOS_TRUE == NAS_MMC_GetFsmStackPopFlg()) { (VOS_VOID)NAS_MMC_ProcessBufferMsg(); NAS_MMC_SetFsmStackPopFlg(VOS_FALSE); } } /* 在当前状态机中未处理完毕,判断消息是否需要打断当前的L2状态机,后处理 */ else { (VOS_VOID)NAS_MMC_PostProcessMsg(ulEventType, pstMsg); } return; }