VOS_UINT32 ADS_UL_RcvCdsStopSendDataInd(MsgBlock *pMsg) { VOS_UINT8 ucInstanceIndex; VOS_UINT8 ucRabId; CDS_ADS_STOP_SENDDATA_IND_STRU *pstStopSendDataIndMsg; pstStopSendDataIndMsg = (CDS_ADS_STOP_SENDDATA_IND_STRU *)(pMsg); ucInstanceIndex = (VOS_UINT8)pstStopSendDataIndMsg->enModemId; ucRabId = pstStopSendDataIndMsg->ucRabId; /* 将对应是否允许发送的标志置为VOS_FALSE */ ADS_UL_SET_RAB_SND_PERMIT_FLAG(ucInstanceIndex, ucRabId, VOS_FALSE); /* 判断该modem的所有RAB都不允许发送 */ if (VOS_FALSE == ADS_UL_GetSpecInstanceSndPermitFlg(ucInstanceIndex)) { ADS_UL_SET_MODEM_SND_PERMIT_FLAG(ucInstanceIndex, VOS_FALSE); } /* 所有承载都不允许发送,停止ADS_UL_SEND_TIMER定时器 */ if (VOS_TRUE == ADS_UL_IsAllRabNotSndPermitFlg()) { ADS_StopTimer(ACPU_PID_ADS_UL, TI_ADS_UL_SEND, ADS_TIMER_STOP_CAUSE_USER); } /* 回复ID_CDS_ADS_STOP_SENDDATA_RSP消息 */ ADS_UL_SendCdsStopSendDataRsp(pstStopSendDataIndMsg->enModemId, pstStopSendDataIndMsg->ucRabId); return VOS_OK; }
VOS_VOID ADS_UL_StopRptStatsInfoTimer(VOS_VOID) { VOS_UINT8 ucInsIndex; for (ucInsIndex = 0; ucInsIndex < ADS_INSTANCE_MAX_NUM; ucInsIndex++) { if (VOS_FALSE == ADS_UL_IsAnyQueueExist(ucInsIndex)) { ADS_StopTimer(ACPU_PID_ADS_UL, TI_ADS_RPT_STATS_INFO, ADS_TIMER_STOP_CAUSE_USER); } } }
VOS_VOID ADS_UL_StopDsFlowStats( VOS_UINT8 ucInstance, VOS_UINT8 ucRabId ) { /* 如果所有上行队列已不存在,则停止流量统计定时器并清空流量统计信息 */ if (VOS_FALSE == ADS_UL_IsAnyQueueExist(ucInstance)) { ADS_StopTimer(ACPU_PID_ADS_UL, ADS_GET_DSFLOW_TMR_ID(ucInstance), ADS_TIMER_STOP_CAUSE_USER); ADS_InitStatsInfoCtx(ucInstance); } return; }
VOS_UINT32 ADS_UL_RcvCcpuResetStartInd( MsgBlock *pstMsg ) { VOS_UINT8 ucInsIndex; VOS_UINT8 ucRabIndex; VOS_UINT8 ucTiIndex; ADS_CTX_STRU *pstAdsCtx = VOS_NULL_PTR; pstAdsCtx = ADS_GetAllCtx(); /* 清空所有上行缓存队列 */ for (ucInsIndex = 0; ucInsIndex < ADS_INSTANCE_MAX_NUM; ucInsIndex++) { for (ucRabIndex = 0; ucRabIndex < ADS_RAB_ID_MAX + 1; ucRabIndex++) { ADS_UL_DestroyQueue(ucInsIndex, ucRabIndex); } } #if (FEATURE_OFF == FEATURE_SKB_EXP) /* 清空源内存队列 */ ADS_UL_ClearIpfUlSrcMem(); #endif /* 停止所有启动的定时器 */ for (ucTiIndex = 0; ucTiIndex < ADS_MAX_TIMER_NUM; ucTiIndex++) { ADS_StopTimer(ACPU_PID_ADS_UL, ucTiIndex, ADS_TIMER_STOP_CAUSE_USER); } /* 初始化每个实例的上下文 */ ADS_ResetSpecCtx(); /* 重置IPF相关的上下文 */ ADS_ResetIpfCtx(); /* 重置当前实例索引值 */ pstAdsCtx->ucAdsCurInstanceIndex = ADS_INSTANCE_INDEX_0; /* 重置ADS Filter过滤上下文 */ ADS_FILTER_Reset(); ADS_ResetDebugInfo(); /* 释放信号量,使得调用API任务继续运行 */ VOS_SmV(ADS_GetULResetSem()); return VOS_OK; }
VOS_UINT32 ADS_UL_RcvTimerMsg(MsgBlock *pMsg) { REL_TIMER_MSG *pstTimerMsg; pstTimerMsg = (REL_TIMER_MSG *)pMsg; /* 停止该定时器 */ ADS_StopTimer(ACPU_PID_ADS_UL, pstTimerMsg->ulName, ADS_TIMER_STOP_CAUSE_TIMEOUT); switch (pstTimerMsg->ulName) { /* 处理ADS_UL_SEND_TIMER定时器超时 */ case TI_ADS_UL_SEND: /* 处理上行数据 */ ADS_UL_ProcLinkData(); break; case TI_ADS_DSFLOW_STATS_0: case TI_ADS_DSFLOW_STATS_1: ADS_UL_RcvTiDsFlowStatsExpired(pstTimerMsg->ulName, pstTimerMsg->ulPara); break; case TI_ADS_RPT_STATS_INFO: ADS_UL_RcvTiRptStatsInfoExpired(pstTimerMsg->ulName, pstTimerMsg->ulPara); break; case TI_ADS_UL_DATA_STAT: ADS_UL_RcvTiDataStatExpired(pstTimerMsg->ulName, pstTimerMsg->ulPara); break; default: break; } return VOS_OK; }
VOS_UINT32 ADS_UL_InsertQueue( VOS_UINT8 ucInstanceIndex, IMM_ZC_STRU *pstData, VOS_UINT8 ucRabId ) { VOS_UINT32 ulNonEmptyEvent; VOS_UINT32 ulAllUlQueueDataNum; #if(FEATURE_OFF == FEATURE_SKB_EXP) VOS_UINT ulQueueLen; #endif VOS_ULONG ulLockLevel; ulNonEmptyEvent = VOS_FALSE; /* 此接口不释放pstData,由上层模块根据函数返回值判断是否需要释放内存 */ /* 判断RabId是否为有效值 */ if (VOS_OK != ADS_IsValidRabId(ucRabId)) { ADS_WARNING_LOG1(ACPU_PID_ADS_UL, "ADS_UL_InsertQueue: ucRabId is", ucRabId); return VOS_ERR; } /* 队列加锁 */ /*lint -e571*/ VOS_SpinLockIntLock(ADS_UL_GET_QUEUE_LINK_SPINLOCK(ucInstanceIndex, ucRabId), ulLockLevel); /*lint +e571*/ /* 结点存在,但队列不存在 */ if (VOS_OK != ADS_UL_IsQueueExistent(ucInstanceIndex, ucRabId)) { /* 队列操作完成解锁 */ VOS_SpinUnlockIntUnlock(ADS_UL_GET_QUEUE_LINK_SPINLOCK(ucInstanceIndex, ucRabId), ulLockLevel); ADS_WARNING_LOG(ACPU_PID_ADS_UL, "ADS_UL_InsertQueue:the queue is not ext!"); return VOS_ERR; } #if(FEATURE_OFF == FEATURE_SKB_EXP) ulQueueLen = IMM_ZcQueueLen(ADS_UL_GET_QUEUE_LINK_PTR(ucInstanceIndex, ucRabId)); if (ulQueueLen >= ADS_UL_GET_MAX_QUEUE_LENGTH(ucInstanceIndex)) { /* 队列操作完成解锁 */ VOS_SpinUnlockIntUnlock(ADS_UL_GET_QUEUE_LINK_SPINLOCK(ucInstanceIndex, ucRabId), ulLockLevel); ADS_DBG_UL_DROPPED_PACKET_NUM(1); return VOS_ERR; } /* 插入队列前将数据打上时间戳 */ pstData->tstamp.tv64 = (VOS_INT64)VOS_GetSlice(); #endif /* 插入队列 */ IMM_ZcQueueTail(ADS_UL_GET_QUEUE_LINK_PTR(ucInstanceIndex, ucRabId), pstData); /* 队列由空变为非空 */ if (1 == IMM_ZcQueueLen(ADS_UL_GET_QUEUE_LINK_PTR(ucInstanceIndex, ucRabId))) { ulNonEmptyEvent = VOS_TRUE; } /* 队列操作完成解锁 */ VOS_SpinUnlockIntUnlock(ADS_UL_GET_QUEUE_LINK_SPINLOCK(ucInstanceIndex, ucRabId), ulLockLevel); ulAllUlQueueDataNum = ADS_UL_GetAllQueueDataNum(); #if(FEATURE_OFF == FEATURE_SKB_EXP) if (VOS_TRUE == ADS_UL_GET_THRESHOLD_ACTIVE_FLAG()) { /* (1).jiffies超时,则直接触发发数,并停止发数定时器 (2).队列中数据已到攒包门限且当前没有在处理数据,触发上行缓存缓存处理事件 (3).队列由空变为非空时启动数据统计定时器以及保护定时器 */ ADS_UL_ADD_STAT_PKT_NUM(1); /* 超时长度为非零则需要启动触发发数 */ if (0 != ADS_UL_GET_JIFFIES_EXP_TMR_LEN()) { if (ADS_TIME_AFTER_EQ(ADS_GET_CURR_KERNEL_TIME(), (ADS_UL_GET_JIFFIES_TMR_CNT() + ADS_UL_GET_JIFFIES_EXP_TMR_LEN()))) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); ADS_StopTimer(ACPU_PID_ADS_UL, TI_ADS_UL_SEND, ADS_TIMER_STOP_CAUSE_USER); ADS_UL_SET_JIFFIES_TMR_CNT(ADS_GET_CURR_KERNEL_TIME()); return VOS_OK; } } if (ADS_UL_IS_REACH_THRESHOLD_DYNAMIC(ulAllUlQueueDataNum, ADS_UL_GET_SENDING_FLAG())) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); } /* 队列由空变为非空 */ if (VOS_TRUE == ulNonEmptyEvent) { ADS_StartTimer(ACPU_PID_ADS_UL, TI_ADS_UL_DATA_STAT, ADS_UL_GET_STAT_TIMER_LEN()); ADS_StartTimer(ACPU_PID_ADS_UL, TI_ADS_UL_SEND, ADS_UL_GET_PROTECT_TIMER_LEN()); } } else { /* (1).队列由空变为非空时触发上行缓存处理事件 (2).队列中数据已到攒包门限的整数倍且当前没有在处理数据 触发上行缓存缓存处理事件 */ if (VOS_TRUE == ulNonEmptyEvent) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); } else { if (ADS_UL_IS_REACH_THRESHOLD(ulAllUlQueueDataNum, ADS_UL_GET_SENDING_FLAG())) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); } } } #else /* (1).从TCP/IP协议栈过来的的数据,ucTailPktInd为0. 当队列由空到非空, 或是达到攒包门限且当前没有在数据处理时触发上行缓存处理事件. (2).USB过来的数据非最后一个包ucTailPktInd为2,最后一个包ucTailPktInd为1 当为最后一个IP包, 或是达到攒包门限且当前没有在数据处理时触发上行缓存处理事件. */ if (0 == pstData->private_mem.ucTailPktInd) { if ((VOS_TRUE == ulNonEmptyEvent) || (ADS_UL_IS_REACH_THRESHOLD(ulAllUlQueueDataNum, ADS_UL_GET_SENDING_FLAG()))) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); } } else { if ((1 == pstData->private_mem.ucTailPktInd) || (ADS_UL_IS_REACH_THRESHOLD(ulAllUlQueueDataNum, ADS_UL_GET_SENDING_FLAG()))) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); } } #endif return VOS_OK; }