/***************************************************************************** Function Name : NAS_LMM_FSM_PopState Discription : 将CCB状态栈中栈顶的状态弹出堆栈,填入当前状态。在流程模块调用 RRC_FSM_EndProcess时由MAIN模块自动完成,该接口不对外提供。 Input : 状态机栈地址 Output : None Return : None History: 1. hanlufeng 41410 Draft Enact *****************************************************************************/ VOS_VOID NAS_LMM_FSM_PopState( NAS_LMM_PARALLEL_FSM_ENUM_UINT16 enParalFsmId ) { NAS_LMM_FSM_STATE_STACK_STRU *pstFsmStack; /* 状态机栈地址 */ NAS_LMM_FSM_STATE_STRU *pstCurFsm; /* 状态机地址 */ NAS_LMM_FSM_STATE_STRU *pstFsmStackTop; /* 指向栈顶状态 */ /* 入口检查 */ if ( NAS_LMM_PARA_FSM_ID_INVALID(enParalFsmId)) { NAS_LMM_PUBM_LOG1_ERR("NAS_LMM_FSM_PopState, FsmId error, FsmId", enParalFsmId); return; } /* 获取EMM状态机当前状态的地址和状态机栈的地址 */ pstCurFsm = NAS_LMM_GetCurFsmAddr(enParalFsmId); pstFsmStack = NAS_LMM_GetFsmStackAddr(enParalFsmId); /* 栈越界 */ if ( (pstFsmStack->ucStackDepth) > NAS_LMM_MAX_STACK_DEPTH ) { NAS_LMM_PUBM_LOG1_ERR("NAS_LMM_FSM_PopState, The stack depth overflow, ucStackDepth", (pstFsmStack->ucStackDepth)); return; } /* 栈已空 */ if ( 0 == (pstFsmStack->ucStackDepth) ) { NAS_LMM_PUBM_LOG_ERR("NAS_LMM_FSM_PopState, The stack is empty!"); return; } /* 获取栈顶第一个有效状态的位置,即栈顶的下一个位置 */ pstFsmStack->ucStackDepth--; /* 获取栈顶第一个有效状态 */ pstFsmStackTop = &((pstFsmStack->astFsmStack)[pstFsmStack->ucStackDepth]); /* 设置当前状态机 */ pstCurFsm->enFsmId = pstFsmStackTop->enFsmId; pstCurFsm->enMainState = pstFsmStackTop->enMainState; pstCurFsm->enSubState = pstFsmStackTop->enSubState; pstCurFsm->enStaTId = pstFsmStackTop->enStaTId; return; }
LPS_LNAS_STA_ENUM_UINT32 LNAS_DEBUG_GetEmmSta(VOS_VOID) { NAS_LMM_MAIN_STATE_ENUM_UINT16 enMainState; NAS_LMM_SUB_STATE_ENUM_UINT16 enSubState; NAS_LMM_FSM_STATE_STACK_STRU *pstFsmStack = VOS_NULL_PTR; /* 状态机栈地址 */ NAS_LMM_FSM_STATE_STRU *pstFsmStackBase = VOS_NULL_PTR; /* 指向栈底状态 */ /* 从当前状态机中获取状态 */ enMainState = NAS_LMM_GetEmmCurFsmMS(); enSubState = NAS_LMM_GetEmmCurFsmSS(); /* 连接建立过程,释放过程,鉴权过程 需要从状态栈获取状态 */ /*add by lifuxin for Lnas est process re-construct start*/ if ((EMM_MS_RRC_CONN_REL_INIT == enMainState) ||(EMM_MS_AUTH_INIT == enMainState) ) /*add by lifuxin for Lnas est process re-construct end*/ { /* 获取状态栈栈底地址 */ pstFsmStack = NAS_LMM_GetFsmStackAddr(NAS_LMM_PARALLEL_FSM_EMM); pstFsmStackBase = &((pstFsmStack->astFsmStack)[NAS_LMM_STACK_BASE]); /* 从状态栈获取状态 */ enMainState = pstFsmStackBase->enMainState; enSubState = pstFsmStackBase->enSubState; } if ((EMM_SS_REG_NO_CELL_AVAILABLE == enSubState) ||(EMM_SS_DEREG_NO_CELL_AVAILABLE == enSubState) ||(EMM_SS_DEREG_NO_IMSI == enSubState)) { return LPS_LNAS_STA_NO_SERVICE; } if ((EMM_MS_REG == enMainState) ||(EMM_MS_TAU_INIT == enMainState) ||(EMM_MS_SER_INIT == enMainState)) { return LPS_LNAS_STA_ATTACHED; } if (EMM_MS_DEREG == enMainState) { return LPS_LNAS_STA_DETACHED; } return LPS_LNAS_STA_OTHER; }
/***************************************************************************** Function Name : NAS_LMM_FSM_PushState Discription : 当前状态机压栈,不修改状态。即入栈后,当前状态仍保持入栈前 的状态,状态修改的工作由执行入栈操作的模块显式执行。 Input : 状态机栈地址 Output : None Return : None History: 1. hanlufeng 41410 Draft Enact *****************************************************************************/ VOS_VOID NAS_LMM_FSM_PushState( NAS_LMM_PARALLEL_FSM_ENUM_UINT16 enParalFsmId) { NAS_LMM_FSM_STATE_STACK_STRU *pstFsmStack; /* 状态机栈地址 */ NAS_LMM_FSM_STATE_STRU *pstCurFsm; /* 状态机地址 */ NAS_LMM_FSM_STATE_STRU *pstFsmStackTop; /* 指向栈顶状态 */ /* 入口检查 */ if ( NAS_LMM_PARA_FSM_ID_INVALID(enParalFsmId)) { NAS_LMM_PUBM_LOG1_ERR("NAS_EMM_FSM_PushState, The input is illegal! enParalFsmId", enParalFsmId); return; } /* 获取EMM状态机当前状态的地址和状态机栈的地址 */ pstCurFsm = NAS_LMM_GetCurFsmAddr(NAS_LMM_PARALLEL_FSM_EMM); pstFsmStack = NAS_LMM_GetFsmStackAddr(NAS_LMM_PARALLEL_FSM_EMM); /* 状态机栈是否已满 */ if ( pstFsmStack->ucStackDepth >= NAS_LMM_MAX_STACK_DEPTH ) { NAS_LMM_PUBM_LOG1_ERR("NAS_EMM_FSM_PushState, The stack depth overflow!, ucStackDepth", pstFsmStack->ucStackDepth); /* 栈满应该有些出错处理 */ return; } /* 获取状态栈栈顶地址 */ pstFsmStackTop = &((pstFsmStack->astFsmStack)[pstFsmStack->ucStackDepth]); /* 入栈 */ pstFsmStackTop->enFsmId = pstCurFsm->enFsmId; pstFsmStackTop->enMainState = pstCurFsm->enMainState; pstFsmStackTop->enSubState = pstCurFsm->enSubState; pstFsmStackTop->enStaTId = pstCurFsm->enStaTId; /* 栈深度加 1 */ pstFsmStack->ucStackDepth++; return; }
VOS_UINT32 NAS_LMM_FSM_GetStaAtStackTop( NAS_LMM_PARALLEL_FSM_ENUM_UINT16 enParalFsmId) { NAS_LMM_MAIN_STATE_ENUM_UINT16 enMainState; NAS_LMM_SUB_STATE_ENUM_UINT16 enSubState; NAS_LMM_FSM_STATE_STACK_STRU *pstFsmStack = VOS_NULL_PTR; NAS_LMM_FSM_STATE_STRU *pstFsmStackTop = VOS_NULL_PTR; /* 获取状态栈栈底地址 */ pstFsmStack = NAS_LMM_GetFsmStackAddr(enParalFsmId); pstFsmStackTop = &((pstFsmStack->astFsmStack)[pstFsmStack->ucStackDepth-1]); /* 从状态栈获取状态 */ enMainState = pstFsmStackTop->enMainState; enSubState = pstFsmStackTop->enSubState; return NAS_LMM_PUB_COMP_EMMSTATE(enMainState, enSubState); }
/***************************************************************************** Function Name : 清除MM层各状态机的栈 Discription : NAS_LMM_FSM_ClearStackResource Input : Output : None Return : None History: 1. hanlufeng 41410 Draft Enact *****************************************************************************/ VOS_VOID NAS_LMM_FSM_ClearStackResource(VOS_VOID) { VOS_UINT32 ulFsmId; NAS_LMM_FSM_STATE_STACK_STRU *pEmmStack; NAS_LMM_PUBM_LOG_NORM("NAS_LMM_FSM_ClearStackResource enter."); for(ulFsmId = NAS_LMM_PARALLEL_FSM_EMM; ulFsmId < NAS_LMM_PARALLEL_FSM_BUTT; ulFsmId++) { pEmmStack = NAS_LMM_GetFsmStackAddr(ulFsmId); /* 栈顶位置指示,即栈深度,设为0 */ pEmmStack->ucStackDepth = NAS_EMM_STACK_EMPTY; } return; }
VOS_VOID NAS_LMM_FSM_ClearState( NAS_LMM_PARALLEL_FSM_ENUM_UINT16 enParalFsmId ) { NAS_LMM_FSM_STATE_STACK_STRU *pstFsmStack; /* 状态机栈地址 */ /* 入口检查 */ if ( NAS_LMM_PARA_FSM_ID_INVALID(enParalFsmId)) { NAS_LMM_PUBM_LOG1_ERR("NAS_LMM_FSM_PopState, FsmId error, FsmId", enParalFsmId); return; } /* 获取EMM状态机当前状态的地址和状态机栈的地址 */ pstFsmStack = NAS_LMM_GetFsmStackAddr(enParalFsmId); /* 栈越界 */ if ( (pstFsmStack->ucStackDepth) > NAS_LMM_MAX_STACK_DEPTH ) { NAS_LMM_PUBM_LOG1_ERR("NAS_LMM_FSM_PopState, The stack depth overflow, ucStackDepth", (pstFsmStack->ucStackDepth)); return; } /* 栈已空 */ if ( 0 == (pstFsmStack->ucStackDepth) ) { NAS_LMM_PUBM_LOG_ERR("NAS_LMM_FSM_PopState, The stack is empty!"); return; } /*清除栈内存储的状态机*/ pstFsmStack->ucStackDepth = 0; NAS_LMM_MEM_SET(pstFsmStack,0,sizeof(NAS_LMM_FSM_STATE_STACK_STRU)); return; }