/*****************************************************************************
 Function Name   : NAS_ERABM_RcvRabmEmmSuspendInd
 Description     : ERABM模块收到ID_EMM_ERABM_SUSPEND_IND处理函数
 Input           : EMM_ERABM_SUSPEND_IND_STRU *pRcvMsg
 Output          : None
 Return          : VOS_UINT32

 History         :
    1.lihong00150010            2011-05-03      Draft Enact
*****************************************************************************/
VOS_VOID  NAS_ERABM_RcvRabmEmmSuspendInd(const EMM_ERABM_SUSPEND_IND_STRU *pRcvMsg )
{
    VOS_UINT32                          ulEpsbId        = NAS_ERABM_NULL;
    VOS_UINT8                           ucTimerIndex    = NAS_ERABM_NULL;

    /* 设置状态为挂起态 */
    NAS_ERABM_SetLModeStatus(NAS_ERABM_L_MODE_STATUS_SUSPENDED);

    /* 停止定时器 */
    for (ucTimerIndex = 0; ucTimerIndex < NAS_NAS_ERABM_TIMER_NAME_BUTT; ucTimerIndex++)
    {
        NAS_ERABM_TimerStop(ucTimerIndex);
    }
    /* 如果是切换和CCO类型的挂起,则不删除DRB信息,只将DRB的状态设为NAS_ERABM_RB_SUSPENDED,
       因为L-GU切换或者CCO失败回退成功时,RRC并不上报LRRC_LRABM_RAB_IND消息,而
       只上报LRRC_LRABM_STATUS_IND消息恢复数传;其他类型的挂起,则删除DRB信息*/
    if ((EMM_ERABM_SYS_CHNG_TYPE_HO == pRcvMsg->enSysChngType)
         || (EMM_ERABM_SYS_CHNG_TYPE_CCO == pRcvMsg->enSysChngType))
    {
        /* 将DRB状态设为NAS_ERABM_RB_SUSPENDED */
        for (ulEpsbId = NAS_ERABM_MIN_EPSB_ID; ulEpsbId<= NAS_ERABM_MAX_EPSB_ID; ulEpsbId++)
        {
            /* 添加保护,防止出现RbState被误设置为挂起态 */
            if(NAS_ERABM_ILL_RB_ID != NAS_ERABM_GetEpsbRbIdInfo(ulEpsbId))
            {
                NAS_ERABM_SetRbStateInfo(ulEpsbId, NAS_ERABM_RB_SUSPENDED);
            }
        }
    }

    #if 0
    /* 设置用户面模式为NULL */
    if (PS_SUCC != UP_SetRanMode(RAN_MODE_NULL))
    {
        NAS_ERABM_ERR_LOG("NAS_ERABM_RcvRabmEmmSuspendInd: Update Ran Mode Failed.");
    }
    #endif

    /*清除等待EPS承载激活标识*/
    NAS_ERABM_SetWaitEpsBActSign(NAS_ERABM_NOT_WAIT_EPSB_ACT_MSG);

    /*SERVICE流程停止*/
    NAS_ERABM_SetEmmSrState(NAS_ERABM_SERVICE_STATE_TERMIN);

    /* 通知L2释放缓存的数据包 */
    /*APPITF_FreeAllofRabmBuf();*/

    /* 清除上行数据阻塞标志*/
    NAS_ERABM_SetUpDataPending(EMM_ERABM_NO_UP_DATA_PENDING);

    /* 通知ETC挂起 */
    NAS_ERABM_SndRabmTcSuspendInd();

    /* 回复EMM挂起成功 */
    NAS_ERABM_SndRabmEmmSuspendRsp(EMM_ERABM_RSLT_TYPE_SUCC);
}
/*****************************************************************************
 Function Name   : NAS_ERABM_RcvRabmEmmResumeInd
 Description     : SM模块收到ID_EMM_ERABM_RESUME_IND处理函数
 Input           : EMM_ERABM_RESUME_IND_STRU *pRcvMsg
 Output          : None
 Return          : VOS_UINT32

 History         :
    1.lihong00150010            2011-05-03      Draft Enact
*****************************************************************************/
VOS_VOID  NAS_ERABM_RcvRabmEmmResumeInd(const EMM_ERABM_RESUME_IND_STRU *pRcvMsg )
{
    (VOS_VOID)pRcvMsg;

    /* 设置状态为正常态 */
    NAS_ERABM_SetLModeStatus(NAS_ERABM_L_MODE_STATUS_NORMAL);

    #if 0
    /* 设置用户面模式为NULL */
    if (PS_SUCC != UP_SetRanMode(RAN_MODE_LTE))
    {
        NAS_ERABM_ERR_LOG("NAS_ERABM_RcvRabmEmmResumeInd: Update Ran Mode Failed.");
    }

    /*设置LTE模流控参数*/
    R_ITF_SetLFlowLev();
    #endif

    /*根据TFT和承载信息更新IP Filter到硬件加速器*/
    if(PS_FAIL == NAS_ERABM_IpfConfigUlFilter())
    {
        NAS_ERABM_ERR_LOG("NAS_ERABM_EsmMsgDistr: IPF Update IP Filter Failed.");
    }

    /*根据TFT和承载信息更新IP Filter到CDS*/
    if(PS_FAIL == NAS_ERABM_CdsConfigUlFilter())
    {
        NAS_ERABM_ERR_LOG("NAS_ERABM_EsmMsgDistr: CDS Update IP Filter Failed.");
    }
    #if 0
    /* 配置下行TFT信息 */
    if(PS_FAIL == NAS_ERABM_IpfConfigDlFilter())
    {
        NAS_ERABM_ERR_LOG("NAS_ERABM_RcvRabmEmmResumeInd: Update DL IP Filter Failed.");
    }
    #endif

    /* 通知ETC解挂 */
    NAS_ERABM_SndRabmTcResumeInd();

    /* 回复EMM解挂成功 */
    NAS_ERABM_SndRabmEmmResumeRsp(EMM_ERABM_RSLT_TYPE_SUCC);
}
VOS_VOID NAS_ERABM_Init(VOS_VOID)
{
    VOS_UINT8                     ucTimerIndex  = 0;
    VOS_UINT32                    ulEpsbId      = 0;
    VOS_UINT32                    ulLoop        = 0;
    APP_ESM_IP_ADDR_STRU         *pstPdnAddr    = VOS_NULL_PTR;

    /*打印进入该函数*/
    NAS_ERABM_INFO_LOG("NAS_ERABM                          START INIT...");

    /*初始化RABM实体*/
    NAS_ERABM_MEM_SET((VOS_VOID*)NAS_ERABM_Entity(), NAS_ERABM_NULL, sizeof(NAS_ERABM_ENTITY_STRU));

    /* 初始化RABM统计信息 */
    NAS_ERABM_DebugInit();

    /*设置SERVICE流程没有启动状态*/
    NAS_ERABM_SetEmmSrState(NAS_ERABM_SERVICE_STATE_TERMIN);

    /*设置RABM没有等待EPS承载激活消息*/
    NAS_ERABM_SetWaitEpsBActSign(NAS_ERABM_NOT_WAIT_EPSB_ACT_MSG);

    /*设置L MODE的状态为SUSPENDED*/
    NAS_ERABM_SetLModeStatus(NAS_ERABM_L_MODE_STATUS_SUSPENDED);

    /*设置RRC请求建立RB的个数为0*/
    NAS_ERABM_SetRbNumInfo(0);

    /*设置唯一激活且没有TFT的承载号为NAS_ERABM_ILL_EPSB_ID*/
    NAS_ERABM_GetOnlyActiveAndNoUlTftEpsbId() = NAS_ERABM_ILL_EPSB_ID;

    /*设置不存在上行数据阻塞*/
    NAS_ERABM_SetUpDataPending(EMM_ERABM_NO_UP_DATA_PENDING);

    /*初始化定时器信息*/
    for ( ucTimerIndex = 0; ucTimerIndex < NAS_NAS_ERABM_TIMER_NAME_BUTT; ucTimerIndex++ )
    {
        NAS_ERABM_TimerStop(ucTimerIndex);
    }

    /*初始化EPS承载列表*/
    for (ulEpsbId = NAS_ERABM_MIN_EPSB_ID; ulEpsbId <= NAS_ERABM_MAX_EPSB_ID; ulEpsbId++)
    {
        pstPdnAddr = NAS_ERABM_GetEpsbPdnAddr(ulEpsbId);
        NAS_ERABM_SetEpsbIdInfo(ulEpsbId, ulEpsbId);
        NAS_ERABM_SetEpsbRbIdInfo(ulEpsbId, NAS_ERABM_ILL_RB_ID);
        NAS_ERABM_SetRbStateInfo(ulEpsbId, NAS_ERABM_RB_DISCONNECTED);
        NAS_ERABM_MEM_SET(pstPdnAddr, NAS_ERABM_NULL, sizeof(APP_ESM_IP_ADDR_STRU));
        NAS_ERABM_ClearEpsbResource(ulEpsbId);
    }

    /*初始化RB建立临时表信息*/
    for (ulLoop = 0; ulLoop < NAS_ERABM_MAX_EPSB_NUM; ulLoop++)
    {
        NAS_ERABM_SetRbSetupEpsbIdInfo(ulLoop, NAS_ERABM_ILL_EPSB_ID);
        NAS_ERABM_SetRbSetupRbIdInfo(ulLoop, NAS_ERABM_ILL_RB_ID);
    }

    /*初始化RABM灌包相关信息*/
    NAS_ERABM_StAppDataBitIpv4(NAS_ERABM_OP_FALSE);
    NAS_ERABM_StAppDataBitIpv6(NAS_ERABM_OP_FALSE);
    NAS_ERABM_SetAppDataRmtPortIpv4(NAS_ERABM_NULL);
    NAS_ERABM_SetAppDataRmtPortIpv6(NAS_ERABM_NULL);
    NAS_ERABM_SetAppDataOperateType(APP_ERABM_DATA_TRANS_OPERATE_BUTT);
    NAS_ERABM_MEM_SET(NAS_ERABM_GetAppDataRemoteIpv4Addr(), NAS_ERABM_NULL,\
                sizeof(NAS_ERABM_GetAppDataRemoteIpv4Addr())/sizeof(VOS_UINT8));
    NAS_ERABM_MEM_SET(NAS_ERABM_GetAppDataRemoteIpv6Addr(), NAS_ERABM_NULL,\
                sizeof(NAS_ERABM_GetAppDataRemoteIpv6Addr())/sizeof(VOS_UINT8));

    NAS_ERABM_MEM_SET(NAS_ERABM_GET_IP_HEADER_BUFFER(), NAS_ERABM_NULL, NAS_ERABM_IP_HEADER_BUFFER_LEN);

    NAS_ERABM_MEM_SET(  NAS_ERABM_GetIpv4SegBuffAddr(),
                        NAS_ERABM_NULL,
                        sizeof(NAS_ERABM_IPV4_SEGMENT_BUFF_STRU));

    #if 0
    /* 初始化下行IP需要使用的IP Filter定义 */
    NAS_ERABM_IpfDefDlFilter();
    #endif

    /* 初始化上行NDIS Filter有效 */
    NAS_ERABM_SetUlNdisFilterValidFlag(NAS_ERABM_UL_NDIS_FILTER_INVALID);

    /* 初始化上行NDIS需要使用的IP Filter定义 */
    NAS_ERABM_IpfUlNdisFilterInit();

    /* 初始化IPF统计信息 */
    NAS_ERABM_IpfOmInit();
}