⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nettest.c

📁 MPC8241:本程序是freescale的824*系列的BSP源程序
💻 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 + -