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_UINT32 ulLockLevel; ulLockLevel = 0; 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; } /* 队列加锁 */ VOS_SpinLockIntLock(ADS_UL_GET_QUEUE_LINK_SPINLOCK(ucInstanceIndex, ucRabId), ulLockLevel); /* 结点存在,但队列不存在 */ 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) /* (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; }
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; }