VOS_UINT32 NAS_UTRANCTRL_FSM_GetCurrState(VOS_VOID) { NAS_UTRANCTRL_FSM_CTX_STRU *pstCurFsm = VOS_NULL_PTR; /* 获取当前的状态机信息 */ pstCurFsm = NAS_UTRANCTRL_GetCurFsmAddr(); /* 获取当前状态 */ return (pstCurFsm->ulState); }
VOS_UINT32 NAS_UTRANCTRL_RestoreContextData_Main( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_UTRANCTRL_CTX_STRU *pstUtranCtrlCtx; NAS_MML_PC_REPLAY_COMPRESS_CONTEXT_STRU *pstRcMsg; VOS_UINT32 ulExpectCount; VOS_UINT32 ulCount; VOS_UINT32 ulItemCount; VOS_UINT8 *pucDest; VOS_UINT8 *pucSrc; VOS_UINT32 ulDestLen; pstUtranCtrlCtx = NAS_UTRANCTRL_GetUtranCtrlCtx(); ulExpectCount = 0; ulCount = 0; ulItemCount = 0; ulExpectCount = sizeof(NAS_UTRANCTRL_CTX_STRU); /*注册状态机*/ NAS_UTRANCTRL_RegFsm(); pstRcMsg = (NAS_MML_PC_REPLAY_COMPRESS_CONTEXT_STRU *)pstMsg; pucSrc = pstRcMsg->aucData; /* 解析总长度 */ PS_MEM_CPY(&ulCount, pucSrc, sizeof(VOS_UINT32)); pucSrc += sizeof(VOS_UINT32); if( ulExpectCount != ulCount ) { return VOS_FALSE; } /* g_stNasUtranCtrlCtx目标地址 */ pucDest = (VOS_UINT8 *)pstUtranCtrlCtx; ulDestLen = sizeof(NAS_UTRANCTRL_CTX_STRU); /* 解压缩 */ if (VOS_FALSE == NAS_MML_UnCompressData(pucDest, &ulDestLen, pucSrc, &ulItemCount) ) { return VOS_FALSE; } pucSrc += (ulItemCount); NAS_UTRANCTRL_ReloadFsmDesc(NAS_UTRANCTRL_GetCurFsmAddr(), pstUtranCtrlCtx->stCurFsm.enFsmId); NAS_INFO_LOG(WUEPS_PID_MMC, "UTRANCTRL: NAS_UTRANCTRL_RestoreContextData_Main - data is restored."); return VOS_TRUE; }
VOS_UINT32 NAS_UTRANCTRL_ProcessMsgInFsm( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_ACTION_FUNC pActFun; NAS_UTRANCTRL_FSM_CTX_STRU *pstCurFsm; VOS_UINT32 ulRslt; NAS_UTRANCTRL_FSM_ID_ENUM_UINT32 enCurrFsmId; MSG_HEADER_STRU *pstMsgHeader = VOS_NULL_PTR; pstMsgHeader = (MSG_HEADER_STRU *)pstMsg; /* 取得当前的状态机名称 */ enCurrFsmId = NAS_UTRANCTRL_GetCurrFsmId(); /* 获取当前UTRANCTRL的状态机地址 */ pstCurFsm = NAS_UTRANCTRL_GetCurFsmAddr(); /* 查找状态转移表中的相应的动作处理函数 */ pActFun = NAS_FSM_FindAct(pstCurFsm->pstFsmDesc, pstCurFsm->ulState, ulEventType); if (VOS_NULL_PTR != pActFun) { /* 在状态表中对消息进行处理 */ ulRslt = (*pActFun) (ulEventType, (struct MsgCB *)pstMsg); return ulRslt; } /* 通知接入层模式通知或SYSCFG设置的时候,缓存所有找不到的消息 */ if ((NAS_UTRANCTRL_FSM_MODE_CHANGE == enCurrFsmId) || (NAS_UTRANCTRL_FSM_SYSCFG == enCurrFsmId)) { /* 消息长度超过了缓存的长度,则不保存, 防止数组越界 */ if ( (pstMsgHeader->ulLength + VOS_MSG_HEAD_LENGTH) > NAS_UTRANCTRL_MAX_MSG_BUFFER_LEN ) { NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_UTRANCTRL_ProcessMsgInFsm:Msg too big to save "); /* 状态表中未找到要处理的消息,则需继续处理 */ return VOS_FALSE; } NAS_UTRANCTRL_SaveCacheMsgInMsgQueue(ulEventType, pstMsg); /* 缓存消息,当前MMC状态机不处理,后续处理适配层缓存 */ return VOS_TRUE; } /* 状态表中未找到要处理的消息,则需继续处理 */ return VOS_FALSE; }
VOS_VOID NAS_UTRANCTRL_FSM_SetCurrState( VOS_UINT32 ulCurrState ) { NAS_UTRANCTRL_FSM_CTX_STRU *pstCurFsm = VOS_NULL_PTR; /* 获取当前的状态信息 */ pstCurFsm = NAS_UTRANCTRL_GetCurFsmAddr(); /* 设置当前状态 */ pstCurFsm->ulState = ulCurrState; /* 可维可测状态机信息打印 */ NAS_UTRANCTRL_SndOmUtranCtrlFsmInfo(); return; }