📄 nettest.c
字号:
/*********************************************************************
* 版权所有 (C)2002, 深圳市中兴通讯股份有限公司。
*
* 文件名称: niddtask.c
* 文件标识:
* 内容摘要:
* 其它说明:
* 当前版本:
* 作 者: 邹同亮 CDMA事业部软件支撑部
* 完成日期: 2003年06月06日
*
* 修改记录1:
* 修改日期:
* 版 本 号:
* 修 改 人:
* 修改内容:
* 修改记录2:…
**********************************************************************/
#include <vxworks.h>
#include <errnoLib.h>
#include <time.h>
#include <muxLib.h>
#include <time.h>
#include <taskLib.h>
#include <sys/types.h>
#include <wdLib.h>
#include <sysLib.h>
#include <msgQLib.h>
#include <intLib.h>
#include <netLib.h>
#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<g_dwBurstNum; i++ )
{
pMblk = mBlkGet(pFindEnd->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 <TimeLength )
{
sysAuxClk1Disable();
taskDelay((sysClkRateGet()) * 2); /* 延时2秒等包发完 */
/* 打印测试结果 */
printf("\n\n");
printf("*************测试已经结束,测试结果如下**********\n");
printf("包长: %d\n",g_usPktLen);
printf("测试时长: %d秒\n",g_dwRealTime);
printf("丟包率: %f\n",((float)(g_MuxSendPkt - g_MuxRecvPkt))/((float)g_MuxSendPkt));
printf("硬件丟包率: %f\n",((float)(g_DriverSendPkt - g_DriverRecvPkt))/((float)g_DriverSendPkt));
printf("上层发给网口驱动包数:%d\n",g_MuxSendPkt);
printf("网口驱动发出包数: %d\n",g_DriverSendPkt);
printf("网口驱动接收包数: %d\n",g_DriverRecvPkt);
printf("网口驱动送给上层包数:%d\n",g_MuxRecvPkt);
taskDelay((sysClkRateGet()) * 18); /* 延时18秒又打印 */
}
g_dwRealTime += TimeLength;
}
}
void StartNetTest(char cNetName[10])
{
static unsigned char ucIsConnected;
if(ucIsConnected != 1)
{
ucIsConnected = 0;
}
if((strlen(cNetName) > 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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -