Example #1
0
VOS_UINT32 ADS_UL_CreateQueue(
    VOS_UINT8                           ucInstanceIndex,
    VOS_UINT8                           ucRabId,
    ADS_QCI_TYPE_ENUM_UINT8             enPrio,
    ADS_CDS_IPF_PKT_TYPE_ENUM_UINT8     enPktType
)
{
    IMM_ZC_HEAD_STRU                   *pstUlQueue;
    ADS_UL_CTX_STRU                    *pstAdsUlCtx;

    pstAdsUlCtx = ADS_GetUlCtx(ucInstanceIndex);

    /* RabId的队列已经存在 */
    if (VOS_OK == ADS_UL_IsQueueExistent(ucInstanceIndex, ucRabId))
    {
        /* 对应的调度优先级也一样或者是比之前的要低,不更新QCI直接返回OK */
        if (enPrio >= pstAdsUlCtx->astAdsUlQueue[ucRabId].enPrio)
        {
            return VOS_OK;
        }
        /* 如果对应的调度优先级比之前的要高,需要更新该PDP的队列优先级,并对队列管理进行排序 */
        else
        {
            ADS_UL_UpdateQueueInPdpModified(ucInstanceIndex, enPrio, ucRabId);
            return VOS_OK;
        }
    }

    /* ucRabID的队列不存在, 需要创建队列头结点 */
    pstUlQueue = (IMM_ZC_HEAD_STRU *)PS_MEM_ALLOC(ACPU_PID_ADS_UL, sizeof(IMM_ZC_HEAD_STRU));

    if (VOS_NULL_PTR == pstUlQueue)
    {
        ADS_ERROR_LOG(ACPU_PID_ADS_UL, "ADS_UL_CreateQueue: pstUlQueue is null");
        return VOS_ERR;
    }

    /* 队列初始化 */
    IMM_ZcQueueHeadInit(pstUlQueue);

    /* 将队列信息更新到上行上下文 */
    ADS_UL_SetQueue(ucInstanceIndex,
                    ucRabId,
                    VOS_TRUE,
                    pstUlQueue,
                    enPrio,
                    enPktType);

    /* 队列不可能被用尽,一个RABID对应一个队列,而无效的已经在消息处理处屏蔽,
       故不需要判断是否满,可以直接重新排序 */
    ADS_UL_OrderQueueIndex(ucInstanceIndex, ucRabId);

    /*lint -e429*/
    return VOS_OK;
    /*lint +e429*/
}
VOS_UINT32 ADS_UL_ProcPdpStatusInd(
    MODEM_ID_ENUM_UINT16                enModemId,
    VOS_UINT8                           ucRabId,
    ADS_PDP_STATUS_ENUM_UINT8           enPdpStatus,
    ADS_QCI_TYPE_ENUM_UINT8             enQciType,
    ADS_PDP_TYPE_ENUM_UINT8             enPdpType
)
{
    VOS_UINT8                           ucInstanceIndex;
    ADS_CDS_IPF_PKT_TYPE_ENUM_UINT8     enPktType;
    ADS_QCI_TYPE_ENUM_UINT8             enPrio;

    enPktType                           = ADS_CDS_IPF_PKT_TYPE_IP;

    ucInstanceIndex                     = (VOS_UINT8)enModemId;

    enPrio                              = enQciType;

    /* RabId合法性检查 */
    if (VOS_OK != ADS_IsValidRabId(ucRabId))
    {
        ADS_WARNING_LOG1(ACPU_PID_ADS_UL, "ADS_UL_ProcPdpStatusInd: ucRabId is ", ucRabId);
        return VOS_ERR;
    }

    /* 如果不采用优先级,则修改所有PDP的QCI为相同优先级,根据排序算法这样可以使先激活的PDP优先处理 */
    if (VOS_FALSE == g_stAdsCtx.astAdsSpecCtx[ucInstanceIndex].stAdsUlCtx.stQueuePriNv.ulStatus)
    {
        enPrio = ADS_QCI_TYPE_QCI9_NONGBR;
    }

    if (ADS_PDP_PPP == enPdpType)
    {
        enPktType = ADS_CDS_IPF_PKT_TYPE_PPP;
    }

    /* 根据PDP状态分别进行处理 */
    switch(enPdpStatus)
    {
        /* PDP激活 */
        case ADS_PDP_STATUS_ACT:

            /* 创建缓存队列 */
            ADS_UL_CreateQueue(ucInstanceIndex, ucRabId, enPrio, enPktType);

            /* 启动流量统计 */
            ADS_UL_StartDsFlowStats(ucInstanceIndex, ucRabId);

            /* 启动上报统计信息定时器 */
            ADS_UL_StartRptStatsInfoTimer(ucInstanceIndex, ucRabId);

            break;

        /* PDP修改 */
        case ADS_PDP_STATUS_MODIFY:

            /* 将修改的队列信息更新到上行队列管理中 */
            ADS_UL_UpdateQueueInPdpModified(ucInstanceIndex, enPrio, ucRabId);

            break;

        /* PDP去激活 */
        case ADS_PDP_STATUS_DEACT:

            /* 销毁缓存队列 */
            ADS_UL_DestroyQueue(ucInstanceIndex, ucRabId);

#if(FEATURE_OFF == FEATURE_SKB_EXP)
            /* 当所有的PDP都去激活后,清空源内存队列 */
            ADS_UL_ClearIpfUlSrcMem();
#endif

            /* 停止流量统计 */
            ADS_UL_StopDsFlowStats(ucInstanceIndex, ucRabId);

            /* 关闭上报统计信息定时器 */
            ADS_UL_StopRptStatsInfoTimer();

            break;

        default:
            break;
    }

    return VOS_OK;
}