VOS_VOID TAF_APS_QryAllRabDsFlowReportInfo( TAF_DSFLOW_REPORT_STRU *pstTotalDsFlowRptInfo ) { VOS_UINT8 ucRabId; VOS_UINT32 ulIndex; TAF_APS_DSFLOW_STATS_CTX_STRU *pstApsDsFlowCtx; TAF_DSFLOW_REPORT_STRU stDsFlowRptInfo; /* 获取流量统计上下文 */ pstApsDsFlowCtx = TAF_APS_GetDsFlowCtxAddr(); /* 对所有激活的RAB承载,依次查询流量上报信息 */ for ( ucRabId = TAF_APS_RAB_ID_MIN; ucRabId <= TAF_APS_RAB_ID_MAX; ucRabId++ ) { ulIndex = ucRabId - TAF_APS_RAB_ID_OFFSET; if (VOS_TRUE == pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ucRabActiveFlag) { /* 查询前先初始化为0 */ PS_MEM_SET(&stDsFlowRptInfo, 0, sizeof(TAF_DSFLOW_REPORT_STRU)); /* 获取指定RAB的流量上报信息 */ TAF_APS_QryDsFlowReportInfo(ucRabId, &stDsFlowRptInfo); /* 当前连接时间: 取各RAB中最大值 */ if (pstTotalDsFlowRptInfo->stCurrentFlowInfo.ulDSLinkTime < stDsFlowRptInfo.stCurrentFlowInfo.ulDSLinkTime) { pstTotalDsFlowRptInfo->stCurrentFlowInfo.ulDSLinkTime = stDsFlowRptInfo.stCurrentFlowInfo.ulDSLinkTime; } /* 当前发送速率,当前接收速率,当前连接发送流量,当前连接接收流量 :累加 */ pstTotalDsFlowRptInfo->ulCurrentReceiveRate += stDsFlowRptInfo.ulCurrentReceiveRate; pstTotalDsFlowRptInfo->ulCurrentSendRate += stDsFlowRptInfo.ulCurrentSendRate; TAF_APS_BIT64_ADD(pstTotalDsFlowRptInfo->stCurrentFlowInfo.ulDSReceiveFluxHigh, pstTotalDsFlowRptInfo->stCurrentFlowInfo.ulDSReceiveFluxLow, pstTotalDsFlowRptInfo->stCurrentFlowInfo.ulDSReceiveFluxHigh, pstTotalDsFlowRptInfo->stCurrentFlowInfo.ulDSReceiveFluxLow, stDsFlowRptInfo.stCurrentFlowInfo.ulDSReceiveFluxHigh, stDsFlowRptInfo.stCurrentFlowInfo.ulDSReceiveFluxLow); TAF_APS_BIT64_ADD(pstTotalDsFlowRptInfo->stCurrentFlowInfo.ulDSSendFluxHigh, pstTotalDsFlowRptInfo->stCurrentFlowInfo.ulDSSendFluxLow, pstTotalDsFlowRptInfo->stCurrentFlowInfo.ulDSSendFluxHigh, pstTotalDsFlowRptInfo->stCurrentFlowInfo.ulDSSendFluxLow, stDsFlowRptInfo.stCurrentFlowInfo.ulDSSendFluxHigh, stDsFlowRptInfo.stCurrentFlowInfo.ulDSSendFluxLow); } } /* 根据产品线要求,保持与Q的实现一致,QOS协商发送速率,QOS协商接收速率: 取0 */ pstTotalDsFlowRptInfo->ulQosReceiveRate = 0; pstTotalDsFlowRptInfo->ulQosSendRate = 0; return; }
VOS_VOID TAF_APS_UpdateAllRabCurrentFlowInfo( VOS_VOID ) { VOS_UINT8 ucRabId; VOS_UINT32 ulIndex; TAF_DSFLOW_INFO_STRU stCurrentFlowInfo; TAF_APS_DSFLOW_STATS_CTX_STRU *pstApsDsFlowCtx; /* 获取流量统计上下文指针 */ pstApsDsFlowCtx = TAF_APS_GetDsFlowCtxAddr(); /* 依次轮询所有RABID,刷新当前连接流量信息 */ for ( ucRabId = TAF_APS_RAB_ID_MIN; ucRabId <= TAF_APS_RAB_ID_MAX; ucRabId++ ) { /* 初始化 */ PS_MEM_SET(&stCurrentFlowInfo, 0, sizeof(TAF_DSFLOW_INFO_STRU)); /* 获取当前连接流量信息 */ TAF_APS_GetCurrentFlowInfo(ucRabId, &stCurrentFlowInfo); /* 刷新流量统计上下文当前连接信息 */ ulIndex = ucRabId - TAF_APS_RAB_ID_OFFSET; pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo = stCurrentFlowInfo; } return; }
VOS_VOID TAF_APS_ClearApDsFlowStats( VOS_VOID ) { TAF_APS_DSFLOW_STATS_CTX_STRU *pstDsFlowCtx = VOS_NULL_PTR; pstDsFlowCtx = TAF_APS_GetDsFlowCtxAddr(); pstDsFlowCtx->ulTotalFluxHigh = 0; pstDsFlowCtx->ulTotalFluxLow = 0; return; }
VOS_VOID TAF_APS_StartDsFlowStats( VOS_UINT8 ucRabId ) { VOS_UINT32 ulIndex; TAF_APS_DSFLOW_STATS_CTX_STRU *pstApsDsFlowCtx; VOS_UINT16 usModemid; /* 判断RAB ID是否有效 */ if ((ucRabId < TAF_APS_RAB_ID_MIN) || (ucRabId > TAF_APS_RAB_ID_MAX)) { return; } /* 初始化 */ ulIndex = ucRabId - TAF_APS_RAB_ID_OFFSET; pstApsDsFlowCtx = TAF_APS_GetDsFlowCtxAddr(); /* 检查RAB是否已经激活 */ if (VOS_TRUE == pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ucRabActiveFlag) { TAF_NORMAL_LOG1(WUEPS_PID_TAF, "TAF_APS_StartDsFlowStats:NORMAL:RABM is already active! RABID:", ucRabId); return; } /*置该RABID激活标志:*/ pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ucRabActiveFlag = VOS_TRUE; /* 调用CDS API 清除该RABID的历史流量 */ usModemid = VOS_GetModemIDFromPid(WUEPS_PID_TAF); CDS_ClearBearerDataFlowInfo(ucRabId, usModemid); /* 初始化APS当前连接流量信息为0 */ PS_MEM_SET(&pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo, 0, sizeof(TAF_DSFLOW_INFO_STRU)); /* 记录当前连接开始时间 */ pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ulStartLinkTime = VOS_GetTick() / PRE_SECOND_TO_TICK; /* 启动流量上报定时器 */ TAF_APS_StartDsFlowRpt(); /* 如果需要保存到NV项中,启动周期性保存流量到NV定时器 */ if (VOS_TRUE == pstApsDsFlowCtx->ucDsFlowSave2NvFlg) { TAF_APS_StartTimer(TI_TAF_APS_DSFLOW_WRITE_NV, (pstApsDsFlowCtx->ucDsFlowSavePeriod * 60 * TIMER_S_TO_MS_1000), TAF_APS_INVALID_PDPID); } return; }
VOS_VOID TAF_APS_QryDsFlowStats( TAF_DSFLOW_QUERY_INFO_STRU *pstDsFlowQryInfo, VOS_UINT8 ucRabId ) { VOS_UINT32 ulIndex; TAF_APS_DSFLOW_STATS_CTX_STRU *pstApsDsFlowCtx; /* 获取流量统计上下文 */ ulIndex = ucRabId - TAF_APS_RAB_ID_OFFSET; pstApsDsFlowCtx = TAF_APS_GetDsFlowCtxAddr(); /* 刷新该RAB ID当前流量信息 */ TAF_APS_GetCurrentFlowInfo(ucRabId, &pstDsFlowQryInfo->stCurrentFlowInfo); /* 刷新该RAB ID的历史流量信息 */ if (VOS_TRUE == pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ucRabActiveFlag) { /* 如果激活 */ /* RABID历史流量 = APS流量统计上下文保存的历史流量 + RABID当前流量 */ /* RABID历史连接时间 = APS流量统计上下文保存的历史连接时间 + RABID当前连接时间 */ TAF_APS_BIT64_ADD(pstDsFlowQryInfo->stTotalFlowInfo.ulDSReceiveFluxHigh, pstDsFlowQryInfo->stTotalFlowInfo.ulDSReceiveFluxLow, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSReceiveFluxHigh, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSReceiveFluxLow, pstDsFlowQryInfo->stCurrentFlowInfo.ulDSReceiveFluxHigh, pstDsFlowQryInfo->stCurrentFlowInfo.ulDSReceiveFluxLow); TAF_APS_BIT64_ADD(pstDsFlowQryInfo->stTotalFlowInfo.ulDSSendFluxHigh, pstDsFlowQryInfo->stTotalFlowInfo.ulDSSendFluxLow, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSSendFluxHigh, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSSendFluxLow, pstDsFlowQryInfo->stCurrentFlowInfo.ulDSSendFluxHigh, pstDsFlowQryInfo->stCurrentFlowInfo.ulDSSendFluxLow); pstDsFlowQryInfo->stTotalFlowInfo.ulDSLinkTime = pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSLinkTime + pstDsFlowQryInfo->stCurrentFlowInfo.ulDSLinkTime; } else { /* 如果未激活 */ /* RABID历史流量 = APS流量统计上下文保存的历史流量 */ pstDsFlowQryInfo->stTotalFlowInfo = pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo; } return; }
VOS_UINT32 TAF_APS_InitTask( VOS_VOID ) { /* 初始化APS模块CTX */ TAF_APS_InitCtx(); /* 初始化APS流量统计上下文 */ TAF_APS_InitDsFlowCtx(TAF_APS_GetDsFlowCtxAddr()); /* 初始化DDR调频信息 */ TAF_APS_InitSwitchDdrInfo(); /*注册状态机*/ TAF_APS_RegFsm(); return VOS_OK; }
VOS_VOID TAF_APS_QryDsFlowReportInfo( VOS_UINT8 ucRabId, TAF_DSFLOW_REPORT_STRU *pstDsFlowRptInfo ) { VOS_UINT32 ulIndex; TAF_APS_DSFLOW_STATS_CTX_STRU *pstApsDsFlowCtx; TAF_DSFLOW_INFO_STRU stCurrentFlowInfo; /* 判断RAB ID是否有效 */ if ((ucRabId < TAF_APS_RAB_ID_MIN) || (ucRabId > TAF_APS_RAB_ID_MAX)) { return; } /* 初始化 */ ulIndex = ucRabId - TAF_APS_RAB_ID_OFFSET; PS_MEM_SET(&stCurrentFlowInfo, 0, sizeof(TAF_DSFLOW_INFO_STRU)); /* 获取流量统计上下文 */ pstApsDsFlowCtx = TAF_APS_GetDsFlowCtxAddr(); /* 获取当前连接流量信息 */ TAF_APS_GetCurrentFlowInfo(ucRabId, &stCurrentFlowInfo); pstDsFlowRptInfo->stCurrentFlowInfo = stCurrentFlowInfo; /* 接收速率:(定时器超时时的当前连接接收流量 - 定时器启动时的当前连接接收流量 )/定时器周期 */ TAF_APS_CalcDsflowRate(pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo.ulDSReceiveFluxHigh, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo.ulDSReceiveFluxLow, pstDsFlowRptInfo->stCurrentFlowInfo.ulDSReceiveFluxHigh, pstDsFlowRptInfo->stCurrentFlowInfo.ulDSReceiveFluxLow, (TI_TAF_APS_DSFLOW_REPORT_LEN/TIMER_S_TO_MS_1000), &pstDsFlowRptInfo->ulCurrentReceiveRate); /* 发送速率:(定时器超时时的当前连接发送流量 - 定时器启动时的当前连接发送流量 )/定时器周期 */ TAF_APS_CalcDsflowRate(pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo.ulDSSendFluxHigh, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo.ulDSSendFluxLow, pstDsFlowRptInfo->stCurrentFlowInfo.ulDSSendFluxHigh, pstDsFlowRptInfo->stCurrentFlowInfo.ulDSSendFluxLow, (TI_TAF_APS_DSFLOW_REPORT_LEN/TIMER_S_TO_MS_1000), &pstDsFlowRptInfo->ulCurrentSendRate); return; }
VOS_UINT32 TAF_APS_CheckIfActiveRabIdExist( VOS_VOID ) { VOS_UINT8 ucRabId; VOS_UINT32 ulIndex; TAF_APS_DSFLOW_STATS_CTX_STRU *pstApsDsFlowCtx; /* 初始化 */ pstApsDsFlowCtx = TAF_APS_GetDsFlowCtxAddr(); /* 依次轮询所有RABID,刷新当前连接流量信息 */ for ( ucRabId = TAF_APS_RAB_ID_MIN; ucRabId <= TAF_APS_RAB_ID_MAX; ucRabId++ ) { ulIndex = ucRabId - TAF_APS_RAB_ID_OFFSET; if (VOS_TRUE == pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ucRabActiveFlag) { return VOS_TRUE; } } return VOS_FALSE; }
VOS_VOID TAF_APS_SaveDsFlowInfoToNv( VOS_VOID ) { TAF_APS_DSFLOW_STATS_CTX_STRU *pstApsDsFlowCtx; TAF_APS_DSFLOW_NV_STRU stApsDsflowNv; TAF_DSFLOW_QUERY_INFO_STRU stDsFlowQryInfo; /* 初始化 */ pstApsDsFlowCtx = TAF_APS_GetDsFlowCtxAddr(); PS_MEM_SET(&stApsDsflowNv, 0, sizeof(TAF_APS_DSFLOW_NV_STRU)); PS_MEM_SET(&stDsFlowQryInfo, 0, sizeof(TAF_DSFLOW_QUERY_INFO_STRU)); if (VOS_TRUE == pstApsDsFlowCtx->ucApsDsFlowSave2NvFlg) { /* 获取历史流量信息项 */ TAF_APS_QryAllRabDsFlowStats(&stDsFlowQryInfo); /* 刷新流量信息相关NV项 */ stApsDsflowNv.ulDSLastLinkTime = stDsFlowQryInfo.stCurrentFlowInfo.ulDSLinkTime; stApsDsflowNv.ulDSTotalLinkTime = stDsFlowQryInfo.stTotalFlowInfo.ulDSLinkTime; stApsDsflowNv.ulDSTotalReceiveFluxHigh = stDsFlowQryInfo.stTotalFlowInfo.ulDSReceiveFluxHigh; stApsDsflowNv.ulDSTotalReceiveFluxLow = stDsFlowQryInfo.stTotalFlowInfo.ulDSReceiveFluxLow; stApsDsflowNv.ulDSTotalSendFluxHigh = stDsFlowQryInfo.stTotalFlowInfo.ulDSSendFluxHigh; stApsDsflowNv.ulDSTotalSendFluxLow = stDsFlowQryInfo.stTotalFlowInfo.ulDSSendFluxLow; /* 写NV项 */ if (NV_OK != NV_Write(en_NV_Item_DSFLOW_REPORT, &stApsDsflowNv, sizeof(TAF_APS_DSFLOW_NV_STRU))) { TAF_ERROR_LOG(WUEPS_PID_TAF, "TAF_APS_SaveDsFlowInfoToNv: Write NVIM Failed"); } } else { TAF_NORMAL_LOG(WUEPS_PID_TAF, "TAF_APS_SaveDsFlowInfoToNv: Save2NvFlg is not set."); } return; }
VOS_VOID TAF_APS_ClearDsFlowStats( VOS_UINT8 ucRabId ) { VOS_UINT32 ulIndex; VOS_UINT8 ucRabActiveFlag; TAF_APS_DSFLOW_STATS_CTX_STRU *pstApsDsFlowCtx; VOS_UINT16 usModemid; /* 初始化 */ ulIndex = ucRabId - TAF_APS_RAB_ID_OFFSET; pstApsDsFlowCtx = TAF_APS_GetDsFlowCtxAddr(); /* 先保存该RABID激活标志 */ ucRabActiveFlag = pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ucRabActiveFlag; /* 流量统计上下文指定RABID流量信息清零 */ PS_MEM_SET(&pstApsDsFlowCtx->astApsDsFlowStats[ulIndex], 0, sizeof(TAF_APS_DSFLOW_STATS_STRU)); /* 恢复该RABID激活标志信息 */ pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ucRabActiveFlag = ucRabActiveFlag; /* 如果RAB已激活,将当前连接时间置为当前时间,同时通知CDS清除流量信息 */ if (VOS_TRUE == ucRabActiveFlag) { /* 调用CDS API 清除该RABID的流量信息 */ usModemid = VOS_GetModemIDFromPid(WUEPS_PID_TAF); CDS_ClearBearerDataFlowInfo(ucRabId, usModemid); /* 记录当前连接开始时间 */ pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ulStartLinkTime = VOS_GetTick() / PRE_SECOND_TO_TICK; } return; }
VOS_VOID TAF_APS_StopDsFlowStats( VOS_UINT8 ucRabId ) { VOS_UINT32 ulIndex; TAF_APS_DSFLOW_STATS_CTX_STRU *pstApsDsFlowCtx; TAF_DSFLOW_INFO_STRU stCurrentFlowInfo; VOS_UINT16 usModemid; /* 判断RAB ID是否有效 */ if ((ucRabId < TAF_APS_RAB_ID_MIN) || (ucRabId > TAF_APS_RAB_ID_MAX)) { return; } /* 初始化 */ PS_MEM_SET(&stCurrentFlowInfo, 0, sizeof(TAF_DSFLOW_INFO_STRU)); pstApsDsFlowCtx = TAF_APS_GetDsFlowCtxAddr(); ulIndex = ucRabId - TAF_APS_RAB_ID_OFFSET; if (VOS_TRUE == pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ucRabActiveFlag) { /* 刷新流量上下文当前连接流量信息 */ TAF_APS_GetCurrentFlowInfo(ucRabId, &stCurrentFlowInfo); pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo = stCurrentFlowInfo; /* 刷新流量上下文累积连接流量信息 */ pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSLinkTime += pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo.ulDSLinkTime; /* 接收字节累加 */ TAF_APS_BIT64_ADD(pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSReceiveFluxHigh, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSReceiveFluxLow, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSReceiveFluxHigh, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSReceiveFluxLow, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo.ulDSReceiveFluxHigh, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo.ulDSReceiveFluxLow); /* 发送字节累加 */ TAF_APS_BIT64_ADD(pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSSendFluxHigh, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSSendFluxLow, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSSendFluxHigh, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stTotalFlowInfo.ulDSSendFluxLow, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo.ulDSSendFluxHigh, pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo.ulDSSendFluxLow); /* 设置该RAB ID为去激活标志 */ pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ucRabActiveFlag = VOS_FALSE; } /* 如果当前所有RAB均已去激活,则停止流量上报定时器和周期性保存流量定时器 */ if (VOS_FALSE == TAF_APS_CheckIfActiveRabIdExist()) { /* 如果保存历史流量到NV特性使能,写NV */ TAF_APS_SaveDsFlowInfoToNv(); TAF_APS_ReleaseDfs(); TAF_APS_StopTimer(TI_TAF_APS_DSFLOW_REPORT, TAF_APS_INVALID_PDPID); TAF_APS_StopTimer(TI_TAF_APS_DSFLOW_WRITE_NV, TAF_APS_INVALID_PDPID); } /* 调用CDS API 清除该RABID的流量信息 */ usModemid = VOS_GetModemIDFromPid(WUEPS_PID_TAF); CDS_ClearBearerDataFlowInfo(ucRabId, usModemid); return; }
VOS_VOID TAF_APS_ProcApDsFlowRpt(VOS_VOID) { TAF_APS_DSFLOW_STATS_CTX_STRU *pstDsflowCtx = VOS_NULL_PTR; TAF_APDSFLOW_REPORT_STRU stApDsFlowRptInfo; TAF_DSFLOW_REPORT_STRU stTotalDsFlowRptInfo; TAF_DSFLOW_QUERY_INFO_STRU stDsFlowQryInfo; TAF_CTRL_STRU stCtrlHdr; VOS_UINT32 ulTotalFluxThresHigh; VOS_UINT32 ulTotalFluxThresLow; VOS_UINT32 ulTotalFluxHigh; VOS_UINT32 ulTotalFluxLow; VOS_UINT32 ulResult; PS_MEM_SET(&stApDsFlowRptInfo, 0x00, sizeof(TAF_APDSFLOW_REPORT_STRU)); PS_MEM_SET(&stTotalDsFlowRptInfo, 0x00, sizeof(TAF_DSFLOW_REPORT_STRU)); PS_MEM_SET(&stDsFlowQryInfo, 0x00, sizeof(TAF_DSFLOW_QUERY_INFO_STRU)); pstDsflowCtx = TAF_APS_GetDsFlowCtxAddr(); if (VOS_TRUE == pstDsflowCtx->ulFluxThresRptFlg) { /* 查询所有激活RAB承载的上报流量信息 */ TAF_APS_QryAllRabDsFlowReportInfo(&stTotalDsFlowRptInfo); /* 查询所有RAB承载的流量信息 */ TAF_APS_QryAllRabDsFlowStats(&stDsFlowQryInfo); /* 累计上下行流量 */ TAF_APS_BIT64_ADD(ulTotalFluxHigh, ulTotalFluxLow, stDsFlowQryInfo.stTotalFlowInfo.ulDSReceiveFluxHigh, stDsFlowQryInfo.stTotalFlowInfo.ulDSReceiveFluxLow, stDsFlowQryInfo.stTotalFlowInfo.ulDSSendFluxHigh, stDsFlowQryInfo.stTotalFlowInfo.ulDSSendFluxLow); /* 计算累计流量上报阈值 */ TAF_APS_BIT64_ADD(ulTotalFluxThresHigh, ulTotalFluxThresLow, pstDsflowCtx->ulTotalFluxHigh, pstDsflowCtx->ulTotalFluxLow, pstDsflowCtx->ulFluxThresHigh, pstDsflowCtx->ulFluxThresLow); /* 检查是否达到流量上报阈值 */ TAF_APS_BIT64_COMPARE(ulTotalFluxHigh, ulTotalFluxLow, ulTotalFluxThresHigh, ulTotalFluxThresLow, ulResult); if ((TAF_APS_BIT64_GREAT == ulResult) || (TAF_APS_BIT64_EQUAL == ulResult)) { /* 更新累计流量 */ pstDsflowCtx->ulTotalFluxHigh = ulTotalFluxHigh; pstDsflowCtx->ulTotalFluxLow = ulTotalFluxLow; /* 填写控制头 */ TAF_APS_CFG_AT_EVT_CTRL_HDR(&stCtrlHdr, MN_CLIENT_ID_BROADCAST, 0); /* 填写事件内容 */ stApDsFlowRptInfo.ulCurrentTxRate = stTotalDsFlowRptInfo.ulCurrentSendRate; stApDsFlowRptInfo.ulCurrentRxRate = stTotalDsFlowRptInfo.ulCurrentReceiveRate; stApDsFlowRptInfo.stCurrentFlowInfo = stTotalDsFlowRptInfo.stCurrentFlowInfo; stApDsFlowRptInfo.stTotalFlowInfo = stDsFlowQryInfo.stTotalFlowInfo; /* 流量阈值上报 */ TAF_APS_SndApDsFlowRptInd(&stCtrlHdr, &stApDsFlowRptInfo); } } return; }
VOS_VOID TAF_APS_GetCurrentFlowInfo( VOS_UINT8 ucRabId, TAF_DSFLOW_INFO_STRU *pstCurrentFlowInfo ) { CDS_BEARER_DATA_FLOW_STRU stDataFlowInfo; TAF_APS_DSFLOW_STATS_CTX_STRU *pstApsDsFlowCtx; VOS_UINT32 ulIndex; VOS_UINT32 ulCurSysTime; VOS_UINT16 usModemid; if (ucRabId < TAF_APS_RAB_ID_OFFSET) { ucRabId = TAF_APS_RAB_ID_OFFSET; } /* 初始化 */ pstApsDsFlowCtx = TAF_APS_GetDsFlowCtxAddr(); ulIndex = ucRabId - TAF_APS_RAB_ID_OFFSET; /* 如果激活 */ /* 调用CDS API CDS_GetBearerDataFlowInfo获取当前连接流量 */ /* RABID当前流量 = CDS返回的当前连接流量 */ /* 如果未激活 */ /* RABID当前流量 = APS流量统计上下文保存的当前连接流量 */ if (ulIndex >= TAF_APS_MAX_RAB_NUM) { ulIndex = TAF_APS_MAX_RAB_NUM - 1; } /* 获取指定RABID的当前连接流量信息 */ if (VOS_TRUE == pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ucRabActiveFlag) { /* 流量信息初始化 */ PS_MEM_SET(&stDataFlowInfo, 0, sizeof(CDS_BEARER_DATA_FLOW_STRU)); usModemid = VOS_GetModemIDFromPid(WUEPS_PID_TAF); CDS_GetBearerDataFlowInfo(ucRabId, &stDataFlowInfo, usModemid); /* 刷新流量上下文当前连接流量信息 */ pstCurrentFlowInfo->ulDSReceiveFluxHigh = stDataFlowInfo.ulTotalReceiveFluxHigh; pstCurrentFlowInfo->ulDSReceiveFluxLow = stDataFlowInfo.ulTotalReceiveFluxLow; pstCurrentFlowInfo->ulDSSendFluxHigh = stDataFlowInfo.ulTotalSendFluxHigh; pstCurrentFlowInfo->ulDSSendFluxLow = stDataFlowInfo.ulTotalSendFluxLow; /* 当前连接时间:当前时间-PDP激活时间 */ ulCurSysTime = VOS_GetTick() / PRE_SECOND_TO_TICK; /*与结构体中开始连接时间运算,得到本次连接总时间:*/ if ( VOS_OK != TAF_CalcTime(pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].ulStartLinkTime, ulCurSysTime, &pstCurrentFlowInfo->ulDSLinkTime) ) { /*打印警告信息---计算最后一次DS从开始连接到现在所经历的时间(秒数)时出错:*/ TAF_WARNING_LOG1( WUEPS_PID_TAF, "TAF_APS_UpdateCurrentFlowInfo:WARNING:TAF_CalcTime FAIL! RabId:", ucRabId ); } } else { PS_MEM_CPY(pstCurrentFlowInfo, &pstApsDsFlowCtx->astApsDsFlowStats[ulIndex].stCurrentFlowInfo, sizeof(TAF_DSFLOW_INFO_STRU) ); } return; }