VOS_VOID ADS_FILTER_InitCtx(VOS_VOID) { TAF_NVIM_SHARE_PDP_INFO_STRU stSharePdp; VOS_UINT32 ulTimeLen; PS_MEM_SET(&g_stAdsFilterCtx, 0, sizeof(g_stAdsFilterCtx)); /* 初始化过滤表头节点 */ ADS_FILTER_InitListsHead(); /* 初始化老化周期 */ /* 读取NV项,获取过滤节点老化时长 */ PS_MEM_SET(&stSharePdp, 0, sizeof(stSharePdp)); if (NV_OK != NV_ReadEx(MODEM_ID_0, en_NV_Item_SHARE_PDP_INFO, &stSharePdp, sizeof(stSharePdp))) { ADS_WARNING_LOG(ACPU_PID_ADS_DL, "ADS_FILTER_InitCtx: NV Read Failed!"); stSharePdp.usAgingTimeLen = ADS_FILTER_DEFAULT_AGING_TIMELEN; } ulTimeLen = ADS_FILTER_SECOND_TRANSFER_JIFFIES * stSharePdp.usAgingTimeLen; ADS_FILTER_SET_AGING_TIME_LEN(ulTimeLen); /* 初始化IPv6过滤地址 */ ADS_FILTER_ResetIPv6Addr(); return; }
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; }
/***************************************************************************** 函 数 名 : ADS_UL_IsQueueExistent 功能描述 : 判断队列是否存在 输入参数 : VOS_UINT8 ucInstanceIndex, VOS_UINT8 ucRabId 输出参数 : 无 返 回 值 : VOS_UINT32 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2011年12月12日 作 者 : 鲁琳/l60609 修改内容 : 新生成函数 2.日 期 : 2012年11月24日 作 者 : l60609 修改内容 : DSDA Phase II:双实例 *****************************************************************************/ VOS_UINT32 ADS_UL_IsQueueExistent( VOS_UINT8 ucInstanceIndex, VOS_UINT8 ucRabId ) { /* 队列为空 */ if (VOS_NULL_PTR == ADS_UL_GET_QUEUE_LINK_PTR(ucInstanceIndex, ucRabId)) { ADS_WARNING_LOG(ACPU_PID_ADS_UL, "ADS_UL_IsQueueExistent: g_stAdsCtx.stAdsUlCtx.astAdsUlQueue[ulIndex].pstAdsUlLink is NULL"); return VOS_ERR; } else { 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; }