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; ipNetPool, 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);	 
}