VOS_VOID CDS_ShowDlSduProcStats(VOS_VOID) { vos_printf("下行SDU数传统计\n\n"); vos_printf("下行GSM模接收SDU个数 %d\n",g_stCdsStats.ulDLGSMRxSduNum); vos_printf("下行GSM模接收IMS数据包个数 %d\n",g_stCdsStats.ulDLGSMRxImsNum); vos_printf("下行GSM模流控丢弃SDU个数 %d\n",g_stCdsStats.ulDLGSMFcFreeSduNum); vos_printf("下行GSM模环回模式下接收SDU个数 %d\n",g_stCdsStats.ulLBDLRxSduInGSM); vos_printf("下行GSM获取缺省RABID失败个数 %d\n",g_stCdsStats.ulDLGSMGetDeftRabIdFail); vos_printf("下行GSM模入队成功个数 %d\n",g_stCdsStats.ulDLGSMEnQueSucc); vos_printf("下行GSM模入队失败个数 %d\n",g_stCdsStats.ulDLGSMEnQueFail); vos_printf("\r\n"); vos_printf("下行UMTS模接收SDU个数 %d\n",g_stCdsStats.ulDLUMTSRxSduNum); vos_printf("下行UMTS模接收IMS数据包个数 %d\n",g_stCdsStats.ulDLUMTSRxImsNum); vos_printf("下行UMTS模流控丢弃SDU个数 %d\n",g_stCdsStats.ulDLUMTSFcFreeSduNum); vos_printf("下行UMTS模环回模式下接收SDU个数 %d\n",g_stCdsStats.ulLBDLRxSduInUMTS); vos_printf("下行UMTS模打桩直接释放SDU个数 %d\n",g_stCdsStats.ulDLUMTSDirectFreeSduNum); vos_printf("下行UMTS获取缺省RABID失败个数 %d\n",g_stCdsStats.ulDLUMTSGetDeftRabIdFail); vos_printf("下行UMTS模入队成功个数 %d\n",g_stCdsStats.ulDLUMTSEnQueSucc); vos_printf("下行UMTS模入队失败个数 %d\n",g_stCdsStats.ulDLUMTSEnQueFail); vos_printf("\r\n"); vos_printf("下行LTE模接收SDU个数 %d\n",g_stCdsStats.ulDLLteRxSduNum); vos_printf("下行LTE模接收IMS数据包个数 %d\n",g_stCdsStats.ulDLLteRxImsNum); vos_printf("下行LTE模流控丢弃SDU个数 %d\n",g_stCdsStats.ulDLLteFcFreeSduNum); vos_printf("下行LTE模打桩直接释放SDU个数 %d\n",g_stCdsStats.ulDLLteDirectFreeSduNum); vos_printf("下行LTE模环回模式下接收SDU个数 %d\n",g_stCdsStats.ulLBDLRxSduInLte); vos_printf("下行LTE获取对应EPSBID失败个数 %d\n",g_stCdsStats.ulDLLteGetEpsbIDFail); vos_printf("下行LTE获取缺省EPSBID失败个数 %d\n",g_stCdsStats.ulDLLteGetDeftEpsbIDFail); vos_printf("下行LTE接收L2 Debug数据包个数 %d\n",g_stCdsStats.ulDLLteRxDbgPkt); vos_printf("下行LTE接收MBMS数据包个数 %d\n",g_stCdsStats.ulDLLteRxMbmsSdu); vos_printf("下行LTE模入队成功个数 %d\n",g_stCdsStats.ulDLLteEnQueSucc); vos_printf("下行LTE模入队失败个数 %d\n",g_stCdsStats.ulDLLteEnQueFail); vos_printf("\r\n"); vos_printf("下行SDU队列当前缓存数据包个数 %d\n",LUP_QueCnt(CDS_GET_IPF_DL_SDU_QUE())); vos_printf("下行SDU入队成功总数 %d\n",g_stCdsStats.ulDLEnSduQueSucc); vos_printf("下行SDU入队失败总数 %d\n",g_stCdsStats.ulDLEnSduQueFail); vos_printf("\r\n"); return; }
VOS_UINT32 CDS_IpfInit(VOS_VOID ) { IPF_COMMON_PARA_S stCommPara; IPF_CHL_CTRL_S stChlCtrl; /*初始化时IP过滤的参数配置*/ stCommPara.bEspSpiDisable = PS_FALSE; /* ESP SPI参与匹配控制信号 */ stCommPara.bAhSpiDisable = PS_FALSE; /* AH SPI参与匹配控制信号 */ stCommPara.bEspAhSel = PS_TRUE; /* 0选ESP,1选AH */ stCommPara.bIpv6NextHdSel = PS_TRUE; stCommPara.eMaxBurst = IPF_BURST_16; /* BURST最大长度 */ stCommPara.bSpWrrModeSel = PS_FALSE; stCommPara.bSpPriSel = PS_FALSE; /* SP优先级选择 */ stCommPara.bFltAddrReverse = PS_FALSE; /* 扩滤器中地址寄存器大小端排列顺序 0表示大端 */ stCommPara.bFilterSeq = PS_FALSE; /* 过滤器配置顺序指示 */ if (IPF_SUCCESS != BSP_IPF_Init(&stCommPara)) { vos_printf("CDS_IpfInit : BSP_IPF_Init Fail!\n"); return PS_FAIL; } /*上行IPF配置为只过滤*/ /*通道工作模式: 只过滤,且不支持链式搬移*/ stChlCtrl.u32WrrValue = 16*1024; stChlCtrl.bDataChain = PS_FALSE; stChlCtrl.bEndian = PS_FALSE; stChlCtrl.eIpfMode = IPF_MODE_FILTERONLY; if (IPF_SUCCESS != BSP_IPF_ConfigUlChannel(&stChlCtrl)) { vos_printf("CDS_IpfInit : BSP_IPF_ConfigUlChannel Fail!\n"); return PS_FAIL; } /*下行IPF通道工作模式: 过滤且搬移,支持链式搬移*/ stChlCtrl.u32WrrValue = 16*1024; stChlCtrl.bDataChain = PS_TRUE; stChlCtrl.bEndian = PS_FALSE; stChlCtrl.eIpfMode = IPF_MODE_FILTERANDTRANS; /*下行IPF配置为只过滤*/ if (IPF_SUCCESS != BSP_IPF_ConfigDlChannel(&stChlCtrl)) { vos_printf("CDS_IpfInit : GU BSP_IPF_ConfigDlChannel Fail!\n"); return PS_FAIL; } if (IPF_SUCCESS != BSP_IPF_RegisterWakeupUlCb((BSP_IPF_WakeupUlCb)CDS_UlIpfIntCB)) { vos_printf("CDS_IpfInit : BSP_IPF_RegisterWakeupUlCb Fail!\n"); return PS_FAIL; } /*创建下行接收队列*/ if (PS_SUCC != LUP_CreateQue(UEPS_PID_CDS, &(CDS_GET_IPF_DL_SDU_QUE()),CDS_IPF_DL_SDU_QUE_SIZE)) { vos_printf("CDS_IpfInit : Create DL Sdu Que Fail"); return PS_FAIL; } /*创建源内存释放队列*/ if (PS_SUCC != LUP_CreateQue(UEPS_PID_CDS, &(CDS_IPF_DL_SRCMEM_FREE_QUE()),CDS_IPF_DL_SRCMEM_FREE_QUE_SIZE)) { vos_printf("CDS_IpfInit : Create IPF DL Src Mem Free Que Fail"); return PS_FAIL; } /*使能上行IP过滤*/ /*lint -e730 -e506 -e944*/ if(IPF_SUCCESS != BSP_IPF_ChannelEnable(IPF_CHANNEL_UP, BSP_TRUE)) { vos_printf("CDS_IpfInit : BSP_IPF_ChannelEnable UL Fail!\n"); return PS_FAIL; } /*使能下行IP过滤*/ if(IPF_SUCCESS != BSP_IPF_ChannelEnable(IPF_CHANNEL_DOWN, BSP_TRUE)) { vos_printf("CDS_IpfInit : BSP_IPF_ChannelEnable DL Fail!\n"); return PS_FAIL; } /*lint +e730 +e506 +e944*/ /*初始化下行IPF过滤器*/ CDS_InitDlIpfFilter(); (VOS_VOID)CDS_DisableDlIPFFilter(MODEM_ID_0); (VOS_VOID)CDS_DisableDlIPFFilter(MODEM_ID_1); return PS_SUCC; }
VOS_UINT32 CDS_IpfInit(VOS_VOID ) { IPF_COMMON_PARA_S stCommPara; IPF_CHL_CTRL_S stChlCtrl; /*初始化时IP过滤的参数配置*/ stCommPara.bEspSpiDisable = PS_FALSE; /* ESP SPI参与匹配控制信号 */ stCommPara.bAhSpiDisable = PS_FALSE; /* AH SPI参与匹配控制信号 */ stCommPara.bEspAhSel = PS_TRUE; /* 0选ESP,1选AH */ stCommPara.bIpv6NextHdSel = PS_TRUE; stCommPara.eMaxBurst = IPF_BURST_16; /* BURST最大长度 */ stCommPara.bSpWrrModeSel = PS_FALSE; stCommPara.bSpPriSel = PS_FALSE; /* SP优先级选择 */ stCommPara.bFltAddrReverse = PS_FALSE; /* 扩滤器中地址寄存器大小端排列顺序 0表示大端 */ stCommPara.bFilterSeq = PS_FALSE; /* 过滤器配置顺序指示 */ /*新增过滤器参数配置*/ stCommPara.bAdReport = PS_FALSE; /* AD上报选择,PS_FALSE:上报结构体指针, PS_TRUE:上报数据指针 */ stCommPara.bMultiModeEn = PS_TRUE; /* 单通道动态模式,PS_TRUE为使能 */ stCommPara.bMultiFilterChainEn = PS_TRUE; /* 单通道多过滤器,PS_TRUE为使能*/ if (IPF_SUCCESS != BSP_IPF_Init(&stCommPara)) { vos_printf("CDS_IpfInit : BSP_IPF_Init Fail!\n"); return PS_FAIL; } /*上行通道工作模式: 过滤且搬移,支持链式搬移*/ stChlCtrl.u32WrrValue = 16*1024; stChlCtrl.bDataChain = PS_FALSE; stChlCtrl.bEndian = PS_FALSE; stChlCtrl.eIpfMode = IPF_MODE_FILTERANDTRANS; if (IPF_SUCCESS != BSP_IPF_ConfigUlChannel(&stChlCtrl)) { vos_printf("CDS_IpfInit : BSP_IPF_ConfigUlChannel Fail!\n"); return PS_FAIL; } /*下行通道工作模式: 过滤且搬移,支持链式搬移*/ stChlCtrl.u32WrrValue = 16*1024; stChlCtrl.bDataChain = PS_TRUE; stChlCtrl.bEndian = PS_FALSE; stChlCtrl.eIpfMode = IPF_MODE_FILTERANDTRANS; if (IPF_SUCCESS != BSP_IPF_ConfigDlChannel(&stChlCtrl)) { vos_printf("CDS_IpfInit : BSP_IPF_ConfigDlChannel Fail!\n"); return PS_FAIL; } /*注册上行RD完成中断*/ if (IPF_SUCCESS != BSP_IPF_RegisterWakeupUlCb((BSP_IPF_WakeupUlCb)CDS_UlIpfIntCB)) { vos_printf("CDS_IpfInit : BSP_IPF_RegisterWakeupUlCb Fail!\n"); return PS_FAIL; } /*注册ADQ空中断回调函数*/ if (IPF_SUCCESS != BSP_IPF_RegisterAdqEmptyUlCb((BSP_IPF_AdqEmptyUlCb)CDS_UlAdqEmptyIntCB)) { vos_printf("CDS_IpfInit : BSP_IPF_RegisterAdqEmptyUlCb Fail!\n"); return PS_FAIL; } /*设置RD完成中断超时时间*/ if (IPF_SUCCESS != BSP_IPF_ConfigTimeout(CDS_IPF_BD_CMP_INT_TIMEOUT)) { vos_printf("CDS_IpfInit : BSP_IPF_ConfigTimeout Fail!\n"); return PS_FAIL; } /*设置AD长度阈值*/ if (IPF_SUCCESS != BSP_IPF_ConfigADThr(CDS_IPF_AD_LEN_THRESHOLD,CDS_IPF_AD_LEN_THRESHOLD)) { vos_printf("CDS_IpfInit : BSP_IPF_ConfigADThr Fail!\n"); return PS_FAIL; } /*创建下行接收队列*/ if (PS_SUCC != LUP_CreateQue(UEPS_PID_CDS, &(CDS_GET_IPF_DL_SDU_QUE()),CDS_IPF_DL_SDU_QUE_SIZE)) { vos_printf("CDS_IpfInit : Create DL Sdu Que Fail.\n"); return PS_FAIL; } /*创建源内存释放队列*/ if (PS_SUCC != LUP_CreateQue(UEPS_PID_CDS, &(CDS_IPF_DL_SRCMEM_FREE_QUE()),CDS_IPF_DL_SRCMEM_FREE_QUE_SIZE)) { vos_printf("CDS_IpfInit : Create IPF DL Src Mem Free Que Fail. \n"); return PS_FAIL; } /*使能上行IP过滤*/ /*lint -e730 -e506 -e944*/ if(IPF_SUCCESS != BSP_IPF_ChannelEnable(IPF_CHANNEL_UP, BSP_TRUE)) { vos_printf("CDS_IpfInit : BSP_IPF_ChannelEnable UL Fail!\n"); return PS_FAIL; } /*使能下行IP过滤*/ if(IPF_SUCCESS != BSP_IPF_ChannelEnable(IPF_CHANNEL_DOWN, BSP_TRUE)) { vos_printf("CDS_IpfInit : BSP_IPF_ChannelEnable DL Fail!\n"); return PS_FAIL; } /*lint +e730 +e506 +e944*/ /*初始化下行IPF过滤器*/ CDS_InitDlIpfFilter(); /*补充ADQ内存*/ CDS_AllocMemForAdq(); (VOS_VOID)CDS_DisableDlIPFFilter(MODEM_ID_0); (VOS_VOID)CDS_DisableDlIPFFilter(MODEM_ID_1); return PS_SUCC; }
VOS_VOID CDS_ConfigDlIPF(VOS_VOID) { VOS_UINT32 ulIdleBD; BSP_U32 ulIdleCD; VOS_UINT32 ulCnt; VOS_UINT32 ulCfgCD; TTF_MEM_ST *pstSrcMem; IPF_CONFIG_DLPARAM_S *pstDlCfgPara; int intLockLevel; /*触发下行IPF释放源内存*/ CDS_FreeIpfDlSrcMem(); /*获得下行空闲BD/CD个数*/ ulIdleBD = (VOS_UINT32)BSP_IPF_GetDlBDNum(&ulIdleCD); if (0 == ulIdleBD) { /*没有空闲BD*/ CDS_DBG_DL_IPF_CFG_HAVE_NO_BD(1); return; } if (ulIdleBD > IPF_DLBD_DESC_SIZE) { CDS_ERROR_LOG1(UEPS_PID_CDS,"CDS_GUConfigDlIPF : DL Idle BD Num Error.",ulIdleBD); return; } if (0 == ulIdleCD) { /*没有空闲CD*/ CDS_DBG_DL_IPF_CFG_HAVE_NO_CD(1); return; } ulCfgCD = 0; for (ulCnt = 0; ulCnt < ulIdleBD; ulCnt ++) { /**/ pstDlCfgPara = &(g_stCdsIpfCtrlEntity.astDlIpfCfgPara[ulCnt]); if (PS_SUCC != LUP_PeekQueHead(CDS_GET_IPF_DL_SDU_QUE(),&pstSrcMem)) { break; } /*Get BD*/ ulCfgCD += CDS_GetTtfMemCnt(pstSrcMem); if (ulCfgCD > ulIdleCD) { CDS_DBG_DL_IPF_CFG_CD_NOT_ENOUGH(1); break; } /*真实出队*/ intLockLevel = VOS_SplIMP(); if (PS_SUCC != LUP_DeQue(CDS_GET_IPF_DL_SDU_QUE(),&pstSrcMem)) { /*异常保护,应该不会*/ VOS_Splx(intLockLevel); break; } VOS_Splx(intLockLevel); pstDlCfgPara->u32Data = (VOS_UINT32)(pstSrcMem); pstDlCfgPara->u16Len = CDS_DL_GET_PKT_LEN_FROM_TTF(pstSrcMem); pstDlCfgPara->u16UsrField1 = CDS_DL_GET_MODEMID_RABID_FROM_TTF(pstSrcMem); if (MODEM_ID_0 == CDS_DL_GET_MODEMID_FROM_TTF(pstSrcMem)) { CDS_DL_BD_SET_ATTR_WITH_FC_HDR(pstDlCfgPara->u16Attribute,IPF_MODEM0_DLFC); } else { CDS_DL_BD_SET_ATTR_WITH_FC_HDR(pstDlCfgPara->u16Attribute,IPF_MODEM1_DLFC); } } /*配置下行过滤包数为0,直接返回*/ if (0 == ulCnt) { return; } /*最后一个BD设置中断标志*/ pstDlCfgPara = &(g_stCdsIpfCtrlEntity.astDlIpfCfgPara[ulCnt - 1]); CDS_DL_BD_SET_ATTR_INT_FLG(pstDlCfgPara->u16Attribute); /*配置上行IPF过滤*/ if (IPF_SUCCESS != BSP_IPF_ConfigDownFilter(ulCnt,g_stCdsIpfCtrlEntity.astDlIpfCfgPara)) { /*配置失败后,源内存释放*/ ulIdleBD = ulCnt; for (ulCnt = 0; ulCnt < ulIdleBD; ulCnt ++) { pstDlCfgPara = &(g_stCdsIpfCtrlEntity.astDlIpfCfgPara[ulCnt]); pstSrcMem = (TTF_MEM_ST*)(pstDlCfgPara->u32Data); TTF_MemFree(UEPS_PID_CDS,pstSrcMem); } CDS_DBG_DL_IPF_CFG_BD_FAIL_NUM(ulIdleBD); return; } /*缓存Src Mem*/ CDS_SaveIpfDlSrcMem(g_stCdsIpfCtrlEntity.astDlIpfCfgPara,ulCnt); CDS_DBG_DL_IPF_CFG_BD_SUCC_NUM(ulCnt); return; }
VOS_VOID CDS_ConfigDlIPF(VOS_VOID) { VOS_UINT32 ulIdleBD; BSP_U32 ulIdleCD; VOS_UINT32 ulCnt; VOS_UINT32 ulCfgCD; TTF_MEM_ST *pstDestMem; TTF_MEM_ST *pstSrcMem; IPF_CONFIG_DLPARAM_S *pstDlCfgPara; int intLockLevel; VOS_UINT16 usSduLen; /*触发下行IPF释放源内存*/ CDS_FreeIpfDlSrcMem(); /*获得下行空闲BD/CD个数*/ ulIdleBD = BSP_IPF_GetDlBDNum(&ulIdleCD); if (0 == ulIdleBD) { /*没有空闲BD*/ CDS_DBG_DL_IPF_CFG_HAVE_NO_BD(1); return; } if (ulIdleBD > IPF_DLBD_DESC_SIZE) { CDS_ERROR_LOG1(UEPS_PID_CDS,"CDS_GUConfigDlIPF : DL Idle BD Num Error.",ulIdleBD); return; } if (0 == ulIdleCD) { /*没有空闲CD*/ CDS_DBG_DL_IPF_CFG_HAVE_NO_CD(1); return; } ulCfgCD = 0; for (ulCnt = 0; ulCnt < ulIdleBD; ulCnt ++) { /**/ pstDlCfgPara = &(g_stCdsIpfCtrlEntity.astDlIpfCfgPara[ulCnt]); if (PS_SUCC != LUP_PeekQueHead(CDS_GET_IPF_DL_SDU_QUE(),&pstSrcMem)) { break; } /*Get BD*/ ulCfgCD += CDS_GetTtfMemCnt(pstSrcMem); if (ulCfgCD > ulIdleCD) { CDS_DBG_DL_IPF_CFG_CD_NOT_ENOUGH(1); break; } /*申请目的内存*/ usSduLen = CDS_DL_GET_PKT_LEN_FROM_TTF(pstSrcMem); pstDestMem = TTF_MemBlkAlloc(UEPS_PID_CDS, TTF_MEM_POOL_ID_DL_SHARE,usSduLen); if (VOS_NULL_PTR == pstDestMem) { if ((0 == usSduLen) || (CDS_DL_SDU_MAX_LEN < usSduLen)) { intLockLevel = VOS_SplIMP(); (VOS_VOID)LUP_DeQue(CDS_GET_IPF_DL_SDU_QUE(),&pstSrcMem); VOS_Splx(intLockLevel); TTF_MemFree(UEPS_PID_CDS,pstSrcMem); CDS_DBG_DL_IPF_CFG_BD_SDU_LEN_ERROR(1); } CDS_DBG_DL_IPF_CFG_BD_ALLOC_MEM_FAIL(1); break; } pstDestMem->usUsed = usSduLen; /*真实出队*/ intLockLevel = VOS_SplIMP(); if (PS_SUCC != LUP_DeQue(CDS_GET_IPF_DL_SDU_QUE(),&pstSrcMem)) { /*异常保护,应该不会*/ VOS_Splx(intLockLevel); vos_printf("CDS_GUConfigDlIPF : Should not be here !\r\n"); TTF_MemFree(UEPS_PID_CDS,pstDestMem); break; } VOS_Splx(intLockLevel); pstDlCfgPara->u16UsrField = CDS_DL_GET_RABID_FROM_TTF(pstSrcMem); pstDlCfgPara->pstDstTtf = pstDestMem; pstDlCfgPara->pstSrcTtf = pstSrcMem; } /*配置下行过滤包数为0,直接返回*/ if (0 == ulCnt) { return; } /*配置上行IPF过滤*/ if (IPF_SUCCESS != BSP_IPF_ConfigDownFilter(ulCnt,g_stCdsIpfCtrlEntity.astDlIpfCfgPara,PS_TRUE)) { /*配置失败后,源内存释放*/ ulIdleBD = ulCnt; for (ulCnt = 0; ulCnt < ulIdleBD; ulCnt ++) { pstDlCfgPara = &(g_stCdsIpfCtrlEntity.astDlIpfCfgPara[ulCnt]); TTF_MemFree(UEPS_PID_CDS,pstDlCfgPara->pstDstTtf); TTF_MemFree(UEPS_PID_CDS,pstDlCfgPara->pstSrcTtf); } CDS_DBG_DL_IPF_CFG_BD_FAIL_NUM(ulIdleBD); return; } CDS_SaveIpfDlSrcMem(g_stCdsIpfCtrlEntity.astDlIpfCfgPara,ulCnt); CDS_DBG_DL_IPF_CFG_BD_SUCC_NUM(ulCnt); return; }