Exemplo n.º 1
0
/*****************************************************************************
 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;

}
Exemplo n.º 3
0
/*****************************************************************************
 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;
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
/*****************************************************************************
 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;
}
Exemplo n.º 6
0
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;
}