www.pudn.com > MPC8241BSP.rar > NetTest.c
/********************************************************************* * 版权所有 (C)2002, 深圳市中兴通讯股份有限公司。 * * 文件名称: niddtask.c * 文件标识: * 内容摘要: * 其它说明: * 当前版本: * 作 者: 邹同亮 CDMA事业部软件支撑部 * 完成日期: 2003年06月06日 * * 修改记录1: * 修改日期: * 版 本 号: * 修 改 人: * 修改内容: * 修改记录2:… **********************************************************************/ #include#include #include #include #include #include #include #include #include #include #include #include #include "end.h" #include "endLib.h" #include "ipPktData.h" /****************************************** 宏定义 *******************************************/ #undef STATISTIC_TIMES /* 统计时间间隔 */ #define STATISTIC_TIMES 10 /****************************************** 全局变量申明和定义 *******************************************/ unsigned int g_MuxSendPkt; /* 上层发给网口驱动包数 */ unsigned int g_DriverSendPkt; /* 网口驱动发出包数 */ unsigned int g_DriverRecvPkt; /* 网口驱动接收包数 */ unsigned int g_MuxRecvPkt; /* 网口驱动送给上层包数 */ unsigned char g_ucTestNetUnit = 1; char g_cTestNetName[10] = ""; int g_iPrintTaskID = 0; END_OBJ *pFindEnd; /* 网口对应的END_OBJ */ CL_POOL_ID g_pClPoolId;/* 网口对应的缓冲池的clusterID */ unsigned short g_usPktLen = 256; /* 包长度 */ unsigned long g_dwTime = 600; /* 设置发包时长,以秒为单位 */ unsigned long g_dwRealTime = 0; /* 实际发包时长,以秒为单位 */ unsigned char g_ucPktContent = 0;/* 包内容 */ unsigned long g_dwBurstNum = 1; /* 突发包数*/ /****************************************** 函数声明 *******************************************/ extern void sysAuxClk1Disable (void); /* 停止定时器 */ extern void sysAuxClk1Enable (void); /* 使能定时器 */ extern STATUS sysAuxClk1RateSet( int ticksPerSecond ); /* 定时器大小设置,ticksPerSecond单位为100us */ extern STATUS sysAuxClk1Connect(FUNCPTR routine, int arg ); /* 连接定时器的ISR */ void ResetCounter(void); /* 复位各种计数器 */ void StopNetTest(void); /* 发包函数 */ void SendPacket(void) { USHORT wTmp; M_BLK_ID pMblk; /* 发送包Mblk指针 */ CL_BLK_ID pClBlk; char *pCluster; unsigned short i; STATUS SendResult; for(i=0; i pNetPool, M_DONTWAIT, MT_DATA); if(pMblk == NULL) { continue; } if((pClBlk = netClBlkGet (pFindEnd->pNetPool, M_DONTWAIT)) == NULL) { netMblkFree(pFindEnd->pNetPool, pMblk); continue; } pCluster = netClusterGet(pFindEnd->pNetPool, g_pClPoolId); if (pClBlk == NULL) { netMblkFree(pFindEnd->pNetPool, pMblk); netClBlkFree(pFindEnd->pNetPool, pClBlk); continue; } netClBlkJoin (pClBlk, pCluster, g_usPktLen, NULL, 0, 0, 0); netMblkClJoin (pMblk, pClBlk); /* RTL_CACHE_INVALIDATE (pMblk->mBlkHdr.mData, g_usPktLen); */ memcpy( pMblk->m_data,(void*)cSendData, g_usPktLen ); pMblk->m_len = g_usPktLen; pMblk->mBlkHdr.mFlags |= M_PKTHDR; pMblk->mBlkPktHdr.len = pMblk->m_len; g_MuxSendPkt++; SendResult = (*(pFindEnd->pFuncTable->send))( pFindEnd , pMblk ); if(SendResult == OK) { g_DriverSendPkt++; } if(SendResult == END_ERR_BLOCK) { netMblkClChainFree(pMblk); } } } /* usPktLen:包长度 BurstNum:突发数 DelayTime:突发延迟 */ void SendNetPkt(unsigned short usPktLen, int BurstNum, int DelayTime) { if((usPktLen <64) ||(usPktLen >1514) ||(BurstNum < 1) ||(DelayTime < 1) ) { printf("输入数据非法,重新输入!\n"); } sysAuxClk1Disable(); taskDelay(10); memcpy(cSendData, (void*)ipData1470, g_usPktLen); memcpy(cSendData, (void*)PacktHead, 12); g_usPktLen = usPktLen; g_dwBurstNum = BurstNum; sysAuxClk1RateSet(10000/DelayTime); sysAuxClk1Enable(); return; } /************************************************************************ * 函数名称: SendPacket * 功能描述: 连续一定时长发一定流量和长度的包, * 输入参数: usPktLen:包长,不包括CRC * usFlux: 流量大小,以Mbp/s为单位 * usTime: 发包时长,以妙为单位 × ucPktContent: 包内容,0表示内容固定,1表示内容随机 * 输出参数: 无 * 返 回 值: 无 * 其它说明: 无 * 修改日期: 版本号 修改人 修改内容 * ----------------------------------------------- * 2002/12/24 V1.0 邹同亮 创建 ************************************************************************/ void SendPkt(unsigned short usPktLen, unsigned long usFlux, unsigned long dwTime, unsigned char ucPktContent) { unsigned long dwPktPerSecond; /* 每秒要发的包数 */ if((usPktLen <64) ||(usPktLen >1514) ||(usFlux > 99) ||(dwTime <1 ) ||(ucPktContent >1) ) { printf("输入数据非法,重新输入!\n"); } /* 先停止发包 */ sysAuxClk1Disable(); taskDelay(10); g_usPktLen = usPktLen; g_ucPktContent = ucPktContent; g_dwTime = dwTime + 1; /* 保留发送时间 */ g_dwRealTime = 0; dwPktPerSecond = (usFlux*1000000/8)/usPktLen; /* 底层网口是8139 */ if(strncmp(g_cTestNetName, "rtl", 3) == 0) { g_dwBurstNum = 64; } /* 底层网口是82559 */ else if (strncmp(g_cTestNetName, "er", 2) == 0) { g_dwBurstNum = 100; } else { g_dwBurstNum = 64; } if(g_ucPktContent == 0) { memcpy(cSendData, (void*)ipData1470, g_usPktLen); memcpy(cSendData, (void*)PacktHead, 12); } sysAuxClk1RateSet(dwPktPerSecond/g_dwBurstNum); sysAuxClk1Enable(); } unsigned int g_uiTempSendPkt = 0; unsigned int g_uiTempRecvPkt = 0; /* 打印函数 */ void Print_Entry(int TimeLength) { while(1) { #if 0 printf("\n\n"); GetRtl8139Info(1, 2); printf("\n\n"); #endif printf("\n\n"); printf("------------------------------------------------------\n"); g_uiTempSendPkt = g_MuxSendPkt - g_uiTempSendPkt; g_uiTempRecvPkt = g_MuxRecvPkt - g_uiTempRecvPkt; printf("包长: %d\n",g_usPktLen); printf("MUX发送流量1(pkt/s) = %d \n", g_uiTempSendPkt / TimeLength ); printf("MUX发送流量2(bit/s) = %d,%03d,%03d \n", (g_uiTempSendPkt*g_usPktLen*8/TimeLength)/1000000, ((g_uiTempSendPkt*g_usPktLen*8/TimeLength)%1000000)/1000, ((g_uiTempSendPkt*g_usPktLen*8/TimeLength)%1000) ); printf("MUX接收流量1(pkt/s) = %d \n", g_uiTempRecvPkt / TimeLength ); printf("MUX接收流量2(bit/s) = %d,%03d,%03d \n", (g_uiTempRecvPkt*g_usPktLen*8/TimeLength)/1000000, ((g_uiTempRecvPkt*g_usPktLen*8/TimeLength)%1000000)/1000, ((g_uiTempRecvPkt*g_usPktLen*8/TimeLength)%1000) ); g_uiTempSendPkt = g_MuxSendPkt; g_uiTempRecvPkt = g_MuxRecvPkt; printf("\n"); printf("MUX发出总包数 = %d \n", g_MuxSendPkt); printf("驱动发出总包数 = %d \n", g_DriverSendPkt); printf("驱动接收总包数 = %d \n", g_DriverRecvPkt); printf("MUX接收总包数 = %d \n", g_MuxRecvPkt); taskDelay( (sysClkRateGet()) * TimeLength); /* 判断规定的发送时间是否已经超时了 */ g_dwTime -= TimeLength; while(g_dwTime 10) || (strlen(cNetName) < 3)) { printf("输入非法错误!\n"); } strncpy(g_cTestNetName, cNetName, strlen(cNetName) -1 ); g_ucTestNetUnit = cNetName[strlen(cNetName) -1] - 0x30; if(g_ucTestNetUnit > 9) { printf("测试网口编号不能超过9!\n"); return ; } /* 测试前先判断网口是否存在 */ pFindEnd = endFindByName(g_cTestNetName, g_ucTestNetUnit); if(pFindEnd == NULL ) { printf("找不到编号为%d的测试网口,网口可能没有初始化!\n", g_ucTestNetUnit); return ; } g_pClPoolId = clPoolIdGet(pFindEnd->pNetPool, 100, FALSE); if(g_pClPoolId == NULL ) { printf("获得Cluster池的ID失败!\n"); } /* 复位定时器 */ ResetCounter(); /* 如果打印任务创建则先删除 */ if(g_iPrintTaskID == 0) { /* 创建打印任务 */ g_iPrintTaskID = taskSpawn("tPrint", 135, 0, 1000, (FUNCPTR)Print_Entry, STATISTIC_TIMES,0,0,0,0,0,0,0,0,0); } /* 设置发包程序为定时器的ISR */ if(ucIsConnected) { return; } if(sysAuxClk1Connect((FUNCPTR)SendPacket, 0) ==OK) { ucIsConnected = 1; printf("发包中断服务程序连接成功!\n"); } else { ucIsConnected = 0; printf("发包中断服务程序连接失败!\n"); } } /* 停止测试 */ void StopNetTest(void) { sysAuxClk1Disable(); g_dwTime = STATISTIC_TIMES + 1; } void ResetCounter(void) { g_dwRealTime =0; g_MuxSendPkt =0; g_DriverSendPkt =0; g_DriverRecvPkt =0; g_MuxRecvPkt =0; g_uiTempSendPkt =0; g_uiTempRecvPkt =0; } void SetMacAddr(char cMac[12]) { if(strlen(cMac) < 12) { printf("输入参数不正确!\n"); } memcpy(PacktHead, (void*)cMac, 12); }