コード例 #1
0
VOS_VOID NAS_RABM_RcvCdsServiceInd(
    CDS_RABM_SERVICE_IND_STRU          *pstCdsServiceInd
)
{
    /* 检查RABID有效性 */
    if (!RAB_MAP_RAB_IS_VALID(pstCdsServiceInd->ucRabId))
    {
        NAS_ERROR_LOG1(WUEPS_PID_RABM,
                       "NAS_RABM_RcvCdsServiceInd: Invalid RABID. <RABID>", pstCdsServiceInd->ucRabId);
        return;
    }

    switch (NAS_RABM_GetWPsEntState(pstCdsServiceInd->ucRabId - RABM_NSAPI_OFFSET))
    {
    case RABM_NSAPI_ACTIVE_WITH_RAB:
        NAS_NORMAL_LOG1(WUEPS_PID_RABM,
                        "NAS_RABM_RcvCdsServiceInd: RABID is already active. <RABID>", pstCdsServiceInd->ucRabId);
        NAS_RABM_SndCdsSendBuffDataInd(pstCdsServiceInd->ucRabId, CDS_RABM_SEND_BUFF_DATA_ALLOWED_TYPE_SERVICE_SUCC);
        break;

    case RABM_NSAPI_ACTIVE_NO_RAB:
        if (VOS_TRUE == NAS_RABM_GetWPsEntRabReestFlg(pstCdsServiceInd->ucRabId - RABM_NSAPI_OFFSET))
        {
            NAS_NORMAL_LOG1(WUEPS_PID_RABM,
                            "NAS_RABM_RcvCdsServiceInd: Reestablish is in process. <RABID>", pstCdsServiceInd->ucRabId);
        }
        else if (VOS_TRUE == NAS_RABM_IsDataServiceRequestPending())
        {
            NAS_NORMAL_LOG1(WUEPS_PID_RABM,
                            "NAS_RABM_RcvCdsServiceInd: Data service request is sent, set reestablish flag. <RABID>", pstCdsServiceInd->ucRabId);
            NAS_RABM_SetWPsEntRabReestFlg(pstCdsServiceInd->ucRabId - RABM_NSAPI_OFFSET);
        }
        else if (VOS_TRUE == NAS_RABM_IsRabReestablishPending())
        {
            NAS_NORMAL_LOG1(WUEPS_PID_RABM,
                            "NAS_RABM_RcvCdsServiceInd: Start RB setup protect timer. <RABID>", pstCdsServiceInd->ucRabId);
            NAS_RABM_SetWPsEntRabReestFlg(pstCdsServiceInd->ucRabId - RABM_NSAPI_OFFSET);
            NAS_RABM_StartReestRabPendingTmr(pstCdsServiceInd->ucRabId);
        }
        else
        {
            NAS_NORMAL_LOG1(WUEPS_PID_RABM,
                            "NAS_RABM_RcvCdsServiceInd: Send data service request.  <RABID>", pstCdsServiceInd->ucRabId);
            NAS_RABM_SetWPsEntRabReestFlg(pstCdsServiceInd->ucRabId - RABM_NSAPI_OFFSET);
            NAS_RABM_SetRabRsestTimerFlg();
            RABM_TimerStart(RABM_REESTABLISH_REQ_SENT, RABM_RABM_REEST_PROT_TIMER_LEN);
            RABM_SndRabReestReq();
        }
        break;

    default:
        NAS_WARNING_LOG1(WUEPS_PID_RABM,
                         "NAS_RABM_RcvCdsServiceInd: Can't reestablish RAB. <RABID>", pstCdsServiceInd->ucRabId);
        NAS_RABM_SndCdsFreeBuffDataInd(pstCdsServiceInd->ucRabId);
        break;
    }

    return;
}
コード例 #2
0
VOS_VOID RABM_ComSaveRabPara(
                         RRRABM_RAB_IND_STRU  *pMsg                             /* 目前处理的消息                           */
                         )
{
    VOS_UINT8                           i;
    VOS_UINT8                           j;
    VOS_UINT8                           ucEntId = 0xff;
    VOS_UINT8                           ucTcFlg = RABM_FALSE;
    VOS_UINT16                          k;
    VOS_UINT8                           ucChgMask;

    for(i = 0; i < pMsg->ulRabCnt; i++)
    {
        if(RABM_CN_PS == pMsg->aRabInfo[i].ulCnDomainId)
        {                                                                       /* 是PS域的RAB                              */
            if ( VOS_TRUE == gRabm2GTo3GDataResume )
            {
                /*复位2G向3G切换使用的数传恢复标志:*/
                gRabm2GTo3GDataResume = VOS_FALSE;

                /*向PDCP发送2G向3G切换的数传恢复指示:*/
                NAS_RabmSndPdcpDataResumeInd(pMsg);
            }

            if ( (RABM_TC_NO_START != g_RabmTcInf.ucTcStartSta)
              && ((pMsg->aRabInfo[i].ulRabId & 0x0f) < RABM_NSAPI_OFFSET) )
            {
                ucEntId = (VOS_UINT8)(pMsg->aRabInfo[i].ulRabId & 0x0f);
            }
            else
            {
                if ((pMsg->aRabInfo[i].ulRabId & 0x0f) < RABM_NSAPI_OFFSET)
                {
                   continue;
                }

                ucEntId = (VOS_UINT8)
                ((pMsg->aRabInfo[i].ulRabId & 0x0f) - RABM_NSAPI_OFFSET);       /* 获得PS域的RABM实体ID                     */
            }

            switch(g_aRabmPsEnt[ucEntId].ucState)
            {                                                                   /* 根据实体状态作相应处理                   */
            case RABM_NULL:
                break;
            case RABM_NSAPI_ACTIVE_PENDING:
                if(RABM_TC_NO_START != g_RabmTcInf.ucTcStartSta)
                {
                    Rabm_TcInfSave(pMsg, i);
                }
                RABM_SetWState(ucEntId, RABM_ACT_PENDING_WITH_RAB);             /* 改变实体的状态                           */
                PS_LOG(WUEPS_PID_RABM, VOS_NULL, PS_PRINT_NORMAL, "RABM_ComSaveRabPara:NORMAL:RABM state: RABM_NSAPI_ACTIVE_PENDING ==> RABM_ACT_PENDING_WITH_RAB");
                g_aRabmPsEnt[ucEntId].RabInfo.ucRabId =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRabId);                         /* 保存RAB ID                               */
                g_aRabmPsEnt[ucEntId].RabInfo.ucRbNum =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRbNum);                         /* 保存RB的个数                             */

                for ( j = 0 ; j < g_aRabmPsEnt[ucEntId].RabInfo.ucRbNum ; j++ )
                {
                    g_aRabmPsEnt[ucEntId].RabInfo.aucRbId[j] =
                        (VOS_UINT8)(pMsg->aRabInfo[i].aulRbId[j]);                  /* 保存RB ID                                */

                    g_aRabmPsEnt[ucEntId].RabInfo.aucRbTxMode[j] =
                        (VOS_UINT8)(pMsg->aRabInfo[i].aenUlRlcMode[j]);             /* 保存RB 的传输模式 */
                }

                /*此时RAB_MAP表的实体并未创建,无需更新RAB_MAP中的ucAsId*/
                break;
            case RABM_NSAPI_ACTIVE_NO_RAB:
                if(RABM_TC_NO_START != g_RabmTcInf.ucTcStartSta)
                {
                    Rabm_TcInfSave(pMsg, i);
                }
                g_aRabmPsEnt[ucEntId].RabInfo.ucRabId =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRabId);                         /* 保存RAB ID                               */
                g_aRabmPsEnt[ucEntId].RabInfo.ucRbNum =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRbNum);                         /* 保存RB的个数                             */

                for ( j = 0 ; j < g_aRabmPsEnt[ucEntId].RabInfo.ucRbNum ; j++ )
                {
                    g_aRabmPsEnt[ucEntId].RabInfo.aucRbId[j] =
                        (VOS_UINT8)(pMsg->aRabInfo[i].aulRbId[j]);                  /* 保存RB ID                                */
                    g_aRabmPsEnt[ucEntId].RabInfo.aucRbTxMode[j] =
                        (VOS_UINT8)(pMsg->aRabInfo[i].aenUlRlcMode[j]);             /* 保存RB 的传输模式 */
                }


                RABM_SetWState(ucEntId, RABM_NSAPI_ACTIVE_WITH_RAB);            /* 改变实体的状态                           */
                PS_LOG(WUEPS_PID_RABM, VOS_NULL, PS_PRINT_NORMAL, "RABM_ComSaveRabPara:NORMAL:RABM state: RABM_NSAPI_ACTIVE_NO_RAB ==> RABM_NSAPI_ACTIVE_WITH_RAB");

                /*更新RAB_MAP表中的ucAsId*/
                ucChgMask = 0;
                ucChgMask |= RAB_MAP_CHG_MASK_AS_ID;
                RABM_ChgRabMap(ucEntId + RABM_NSAPI_OFFSET,
                               ucChgMask,
                               g_aRabmPsEnt[ucEntId].RabInfo.aucRbId[0],
                               VOS_NULL_PTR,
                               VOS_NULL_PTR);

                if (VOS_TRUE == NAS_RABM_GetWPsEntRabReestFlg(ucEntId))
                {
                    /* 停止RB建立保护定时器 */
                    NAS_RABM_StopReestRabPendingTmr(ucEntId + RABM_NSAPI_OFFSET);

                    /* 清除RABM实体的重建标识 */
                    NAS_RABM_ClearWPsEntRabReestFlg(ucEntId);

                    g_aRabmPsEnt[ucEntId].ucStpFlg = RABM_FALSE;
                    RABM_SaveDataProcess(ucEntId, RABM_UPLINK);                 /* 处理缓存的上行数据                       */

                    /* 通知CDS发送缓存数据 */
                    NAS_RABM_SndCdsSendBuffDataInd(ucEntId + RABM_NSAPI_OFFSET,
                                                   CDS_RABM_SEND_BUFF_DATA_ALLOWED_TYPE_SERVICE_SUCC);
                }
                break;
            case RABM_ACT_PENDING_WITH_RAB:
                g_aRabmPsEnt[ucEntId].RabInfo.ucRabId =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRabId);                         /* 保存RAB ID                               */
                g_aRabmPsEnt[ucEntId].RabInfo.ucRbNum =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRbNum);                         /* 保存RB的个数                             */

                for ( j = 0 ; j < g_aRabmPsEnt[ucEntId].RabInfo.ucRbNum ; j++ )
                {
                    g_aRabmPsEnt[ucEntId].RabInfo.aucRbId[j] =
                            (VOS_UINT8)(pMsg->aRabInfo[i].aulRbId[j]);              /* 保存RB ID                                */
                    g_aRabmPsEnt[ucEntId].RabInfo.aucRbTxMode[j] =
                        (VOS_UINT8)(pMsg->aRabInfo[i].aenUlRlcMode[j]);             /* 保存RB 的传输模式 */
                }

                /*此时RAB_MAP表的实体并未创建,无需更新RAB_MAP中的ucAsId*/
                break;
            case RABM_NSAPI_ACTIVE_WITH_RAB:
            case RABM_DATA_TRANSFER_STOP:
                g_aRabmPsEnt[ucEntId].RabInfo.ucRabId =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRabId);                         /* 保存RAB ID                               */
                g_aRabmPsEnt[ucEntId].RabInfo.ucRbNum =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRbNum);                         /* 保存RB的个数                             */

                for ( j = 0 ; j < g_aRabmPsEnt[ucEntId].RabInfo.ucRbNum ; j++ )
                {
                    g_aRabmPsEnt[ucEntId].RabInfo.aucRbId[j] =
                            (VOS_UINT8)(pMsg->aRabInfo[i].aulRbId[j]);              /* 保存RB ID                                */
                    g_aRabmPsEnt[ucEntId].RabInfo.aucRbTxMode[j] =
                        (VOS_UINT8)(pMsg->aRabInfo[i].aenUlRlcMode[j]);             /* 保存RB 的传输模式 */
                }

                /*更新RAB_MAP表中的ucAsId*/
                ucChgMask = 0;
                ucChgMask |= RAB_MAP_CHG_MASK_AS_ID;
                RABM_ChgRabMap(ucEntId + RABM_NSAPI_OFFSET,
                               ucChgMask,
                               g_aRabmPsEnt[ucEntId].RabInfo.aucRbId[0],
                               VOS_NULL_PTR,
                               VOS_NULL_PTR);
                break;
            case RABM_TC_STATE_NULL:
                g_aRabmPsEnt[ucEntId].RabInfo.ucRabId =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRabId);                         /* 保存RAB ID                               */
                g_aRabmPsEnt[ucEntId].RabInfo.ucRbNum =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRbNum);                         /* 保存RB的个数                             */

                for ( j = 0 ; j < pMsg->aRabInfo[i].ulRbNum ; j++ )
                {
                    g_aRabmPsEnt[ucEntId].RabInfo.aucRbId[j] =
                        (VOS_UINT8)(pMsg->aRabInfo[i].aulRbId[j]);              /* 保存RB ID                                */
                    g_aRabmPsEnt[ucEntId].RabInfo.aucRbTxMode[j] =
                        (VOS_UINT8)(pMsg->aRabInfo[i].aenUlRlcMode[j]);             /* 保存RB 的传输模式 */
                }
                Rabm_TcInfSave(pMsg, i);
                break;
            default:
                break;
            }

            if(RABM_NSAPI_ACTIVE_WITH_RAB == g_aRabmPsEnt[ucEntId].ucState)
            {
                if(0 != g_aRabmPsEnt[ucEntId].DlDataSave.ucNum)
                {                                                               /* 有缓存的下行数据                         */
                    RABM_SaveDataProcess(ucEntId,RABM_DOWNLINK);                /* 处理缓存的下行数据                       */
                }
            }
        }
        else
        {
            if( NAS_RRC_RAB_SETUP_SUCCESS == pMsg->ulRabChangeType )
            {

                ucTcFlg = RABM_FALSE;
                for( j = 0; j < RABM_CS_MAX_ENT_NUM; j++ )
                {
                    for( k = 0; k < 256; k++ )
                    {
                        if ( g_aucSiMapEnt[k] == j )
                        {
                            break;
                        }
                    }

                    if( k < 256 )
                    {
                        continue;
                    }
                    if( RABM_NULL == g_aRabmCsEnt[j].ucState)
                    {
                        g_aucSiMapEnt[pMsg->aRabInfo[i].ulRabId] = j;
                        break;
                    }
                    else if(RABM_TC_NO_START != g_RabmTcInf.ucTcStartSta)
                    {
                        Rabm_TcInfSave(pMsg, i);
                        ucTcFlg = RABM_TRUE;
                        break;
                    }
                    else
                    {
                    }
                }
                if(RABM_TRUE == ucTcFlg)
                {
                    g_aucSiMapEnt[pMsg->aRabInfo[i].ulRabId] = j;
                    ucEntId = g_aucSiMapEnt[pMsg->aRabInfo[i].ulRabId];
                    g_aRabmCsEnt[ucEntId].RabInfo.ucRabId = (VOS_UINT8)(pMsg->aRabInfo[i].ulRabId);
                    g_aRabmCsEnt[ucEntId].RabInfo.ucRbNum = (VOS_UINT8)(pMsg->aRabInfo[i].ulRbNum);
                    for(j = 0; j < pMsg->aRabInfo[i].ulRbNum; j++)
                    {
                        g_aRabmCsEnt[ucEntId].RabInfo.aucRbId[j] = (VOS_UINT8)(pMsg->aRabInfo[i].aulRbId[j]);
                        g_aRabmCsEnt[ucEntId].RabInfo.aucRbTxMode[j] = (VOS_UINT8)(pMsg->aRabInfo[i].aenUlRlcMode[j]);
                    }
                    continue;
                }
                if( RABM_CS_MAX_ENT_NUM == j )
                {
                    PS_LOG(WUEPS_PID_RABM, VOS_NULL, PS_PRINT_WARNING, "RABM_ComSaveRabPara:WARNING:Exceed RABM_CS_MAX_ENT_NUM!");
                    return;
                }
            }
            ucEntId = g_aucSiMapEnt[pMsg->aRabInfo[i].ulRabId];

            for(j = 0; j < pMsg->aRabInfo[i].ulRbNum; j++)
            {
                g_aRabmCsEnt[ucEntId].RabInfo.aucRbTxMode[j] =
                        (VOS_UINT8)(pMsg->aRabInfo[i].aenUlRlcMode[j]);
            }
            switch(g_aRabmCsEnt[ucEntId].ucState)
            {
            case RABM_NULL:
                g_aRabmCsEnt[ucEntId].ucState = RABM_SI_ACTIVE_WITH_RAB;
                PS_LOG(WUEPS_PID_RABM, VOS_NULL, PS_PRINT_NORMAL, "RABM_ComSaveRabPara:NORMAL:RABM state: RABM_NULL ==> RABM_SI_ACTIVE_WITH_RAB");
                g_aRabmCsEnt[ucEntId].ucSi = (VOS_UINT8)pMsg->aRabInfo[i].ulRabId;  /* 存储SI                                   */

                RABM_SndCcSyncInd(RABMCC_RAB_ACTIVE, pMsg->aRabInfo[i].ulRabId);/* 通知cc                                   */

                RABM_SndCallSyncInd(RABMCALL_RAB_ACTIVE, &pMsg->aRabInfo[i]);   /* 通知CALL */
                g_aRabmCsEnt[ucEntId].RabInfo.ucRabId =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRabId);                         /* 保存RAB ID                               */
                g_aRabmCsEnt[ucEntId].RabInfo.ucRbNum =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRbNum);                         /* 保存RB的个数                             */
                for(j = 0; j < g_aRabmCsEnt[ucEntId].RabInfo.ucRbNum; j++)
                {                                                               /* 保存RB ID                                */
                    g_aRabmCsEnt[ucEntId].RabInfo.aucRbId[j] =
                        (VOS_UINT8)(pMsg->aRabInfo[i].aulRbId[j]);
                }
                break;

            case RABM_SI_ACTIVE_WITH_RAB:
                g_aRabmCsEnt[ucEntId].RabInfo.ucRabId =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRabId);                         /* 保存RAB ID                               */
                g_aRabmCsEnt[ucEntId].RabInfo.ucRbNum =
                    (VOS_UINT8)(pMsg->aRabInfo[i].ulRbNum);                         /* 保存RB的个数                             */
                for(j = 0; j < g_aRabmCsEnt[ucEntId].RabInfo.ucRbNum; j++)
                {                                                               /* 保存RB ID                                */
                    g_aRabmCsEnt[ucEntId].RabInfo.aucRbId[j] =
                        (VOS_UINT8)(pMsg->aRabInfo[i].aulRbId[j]);
                }
                break;
            default:
                break;
            }
        }
    }

    return;
}