Пример #1
0
VOS_VOID CDS_FreeIpfDlSrcMem(VOS_VOID)
{
    LUP_QUEUE_STRU                   *pstDlFreeQue ;
    BSP_U32                           ulIdleCD;
    VOS_UINT32                        ulIdleBD;
    VOS_UINT32                        ulBusyBD;
    VOS_UINT32                        ulCanFree;
    VOS_UINT32                        ulQueCnt;
    VOS_UINT32                        ulCnt;
    TTF_MEM_ST                       *pstSrcTtf;

    pstDlFreeQue = CDS_IPF_DL_SRCMEM_FREE_QUE();
    CDS_ASSERT(VOS_NULL_PTR != pstDlFreeQue);

    ulQueCnt = LUP_QueCnt(pstDlFreeQue);
    if (0 == ulQueCnt)
    {
        return;
    }

    /*get busy bd num*/
    ulIdleBD = BSP_IPF_GetDlBDNum(&ulIdleCD);
    ulBusyBD = IPF_DLBD_DESC_SIZE - ulIdleBD;
    if (ulQueCnt >= ulBusyBD)
    {
        ulCanFree = ulQueCnt - ulBusyBD;
    }
    else
    {
        CDS_ERROR_LOG3(UEPS_PID_CDS, "CDS_FreeIpfDlSrcMem:Buff Num Less IPF Busy BD Num.quecnt,busybd,idlebd",ulQueCnt,ulBusyBD,ulIdleBD);
        vos_printf("CDS_FreeIpfDlSrcMem : src free que less than busy bd. quecnt=%d,busybd=%d,idlebd=%d.\n",ulQueCnt,ulBusyBD,ulIdleBD);
        CDS_DBG_DL_IPF_FREE_SRCMEM_ERROR(1);
        return;
    }

    /*free src mem*/
    for (ulCnt = 0; ulCnt < ulCanFree; ulCnt ++)
    {
        if (PS_SUCC != LUP_DeQue(pstDlFreeQue,&pstSrcTtf))
        {
            return;
        }

        TTF_MemFree(UEPS_PID_CDS,pstSrcTtf);
        CDS_DBG_DL_IPF_FREE_SRCMEM_NUM(1);
    }

    return;
}
VOS_BOOL QosFc_IsDiscard(VOS_UINT8 ucRabId, MODEM_ID_ENUM_UINT16 enModemId)
{
    static VOS_UINT32  ulPktCntVal = 0;         /* 包计数 */
    VOS_UINT32 ulRandValue = 0;

    if(VOS_TRUE != g_stQosFcCtrl.bQosFcEnable)
    {
        /* 流控没打开,不进流控状态 */
        return VOS_FALSE;
    }

    ulPktCntVal++;
    if(ulPktCntVal >= g_stQosFcCtrl.ulPktCntLimit)
    {
        ulPktCntVal = 0;
        QosFc_FlowCtrl();
    }

    if(QosFc_IsInValidRabId(ucRabId))
    {
        CDS_ERROR_LOG1(UEPS_PID_CDS,"QosFc_IsDiscard : Error RabId: ", ucRabId);
        /* 非法承载,丢包 */
        return VOS_TRUE;
    }

    switch( g_enRabState[enModemId][ucRabId - 5] )
    {
        case QOS_FC_RAB_STATE_NORMAL:
        case QOS_FC_RAB_STATE_NOT_DISCARD:
            /* 正常数传状态,不丢包 */
            return VOS_FALSE;

        case QOS_FC_RAB_STATE_RANDOM_DISCARD:
            FC_DBG_RCV_PKT_ONRD_STAT(enModemId, ucRabId, 1);
            /* 随机丢包 */
            ulRandValue = PS_RAND(101);
            if(ulRandValue > g_stQosFcCtrl.ulRandomDiscardRate)
            {
                return VOS_FALSE;
            }
            FC_DBG_DISCARD_PKT_ONRD_STAT(enModemId, ucRabId, 1);
            return VOS_TRUE;
        case QOS_FC_RAB_STATE_DISCARD:
            FC_DBG_RCV_PKT_OND_STAT(enModemId, ucRabId, 1);
            /* 丢包 */
            ulRandValue = PS_RAND(101);
            if(ulRandValue > g_stQosFcCtrl.ulDiscardRate)
            {
                return VOS_FALSE;
            }
            FC_DBG_DISCARD_PKT_OND_STAT(enModemId, ucRabId, 1);
            return VOS_TRUE;
        default:
             /* 非法状态 */
             CDS_ERROR_LOG3(UEPS_PID_CDS, "QosFc_IsDiscard : Rab invalid state::",enModemId, ucRabId, g_enRabState[enModemId][ucRabId - 5]);
             break;

    }

    /* 尽量不丢包 */
    return VOS_FALSE;
}
VOS_VOID QosFc_RabCreate(CONST MsgBlock  *pstMsg)
{
    QOS_FC_RAB_CREATE_IND_STRU *pstRabCreate = (QOS_FC_RAB_CREATE_IND_STRU *)(VOS_VOID*)pstMsg;
    QOS_FC_RAB_ENTITY_STRU *pstQosFcRabEntity = VOS_NULL_PTR;
    QCI_TYPE_ENUM_UINT8     enQci;
    VOS_UINT8               ucOldLinkRabId = FC_INVALID_RABID;
    MODEM_ID_ENUM_UINT16    enModemId;

    FC_DBG_CREATE_MSG_STAT(1);

    /*入参判断*/
    if (VOS_NULL_PTR == pstRabCreate)
    {
        CDS_ERROR_LOG(UEPS_PID_CDS, "QosFc_RabCreate : NULL pointer");
        return;
    }

    /*lint -e960*/
    if(QosFc_IsInValidRabId(pstRabCreate->ucRabId)
        || QosFc_IsInValidRabId(pstRabCreate->ucLinkRabId)
        || (pstRabCreate->enQci < QCI_TYPE_QCI1_GBR)
        || (pstRabCreate->enQci > QCI_TYPE_QCI9_NONGBR))
    {
        CDS_ERROR_LOG3(UEPS_PID_CDS, "QosFc_RabCreate : Invalid MSG RabId: LinkRabId: Qci:",
                                pstRabCreate->ucRabId, pstRabCreate->ucLinkRabId, pstRabCreate->enQci);
        return;
    }
    /*lint +e960*/

    /* 流控都按拼接处理 */
    enModemId = VOS_GetModemIDFromPid(TTF_GET_MSG_SENDER_PID(pstRabCreate));
    if (MODEM_ID_BUTT <= enModemId)
    {
        CDS_ERROR_LOG1(UEPS_PID_CDS, "QosFc_RabCreate : ModemId Error",enModemId);
        return;
    }

    /*lint -e734*/
    pstRabCreate->ucRabId |= (enModemId << FC_MODEMID_SHIFT);
    pstRabCreate->ucLinkRabId |= (enModemId << FC_MODEMID_SHIFT);
    /*lint +e734*/

    pstQosFcRabEntity = QosFc_CreateRabEntity(pstRabCreate, &ucOldLinkRabId);

    if(VOS_NULL_PTR != pstQosFcRabEntity)
    {
        /* 获得PDN上最高的QCI */
        enQci = QosFc_GetPdnQci(pstRabCreate->ucLinkRabId);
        QosFc_UpdateChannelQos(pstRabCreate->ucLinkRabId, enQci);
        /* 新建承载处于非流控状态,打开数传通道 */
        QosFc_ChannelRestore(pstRabCreate->ucLinkRabId);

        if((FC_INVALID_RABID != ucOldLinkRabId)
                && (ucOldLinkRabId != pstRabCreate->ucLinkRabId))
        {
            /* 获得PDN上最高的QCI */
            enQci = QosFc_GetPdnQci(ucOldLinkRabId);
            QosFc_UpdateChannelQos(ucOldLinkRabId, enQci);
            /* PDN是否需要流控 */
            /*lint -e960*/
            if((QCI_TYPE_BUTT != enQci) && (FC_INVALID_RABID == QosFc_OtherAvailRabOfPdn(ucOldLinkRabId)))
            /*lint +e960*/
            {
                QosFc_ChannelControl(ucOldLinkRabId);
            }
        }
    }

    return;

}