VOS_UINT32 ADS_UL_RcvCdsClearDataInd(MsgBlock *pMsg) { VOS_UINT8 ucRabId; ADS_UL_CTX_STRU *pstAdsUlCtx; CDS_ADS_CLEAR_DATA_IND_STRU *pstClearData; VOS_UINT8 ucInstanceIndex; pstClearData = (CDS_ADS_CLEAR_DATA_IND_STRU *)pMsg; /* AT接口修改后,获取此值 */ ucInstanceIndex = (VOS_UINT8)pstClearData->enModemId; pstAdsUlCtx = ADS_GetUlCtx(ucInstanceIndex); ucRabId = pstClearData->ucRabId; if (CDS_ADS_ALL_RABID == pstClearData->ucRabId) { for (ucRabId = ADS_RAB_ID_MIN; ucRabId <= ADS_RAB_ID_MAX; ucRabId++) { if (VOS_OK == ADS_UL_IsQueueExistent(ucInstanceIndex, ucRabId)) { /* 销毁队列中的数据 */ ADS_UL_ClearQueue(ucRabId, pstAdsUlCtx->astAdsUlQueue[ucRabId].pstAdsUlLink); } } } else { /* 判断RabId是否为有效值 */ if (VOS_OK == ADS_IsValidRabId(pstClearData->ucRabId)) { /* 结点存在,但队列不存在 */ if (VOS_OK == ADS_UL_IsQueueExistent(ucInstanceIndex, pstClearData->ucRabId)) { /* 销毁队列中的数据 */ ADS_UL_ClearQueue(ucRabId, pstAdsUlCtx->astAdsUlQueue[ucRabId].pstAdsUlLink); } else { ADS_WARNING_LOG(ACPU_PID_ADS_UL, "ADS_UL_RcvCdsClearDataInd:Queue is not exist"); } } else { ADS_WARNING_LOG1(ACPU_PID_ADS_UL, "ADS_UL_RcvCdsClearDataInd: Invalid RabId is", pstClearData->ucRabId); } } /* 回复ID_CDS_ADS_CLEAR_DATA_RSP消息 */ ADS_UL_SendCdsClearDataRsp(pstClearData->enModemId, pstClearData->ucRabId); return VOS_OK; }
VOS_UINT32 ADS_UL_SendPacketEx( IMM_ZC_STRU *pstData, ADS_PKT_TYPE_ENUM_UINT8 enIpType, VOS_UINT8 ucRabId ) { ADS_DL_RAB_INFO_STRU *pstDlRabInfo; VOS_UINT8 ucInstanceIndex; VOS_UINT8 ucRealRabId; /* 判断是否为空数据包 */ if (VOS_NULL_PTR == pstData) { ADS_WARNING_LOG(ACPU_PID_ADS_UL, "ADS_UL_SendPacketEx: pstData is null!"); return VOS_ERR; } ucInstanceIndex = ADS_GET_MODEM_ID_FROM_EX_RAB_ID(ucRabId); ucRealRabId = ADS_GET_RAB_ID_FROM_EX_RAB_ID(ucRabId); /* 判断是否已经注册过下行过滤回调函数,若注册过,则需要进行过滤信息的提取,否则直接发送报文 */ pstDlRabInfo = ADS_DL_GET_RAB_INFO_PTR(ucInstanceIndex, ucRealRabId); if (VOS_NULL_PTR != pstDlRabInfo->pRcvDlFilterDataFunc) { /* 调用过滤上行数据包处理函数 */ ADS_FILTER_ProcUlPacket(pstData, enIpType); } /* 增加上行接收数据统计个数 */ ADS_DBG_RECV_UL_PKT_NUM(ucInstanceIndex, 1); /* 流量统计 */ ADS_ULFlowAdd(ucInstanceIndex, pstData->len); /* 追踪上行接收数据 */ ADS_MNTN_TraceRcvUlData(); /* 统计上行周期性收到的数据字节数,用于流量查询 */ ADS_RECV_UL_PERIOD_PKT_NUM(ucInstanceIndex, pstData->len); /* 将pstData插入到ucRabId对应的缓存队列中 */ if (VOS_OK != ADS_UL_InsertQueue(ucInstanceIndex, pstData, ucRealRabId)) { ADS_DBG_UL_ENQUE_FAIL_NUM(ucInstanceIndex, 1); ADS_WARNING_LOG1(ACPU_PID_ADS_UL, "ADS_UL_SendPacketEx: insert fail, rab id !", ucRealRabId); return VOS_ERR; } return VOS_OK; }
VOS_UINT32 ADS_UL_SendPacket( IMM_ZC_STRU *pstData, VOS_UINT8 ucRabId ) { VOS_UINT8 ucInstanceIndex; VOS_UINT8 ucRealRabId; /* 判断是否为空数据包 */ if (VOS_NULL_PTR == pstData) { ADS_WARNING_LOG(ACPU_PID_ADS_UL, "ADS_UL_SendPacket: pstData is null!"); return VOS_ERR; } ucInstanceIndex = ADS_GET_MODEM_ID_FROM_EX_RAB_ID(ucRabId); ucRealRabId = ADS_GET_RAB_ID_FROM_EX_RAB_ID(ucRabId); /* 增加上行接收数据统计个数 */ ADS_DBG_RECV_UL_PKT_NUM(ucInstanceIndex, 1); /* 流量统计 */ ADS_ULFlowAdd(ucInstanceIndex, pstData->len); /* 追踪上行接收数据 */ ADS_MNTN_TraceRcvUlData(); /* 统计上行周期性收到的数据字节数,用于流量查询 */ ADS_RECV_UL_PERIOD_PKT_NUM(ucInstanceIndex, pstData->len); /* 将pstData插入到ucRabId对应的缓存队列中 */ if (VOS_OK != ADS_UL_InsertQueue(ucInstanceIndex, pstData, ucRealRabId)) { ADS_DBG_UL_ENQUE_FAIL_NUM(ucInstanceIndex, 1); ADS_WARNING_LOG1(ACPU_PID_ADS_UL, "ADS_UL_SendPacket: insert fail, rab id !", ucRealRabId); return VOS_ERR; } 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_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; }
VOS_UINT32 ADS_UL_ProcPdpStatusInd( MODEM_ID_ENUM_UINT16 enModemId, VOS_UINT8 ucRabId, ADS_PDP_STATUS_ENUM_UINT8 enPdpStatus, ADS_QCI_TYPE_ENUM_UINT8 enQciType, ADS_PDP_TYPE_ENUM_UINT8 enPdpType ) { VOS_UINT8 ucInstanceIndex; ADS_CDS_IPF_PKT_TYPE_ENUM_UINT8 enPktType; ADS_QCI_TYPE_ENUM_UINT8 enPrio; enPktType = ADS_CDS_IPF_PKT_TYPE_IP; ucInstanceIndex = (VOS_UINT8)enModemId; enPrio = enQciType; /* RabId合法性检查 */ if (VOS_OK != ADS_IsValidRabId(ucRabId)) { ADS_WARNING_LOG1(ACPU_PID_ADS_UL, "ADS_UL_ProcPdpStatusInd: ucRabId is ", ucRabId); return VOS_ERR; } /* 如果不采用优先级,则修改所有PDP的QCI为相同优先级,根据排序算法这样可以使先激活的PDP优先处理 */ if (VOS_FALSE == g_stAdsCtx.astAdsSpecCtx[ucInstanceIndex].stAdsUlCtx.stQueuePriNv.ulStatus) { enPrio = ADS_QCI_TYPE_QCI9_NONGBR; } if (ADS_PDP_PPP == enPdpType) { enPktType = ADS_CDS_IPF_PKT_TYPE_PPP; } /* 根据PDP状态分别进行处理 */ switch(enPdpStatus) { /* PDP激活 */ case ADS_PDP_STATUS_ACT: /* 创建缓存队列 */ ADS_UL_CreateQueue(ucInstanceIndex, ucRabId, enPrio, enPktType); /* 启动流量统计 */ ADS_UL_StartDsFlowStats(ucInstanceIndex, ucRabId); /* 启动上报统计信息定时器 */ ADS_UL_StartRptStatsInfoTimer(ucInstanceIndex, ucRabId); break; /* PDP修改 */ case ADS_PDP_STATUS_MODIFY: /* 将修改的队列信息更新到上行队列管理中 */ ADS_UL_UpdateQueueInPdpModified(ucInstanceIndex, enPrio, ucRabId); break; /* PDP去激活 */ case ADS_PDP_STATUS_DEACT: /* 销毁缓存队列 */ ADS_UL_DestroyQueue(ucInstanceIndex, ucRabId); #if(FEATURE_OFF == FEATURE_SKB_EXP) /* 当所有的PDP都去激活后,清空源内存队列 */ ADS_UL_ClearIpfUlSrcMem(); #endif /* 停止流量统计 */ ADS_UL_StopDsFlowStats(ucInstanceIndex, ucRabId); /* 关闭上报统计信息定时器 */ ADS_UL_StopRptStatsInfoTimer(); break; default: break; } return VOS_OK; }