VOS_VOID TAF_SSA_RetryIntervalTimerExpired(VOS_UINT8 ucTi) { TAF_SSA_MSG_BUFF_STRU *pstBufferdMsg = VOS_NULL_PTR; pstBufferdMsg = TAF_SSA_GetBufferedMsg(ucTi); if (TAF_SSA_STATE_CONN_PENDING != gastSsaStatetable[ucTi].enSsaState) { SSA_LOG(INFO_PRINT, "TAF_SSA_RetryIntervalTimerExpired: ssa state is invalid."); TAF_SSA_ClearBufferedMsg(ucTi); TAF_SSA_StopTimer(TI_TAF_SSA_RETRY_PERIOD_TIMER, ucTi); return; } /* 取缓存消息 */ if (VOS_TRUE == pstBufferdMsg->bitOpBufferedBeginReqMsg) { Taf_SSA_ProcBufferedBeginReqMsg(&pstBufferdMsg->stBufferedBeginReqMsg); return; } SSA_LOG(INFO_PRINT, "TAF_SSA_RetryIntervalTimerExpired: buffered begin req msg is null!"); TAF_SSA_StopTimer(TI_TAF_SSA_RETRY_PERIOD_TIMER, ucTi); return; }
VOS_VOID SSA_ReportUssdDataSndEvent(VOS_UINT8 ucTi) { TAF_SS_CALL_INDEPENDENT_EVENT_STRU *pstSsEvent; pstSsEvent = (TAF_SS_CALL_INDEPENDENT_EVENT_STRU *)PS_MEM_ALLOC(WUEPS_PID_SS, sizeof(TAF_SS_CALL_INDEPENDENT_EVENT_STRU)); if (VOS_NULL_PTR == pstSsEvent) { SSA_LOG(ERROR_PRINT, "SSA_ReportUssdDataSndEvent:ERROR: Alloc Mem Fail"); SSA_TiFree(ucTi); return; } /*对事件上报的内容赋初值*/ PS_MEM_SET(pstSsEvent, 0 , 4); pstSsEvent->SsEvent = TAF_SS_EVT_USSD_DATA_SND; pstSsEvent->OpId = gastSsaStatetable[ucTi].OpId; pstSsEvent->ClientId = gastSsaStatetable[ucTi].ClientId; MN_SendClientEvent(pstSsEvent->ClientId, MN_CALLBACK_SS, pstSsEvent->SsEvent, pstSsEvent); PS_MEM_FREE(WUEPS_PID_SS, pstSsEvent); return; }
VOS_VOID SSA_ReportErrorEvent( VOS_UINT16 ClientId, VOS_UINT8 OpId, TAF_SS_ERROR ErrorCode ) { TAF_SS_CALL_INDEPENDENT_EVENT_STRU *pstSsEvent = VOS_NULL_PTR; pstSsEvent = (TAF_SS_CALL_INDEPENDENT_EVENT_STRU *)PS_MEM_ALLOC(WUEPS_PID_SS, sizeof(TAF_SS_CALL_INDEPENDENT_EVENT_STRU)); if (VOS_NULL_PTR == pstSsEvent) { SSA_LOG( ERROR_PRINT, "TAF_SSA_ReportEvtError: Alloc Mem Fail"); return; } /* 出错事件的OP项初始化 */ PS_MEM_SET(pstSsEvent, 0, sizeof(VOS_UINT32)); pstSsEvent->OP_Error = VOS_TRUE; pstSsEvent->SsEvent = TAF_SS_EVT_ERROR; pstSsEvent->ClientId = ClientId; pstSsEvent->OpId = OpId; pstSsEvent->ErrorCode = ErrorCode; TAF_SsEventReport(pstSsEvent); PS_MEM_FREE(WUEPS_PID_SS, pstSsEvent); return; }
TAF_SSA_TIMER_STATUS_ENUM_UINT8 TAF_SSA_GetTimerStatus( TAF_SSA_TIMER_ID_ENUM_UINT8 enTimerId, VOS_UINT8 ucTi ) { TAF_SSA_TIMER_CXT_STRU *pstSsaTimerCtx = VOS_NULL_PTR; VOS_UINT32 i; /*TI有效范围是0-6,8-14*/ if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi)) { SSA_LOG(WARNING_PRINT, "TAF_SSA_GetTimerStatus: Ti invalid!"); return TAF_SSA_TIMER_STATUS_STOP; } pstSsaTimerCtx = gastSsaStatetable[ucTi].astSsaTimerCtx; for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ ) { if ( ( TAF_SSA_TIMER_STATUS_RUNING == pstSsaTimerCtx[i].enTimerStatus ) && ( enTimerId == pstSsaTimerCtx[i].enTimerId)) { break; } } if ( i >= TAF_SSA_MAX_TIMER_NUM) { return TAF_SSA_TIMER_STATUS_STOP; } return TAF_SSA_TIMER_STATUS_RUNING; }
VOS_VOID TAF_SSA_StopAllTimer(VOS_UINT8 ucTi) { TAF_SSA_TIMER_CXT_STRU *pstSsaTimerCtx = VOS_NULL_PTR; VOS_UINT32 i; /*TI有效范围是0-6,8-14*/ if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi)) { SSA_LOG(WARNING_PRINT, "TAF_SSA_StopTimer: Ti invalid!"); return; } pstSsaTimerCtx = gastSsaStatetable[ucTi].astSsaTimerCtx; for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ ) { if ( TAF_SSA_TIMER_STATUS_RUNING == pstSsaTimerCtx[i].enTimerStatus ) { TAF_SSA_StopTimer(pstSsaTimerCtx[i].enTimerId, ucTi); pstSsaTimerCtx[i].hTimer = VOS_NULL_PTR; pstSsaTimerCtx[i].enTimerId = TI_TAF_SSA_TIMER_BUTT; pstSsaTimerCtx[i].enTimerStatus = TAF_SSA_TIMER_STATUS_STOP; } } }
VOS_VOID TAF_SSA_WaitAppRspTimerExpired(VOS_UINT8 ucTi) { TAF_SS_CALL_INDEPENDENT_EVENT_STRU *pstSsEvent; pstSsEvent = (TAF_SS_CALL_INDEPENDENT_EVENT_STRU *)PS_MEM_ALLOC(WUEPS_PID_SS, sizeof(TAF_SS_CALL_INDEPENDENT_EVENT_STRU)); if (VOS_NULL_PTR == pstSsEvent) { SSA_LOG( ERROR_PRINT, "TAF_SSA_WaitAppRspTimerExpired:ERROR: Alloc Mem Fail"); return; } /*察看状态表中当前Ti的相关参数,确定Ti的参数是否有误*/ if (SSA_IDLE == gastSsaStatetable[ucTi].ucState) { /*打印异常信息*/ SSA_LOG(WARNING_PRINT, "TAF_SSA_WaitAppRspTimerExpired:WARNING: Timer out,but Ti not exist"); PS_MEM_FREE(WUEPS_PID_SS, pstSsEvent); return; } /*向网络侧发送Release Complete消息,并告知原因,与UE 1.5的超时 处理类似, 向APP进行事件上报*/ PS_MEM_SET(pstSsEvent, 0, sizeof(TAF_SS_CALL_INDEPENDENT_EVENT_STRU)); pstSsEvent->SsEvent = TAF_SS_EVT_ERROR; pstSsEvent->OP_Error = 1; pstSsEvent->ClientId = gastSsaStatetable[ucTi].ClientId; pstSsEvent->OpId = gastSsaStatetable[ucTi].OpId; /* 填写ErrorCode,如果当前有UE主动发起的连接,并且网络超时,ErrorCode需要填成特殊的原因值 AT上报+CUSD: 5时会用到;其他情况下ErrorCode为TAF_ERR_TIME_OUT */ if (TAF_SSA_USSD_MT_CONN_STATE == gastSsaStatetable[ucTi].ucUssdFlag) { pstSsEvent->ErrorCode = TAF_ERR_USSD_USER_TIMEOUT; } else { pstSsEvent->ErrorCode = TAF_ERR_TIME_OUT; } TAF_SsEventReport(pstSsEvent); PS_MEM_FREE(WUEPS_PID_SS, pstSsEvent); SSA_ReturnError(0, ucTi, TAF_SS_MSG_TYPE_RLCOMPLETE,SS_CAUSE_RECOVERY_TIMER_EXPIRY); }
VOS_VOID TAF_SSA_RcvTimerExpired( TAF_SSA_TIMER_ID_ENUM_UINT8 enTimerId, VOS_UINT8 ucTi ) { /*TI有效范围是0-6,8-14*/ if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi)) { SSA_LOG(WARNING_PRINT, "TAF_SSA_RcvTimerExpired: Ti invalid!"); return; } TAF_SSA_StopTimer(enTimerId, ucTi); switch (enTimerId) { case TI_TAF_SSA_WAIT_NETWORK_RSP_TIMER: TAF_SSA_WaitNetworkRspTimerExpired(ucTi); break; case TI_TAF_SSA_WAIT_APP_RSP_TIMER: TAF_SSA_WaitAppRspTimerExpired(ucTi); break; case TI_TAF_SSA_RETRY_PERIOD_TIMER: /*lint -e522*/ TAF_SSA_RetryPeriodTimerExpired(ucTi); /*lint +e522*/ break; case TI_TAF_SSA_RETRY_INTERVAL_TIMER: TAF_SSA_RetryIntervalTimerExpired(ucTi); break; default: SSA_LOG(WARNING_PRINT, "TAF_SSA_RcvTimerExpired: timer id is invalid!"); break; } return; }
VOS_UINT16 SSA_GetUssdTransMode(VOS_VOID) { /* 若g_usTafSsaUssdTransMode非法,则返回AT_USSD_TRAN_MODE */ if ((AT_USSD_NON_TRAN_MODE != g_usTafSsaUssdTransMode) && (AT_USSD_TRAN_MODE != g_usTafSsaUssdTransMode)) { SSA_LOG(WARNING_PRINT, "SSA_GetUssdTransMode: usUssdTransMode is Abnormal!"); return AT_USSD_TRAN_MODE; } /* g_usTafSsaUssdTransMode值合法 */ return g_usTafSsaUssdTransMode; }
VOS_UINT32 TAF_SSA_GetTimerRemainLen( TAF_SSA_TIMER_ID_ENUM_UINT8 enTimerId, VOS_UINT8 ucTi ) { VOS_UINT32 ulTick; TAF_SSA_TIMER_CXT_STRU *pstSsaTimerCtx = VOS_NULL_PTR; VOS_UINT32 i; ulTick = 0; /*TI有效范围是0-6,8-14*/ if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi)) { SSA_LOG(WARNING_PRINT, "TAF_SSA_GetTimerRemainLen: Ti invalid!"); return ulTick; } pstSsaTimerCtx = gastSsaStatetable[ucTi].astSsaTimerCtx; for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ ) { if ( ( TAF_SSA_TIMER_STATUS_RUNING == pstSsaTimerCtx[i].enTimerStatus ) && ( enTimerId == pstSsaTimerCtx[i].enTimerId)) { break; } } if (i >= TAF_SSA_MAX_TIMER_NUM) { /* 不存在说明此定时器已超时或停止 */ ulTick = 0; return ulTick; } /* 句柄为空时,说明此定时器已超时或停止 */ if (VOS_NULL_PTR != pstSsaTimerCtx[i].hTimer) { if (VOS_OK != VOS_GetRelTmRemainTime(&(pstSsaTimerCtx[i].hTimer), &ulTick)) { ulTick = 0; } } /* tick值乘以10转换为毫秒 */ return ulTick * TAF_SSA_TIMER_TICK; }
VOS_VOID TAF_SSA_StopTimer( TAF_SSA_TIMER_ID_ENUM_UINT8 enTimerId, VOS_UINT8 ucTi ) { TAF_SSA_TIMER_CXT_STRU *pstSsTimerCtx = VOS_NULL_PTR; VOS_UINT32 i; /*TI有效范围是0-6,8-14*/ if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi)) { SSA_LOG(WARNING_PRINT, "TAF_SSA_StopTimer: Ti invalid!"); return; } pstSsTimerCtx = gastSsaStatetable[ucTi].astSsaTimerCtx; for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ ) { if ( (TAF_SSA_TIMER_STATUS_RUNING == pstSsTimerCtx[i].enTimerStatus ) && (enTimerId == pstSsTimerCtx[i].enTimerId)) { break; } } if ( i >= TAF_SSA_MAX_TIMER_NUM) { SSA_LOG1(WARNING_PRINT, "TAF_SSA_StopTimer:too many timer", enTimerId); return; } /* 停止VOS定时器: 当定时器的指针已经为空的时候, 说明其已经停止或者超时 */ if (VOS_NULL_PTR != pstSsTimerCtx[i].hTimer) { (VOS_VOID)NAS_StopRelTimer(WUEPS_PID_SS, enTimerId, &pstSsTimerCtx[i].hTimer); } pstSsTimerCtx[i].hTimer = VOS_NULL_PTR; pstSsTimerCtx[i].enTimerId = TI_TAF_SSA_TIMER_BUTT; pstSsTimerCtx[i].enTimerStatus = TAF_SSA_TIMER_STATUS_STOP; return; }
VOS_UINT32 TAF_SSA_StartTimer( TAF_SSA_TIMER_ID_ENUM_UINT8 enTimerId, VOS_UINT32 ulLen, VOS_UINT8 ucTi ) { TAF_SSA_TIMER_CXT_STRU *pstSsaTimerCtx = VOS_NULL_PTR; VOS_UINT32 i; VOS_UINT32 ulRet; VOS_TIMER_PRECISION_ENUM_UINT32 ulPrecision; NAS_TIMER_OPERATION_STRU stTimer; /*TI有效范围是0-6,8-14*/ if (VOS_FALSE == TAF_SSA_IsTiValid(ucTi)) { SSA_LOG(WARNING_PRINT, "TAF_SSA_StopTimer: Ti invalid!"); return VOS_FALSE; } pstSsaTimerCtx = gastSsaStatetable[ucTi].astSsaTimerCtx; if (0 == ulLen) { SSA_LOG(WARNING_PRINT, "TAF_SSA_StartTimer: timer len is zero!"); return VOS_FALSE; } /* 如果该定时器已经启动则直接返回 */ for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ ) { if ( ( TAF_SSA_TIMER_STATUS_RUNING == pstSsaTimerCtx[i].enTimerStatus ) && ( enTimerId == pstSsaTimerCtx[i].enTimerId)) { SSA_LOG1(WARNING_PRINT, "TAF_SSA_StartTimer:timer is running", enTimerId); return VOS_FALSE; } } for ( i = 0 ; i < TAF_SSA_MAX_TIMER_NUM ; i++ ) { if ( TAF_SSA_TIMER_STATUS_STOP == pstSsaTimerCtx[i].enTimerStatus ) { break; } } if ( i >= TAF_SSA_MAX_TIMER_NUM) { SSA_LOG1(WARNING_PRINT, "TAF_SSA_StartTimer:too many timer", enTimerId); return VOS_FALSE; } if ( ulLen >= VOS_TIMER_MAX_LENGTH ) { ulLen = VOS_TIMER_MAX_LENGTH - 1; } ulPrecision = NAS_GetTimerPrecision(WUEPS_PID_SS, enTimerId); ulRet = VOS_StartRelTimer(&(pstSsaTimerCtx[i].hTimer), WUEPS_PID_SS, ulLen, enTimerId, ucTi, VOS_RELTIMER_NOLOOP, ulPrecision); if ( VOS_OK != ulRet) { SSA_LOG(WARNING_PRINT, "TAF_SSA_StartTimer: start timer failed!"); return VOS_FALSE; } pstSsaTimerCtx[i].enTimerId = enTimerId; pstSsaTimerCtx[i].enTimerStatus = TAF_SSA_TIMER_STATUS_RUNING; /* 定时器状态勾包出来 */ stTimer.MsgHeader.ulSenderCpuId = VOS_LOCAL_CPUID; stTimer.MsgHeader.ulSenderPid = WUEPS_PID_SS; stTimer.MsgHeader.ulReceiverCpuId = VOS_LOCAL_CPUID; stTimer.MsgHeader.ulReceiverPid = VOS_PID_TIMER; stTimer.MsgHeader.ulLength = sizeof(NAS_TIMER_OPERATION_STRU) - VOS_MSG_HEAD_LENGTH; stTimer.MsgHeader.ulMsgName = enTimerId; stTimer.ulTimeAction = NAS_TIMER_OPERATION_START; stTimer.ulTimeLen = ulLen; DIAG_TraceReport(&stTimer); NAS_TIMER_EventReport(stTimer.MsgHeader.ulMsgName, WUEPS_PID_SS, NAS_OM_EVENT_TIMER_OPERATION_START); return VOS_TRUE; }