/*****************************************************************************
 Function Name   : NAS_ERABM_GetEpsbIdByDrbId
 Description     : 根据DRB号获取EPS承载号
 Input           : ulRbId-------------------DRB号
 Output          : pulEpsbId----------------承载号指针
 Return          : VOS_UINT32

 History         :
    1.lihong00150010      2011-12-06  Draft Enact

*****************************************************************************/
VOS_UINT32 NAS_ERABM_GetEpsbIdByDrbId
(
    VOS_UINT32                           ulRbId,
    VOS_UINT32                          *pulEpsbId
)
{
    VOS_UINT32                     ulEpsbId   = NAS_ERABM_NULL;

    /*找到RBID对应的EPS承载*/
    for (ulEpsbId = NAS_ERABM_MIN_EPSB_ID; ulEpsbId <= NAS_ERABM_MAX_EPSB_ID; ulEpsbId++)
    {
        if (NAS_ERABM_EPSB_ACTIVE != NAS_ERABM_GetEpsbStateInfo(ulEpsbId))
        {
            continue;
        }

        if (NAS_ERABM_GetEpsbRbIdInfo(ulEpsbId) == ulRbId)
        {
            *pulEpsbId = ulEpsbId;
            return NAS_ERABM_SUCCESS;
        }
    }

    return NAS_ERABM_FAILURE;
}
/*****************************************************************************
 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);
}
CDS_ERABM_TRANSFER_RESULT_ENUM_UINT32 CDS_ERABM_GetDrbId
(
    VOS_UINT8                           ucEpsbId,
    VOS_UINT8                          *pucDrbId
)
{
     /* 上行收到数据包增加统计 */
    NAS_ERABM_AddUlReceivePackageNum();

    /* 输入参数合法性检测 */
    if (VOS_NULL_PTR == pucDrbId)
    {
        NAS_ERABM_ERR_LOG("CDS_ERABM_GetDrbId:pucDrbId is NULL!");

        /* 上行丢弃数据包增加统计 */
        NAS_ERABM_AddUlDiscardPackageNum();

        return PS_FAIL;
    }

    if ((ucEpsbId < NAS_ERABM_MIN_EPSB_ID) || (ucEpsbId > NAS_ERABM_MAX_EPSB_ID))
    {
        NAS_ERABM_ERR_LOG("CDS_ERABM_GetDrbId:EpsbId is illegal!");

        /* 上行丢弃数据包增加统计 */
        NAS_ERABM_AddUlDiscardPackageNum();

        return CDS_ERABM_TRANSFER_RESULT_FAIL;
    }

    if (NAS_ERABM_RB_CONNECTED == NAS_ERABM_GetRbStateInfo(ucEpsbId))
    {
        *pucDrbId = (VOS_UINT8)NAS_ERABM_GetEpsbRbIdInfo(ucEpsbId);

        /* 增加上行发送总数据包数 */
        NAS_ERABM_AddUlSendPackageNum();

        /* 增加承载上行发送总数据包数 */
        NAS_ERABM_AddBearerSendPackageNum((VOS_UINT32)ucEpsbId);

        return CDS_ERABM_TRANSFER_RESULT_SUCC;
    }
    else if(NAS_ERABM_RB_SUSPENDED == NAS_ERABM_GetRbStateInfo(ucEpsbId))
    {
        /* 设置上行数据阻塞标志*/
        NAS_ERABM_SetUpDataPending(EMM_ERABM_UP_DATA_PENDING);
        NAS_ERABM_LOG1("CDS_ERABM_GetDrbId:DRB_SUSPENDED, set data pending = ",NAS_ERABM_GetUpDataPending());

        *pucDrbId = (VOS_UINT8)NAS_ERABM_GetEpsbRbIdInfo(ucEpsbId);

        /* 增加上行Suspend总数据包数 */
        NAS_ERABM_AddUlSuspendPackageNum();

        /* 增加承载上行Suspend总数据包数 */
        NAS_ERABM_AddBearerSuspendPackageNum((VOS_UINT32)ucEpsbId);

        return CDS_ERABM_TRANSFER_RESULT_DRB_SUSPEND;
    }
    else
    {
        /* 判断是否处于连接态 */
        if (NAS_ERABM_SUCCESS == NAS_ERABM_IsAllActtiveBearerWithoutDrb())
        {
            /* 设置上行数据阻塞标志*/
            NAS_ERABM_SetUpDataPending(EMM_ERABM_UP_DATA_PENDING);
            NAS_ERABM_LOG1("CDS_ERABM_GetDrbId:AllActtiveBearerWithoutDrb, set data pending = ",NAS_ERABM_GetUpDataPending());


            /* 增加上行IDLE总数据包数 */
             NAS_ERABM_AddUlIdlePackageNum();

            /* 增加承载上行IDLE总数据包数 */
            NAS_ERABM_AddBearerIdlePackageNum((VOS_UINT32)ucEpsbId);

            return CDS_ERABM_TRANSFER_RESULT_IDLE;
        }

        /* 对于当前处于连接态,但承载对应的DRB不存在这种暂态,暂时先返回
           CDS_ERABM_TRANSFER_RESULT_FAIL,由CDS释放内存,后续优化时再返回
           CDS_ERABM_TRANSFER_RESULT_DRB_NOT_EXIST,由CDS负责缓存数据包。*/

        /* 上行丢弃数据包增加统计 */
        NAS_ERABM_AddUlDiscardPackageNum();

        /* 承载上行丢弃数据包增加统计 */
        NAS_ERABM_AddBearerDiscardPackageNum((VOS_UINT32)ucEpsbId);

        return APP_ERABM_TRANSFER_RESULT_FAIL;
    }
}