VOS_VOID TAF_APS_Proc1xToHrpdHandOff( VOS_UINT8 ucPdpId, VOS_UINT8 ucIsNewSession ) { if (TAF_APS_TIMER_STATUS_RUNING == TAF_APS_GetTimerStatus(TI_TAF_APS_CDATA_DORMANT, ucPdpId)) { TAF_APS_StopTimer(TI_TAF_APS_CDATA_DORMANT, ucPdpId); } /* 从1X切换到HRPD */ if (VOS_TRUE == ucIsNewSession) { /* 更新当前建立数据服务的模式 */ TAF_APS_SetCurrPdpEntityDataServiceMode(TAF_APS_RAT_TYPE_HRPD); /* 通知外部模块当前的PS服务所在的模式 */ TAF_APS_SndExternalModulePsRatTypeNtf(TAF_APS_RAT_TYPE_HRPD); } else { /* 发送内部1X到HRPD切换请求消息 */ TAF_APS_SndInter1XToHrpdHandOffReq(ucPdpId); } return; }
VOS_UINT32 TAF_APS_RcvHsmHandOffCnf_CdataHandOff_WaitHsmHandOffCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { HSM_APS_1X_TO_HRPD_HANDOFF_CNF_STRU *pstApsHandOffCnf; VOS_UINT8 ucPdpId; /* 初始化 */ pstApsHandOffCnf = (HSM_APS_1X_TO_HRPD_HANDOFF_CNF_STRU *)pstMsg; ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 停止模式切换定时器 */ TAF_APS_StopTimer(TI_TAF_APS_1X_TO_HRPD_HANDOFF_TIMER, ucPdpId); /* 数据服务切换成功 */ if (HSM_APS_CAUSE_SUCCESS == pstApsHandOffCnf->ulCause) { /* 更新建立数据服务的接入技术 */ TAF_APS_SetCurrPdpEntityDataServiceMode(TAF_APS_RAT_TYPE_HRPD); /* 通知外部模块当前的PS服务所在的模式 */ TAF_APS_SndExternalModulePsRatTypeNtf(TAF_APS_RAT_TYPE_HRPD); } /* 主状态迁移至TAF_APS_STA_DORMANT */ TAF_APS_SetCurrPdpEntityMainFsmState(TAF_APS_STA_DORMANT); /* 退出子状态状态机 */ TAF_APS_QuitCurrSubFsm(); return VOS_TRUE; }
VOS_UINT32 TAF_APS_RcvXccIncomingCallInd_CdataHandOff_WaitHsmHandOffCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT8 ucPdpId; /* 初始化, 获取PDP ID */ ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 停止保数据服务切换保护定时器 */ TAF_APS_StopTimer(TI_TAF_APS_1X_TO_HRPD_HANDOFF_TIMER, ucPdpId); /*------------------------------------------------------- 加载TAF_APS_FSM_CDATA_ESTING状态机 加载后子状态切换为TAF_APS_FSM_CDATA_ESTING_SUBSTA_INIT 在TAF_APS_FSM_CDATA_ESTING_SUBSTA_INIT子状态中处理 ID_XCC_APS_INCOMING_CALL_IND消息 -------------------------------------------------------*/ TAF_APS_InitSubFsm(TAF_APS_FSM_CDATA_ESTING, TAF_APS_GetCdataEstingFsmDescAddr(), TAF_APS_CDATA_ESTING_SUBSTA_INIT); return VOS_TRUE; }
VOS_VOID TAF_APS_StartDsFlowRpt( VOS_VOID ) { TAF_APS_TIMER_STATUS_ENUM_U8 enTimerStatus; /* 如果当前流量上报定时器正在运行,先停止定时器 */ enTimerStatus = TAF_APS_GetTimerStatus(TI_TAF_APS_DSFLOW_REPORT, TAF_APS_INVALID_PDPID); if (TAF_APS_TIMER_STATUS_RUNING == enTimerStatus) { TAF_APS_StopTimer(TI_TAF_APS_DSFLOW_REPORT, TAF_APS_INVALID_PDPID); } /* 判断当前是否有RAB激活 */ if (VOS_TRUE == TAF_APS_CheckIfActiveRabIdExist()) { /* 依次轮询所有RABID,刷新已激活RAB的当前连接流量信息 */ TAF_APS_UpdateAllRabCurrentFlowInfo(); /* 启动流量上报定时器 */ TAF_APS_StartTimer(TI_TAF_APS_DSFLOW_REPORT, TI_TAF_APS_DSFLOW_REPORT_LEN, TAF_APS_INVALID_PDPID); } return; }
VOS_VOID TAF_APS_ProcMsgEntry( struct MsgCB *pstMsg ) { VOS_UINT32 ulRet; VOS_UINT32 ulEventType; REL_TIMER_MSG *pstRcvTimerMsg; if ( VOS_NULL_PTR == pstMsg ) { TAF_ERROR_LOG(WUEPS_PID_TAF,"TAF_APS_ProcMsgEntry:null pointer"); return; } /* 如果是超时消息,需要显式的清除定时器的运行状态 */ if ( VOS_PID_TIMER == ((MSG_HEADER_STRU*)pstMsg)->ulSenderPid ) { pstRcvTimerMsg = (REL_TIMER_MSG *)pstMsg; TAF_APS_StopTimer(pstRcvTimerMsg->ulName, pstRcvTimerMsg->ulPara); } /* 动作表里的消息处理函数依照发送者的PID和消息名来区分,两者共同 构造EventType */ ulEventType = TAF_APS_BuildEventType(pstMsg); /* 如果在预处理中已经处理完成则直接返回 */ if ( VOS_TRUE == TAF_APS_PreProcessMsg(ulEventType, pstMsg)) { return; } /* 进入状态机处理 */ ulRet = TAF_APS_ProcessMsgInFsm(ulEventType, pstMsg); /* 此处流程上有点问题,需要增加判定,只有子状态机有退出的时候, 才需要处理缓存 */ /* 该消息在状态机中已经处理完成,可尝试处理一下缓存 */ if ( VOS_TRUE == ulRet) { TAF_APS_ProcessBufferMsg(); } /* 在当前状态机中未处理完毕,判断消息是否需要打断当前的L2状态机,后处理 */ else { TAF_APS_PostProcessMsg(ulEventType, pstMsg); } return; }
VOS_VOID TAF_APS_StopDsFlowRpt( VOS_VOID ) { TAF_APS_TIMER_STATUS_ENUM_U8 enTimerStatus; /* 如果当前流量上报定时器正在运行,停止定时器 */ enTimerStatus = TAF_APS_GetTimerStatus(TI_TAF_APS_DSFLOW_REPORT, TAF_APS_INVALID_PDPID); if (TAF_APS_TIMER_STATUS_RUNING == enTimerStatus) { TAF_APS_StopTimer(TI_TAF_APS_DSFLOW_REPORT, TAF_APS_INVALID_PDPID); } return; }
VOS_UINT32 TAF_APS_RcvPsCallEndReq_CdataHandOff_WaitHsmHandOffCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { TAF_PS_MSG_STRU *pstAppMsg; TAF_PS_CALL_END_REQ_STRU *pstCallEndReq; VOS_UINT8 ucPdpId; /* 获取消息内容 */ pstAppMsg = (TAF_PS_MSG_STRU*)pstMsg; pstCallEndReq = (TAF_PS_CALL_END_REQ_STRU*)(pstAppMsg->aucContent); ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 保存子状态机的入口消息 */ TAF_APS_SaveCurrSubFsmEntryMsg(ulEventType, pstMsg); /* 上报PS呼叫挂断响应事件 */ TAF_APS_SndCallEndCnf(&(pstCallEndReq->stCtrl), pstCallEndReq->ucCid, TAF_PS_CAUSE_SUCCESS); /* 停止保数据服务切换保护定时器 */ TAF_APS_StopTimer(TI_TAF_APS_1X_TO_HRPD_HANDOFF_TIMER, ucPdpId); //To do:暂时按照此流程做,后面参考标杆来做 /* 如果PPP已激活,通知PPP去激活 */ if (TAF_APS_CDATA_PPP_STATE_ACTIVE == TAF_APS_GetPdpEntPppState(ucPdpId)) { TAF_APS_SndPppDeactInd(ucPdpId); } /* 上报去激活的事件 */ TAF_APS_SndPdpDeActivateInd(ucPdpId, TAF_PS_CAUSE_SUCCESS); /* 释放APS资源 */ Aps_ReleaseApsResource(ucPdpId); /* 配置IP过滤 */ TAF_APS_IpfConfigUlFilter(ucPdpId); /* 主状态迁移至TAF_APS_STA_INACTIVE */ TAF_APS_SetCurrPdpEntityMainFsmState(TAF_APS_STA_INACTIVE); /* 退出子状态状态机 */ TAF_APS_QuitCurrSubFsm(); return VOS_TRUE; }
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; }