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

📄 ge_arp.c

📁 程序是一个vxworks下对PMC公司3386千兆MAC芯片的驱动和配置
💻 C
📖 第 1 页 / 共 3 页
字号:
/**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-
*	GE_arp.c - Ethernet 1000M code. . 
*
*	Copyright 2001-12 by GDT, Inc
*
*	modification history
*	--------------------
*       2001-12-14,yxy created.
*
*/
#include <stdio.h>
#include <msgQlib.h>
#include <semLib.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <tickLib.h>
#include <sysLib.h>
#include <taskLib.h>

#include "GE_Arp.h"
#include "GE_CAM.h"
#include "GE_EventStatistic.h"
#include "GE_Global.h"
#include "GE_GlobalP.h"

#include "global.h"
#include "SBSL_MemManage.h"
#include "SBSL_Monitor.h"
#include "SBSL_Timer.h"
#include "GE_Utility.h"
#include "bdcom_860.h"



unsigned short		ARP_INTERVAL=30;
unsigned int 		addrCount;
int 			GE_ARP_TIMER_ID;
ARP_INFO		arpInfo[2];
MSG_Q_ID 		GE_ArpMsgQId;
SEM_ID			GE_ArpSemId;
HASHVALUE 		hashValue[256];

#define  static_table_sums 	3

static ULONG	      	static_next_ip[static_table_sums] = { 	0xe0000002,
								0xe0000005,
		    				      	        0xe0000006  };			    									    
static unsigned char	static_mac[static_table_sums*6] = { 0x01,0x00,0x5e,0x00,0x00,0x02,
							    0x01,0x00,0x5e,0x00,0x00,0x05,
		    	     		     	            0x01,0x00,0x5e,0x00,0x00,0x06  };
		    	     		     	            
unsigned int 		GE_ARP_DEBUG = 0;

/*******************************************************************************************
*
* 	ARPinit: initlize the ARP 
*/
STATUS	GE_ArpInit(void)  
{
	unsigned int i,j;

      	if (SBSL_TaskFlagGet(GE_ARP_TASK_CODE)!= SBSL_TASK_UNREGISTER)
        {
                if(GE_ARP_DEBUG)
                       	GE_printf(GE_ALARM,"GE_ArpInit: GE_ArpInit task has REGISTER!\n");
          	return ERROR;
        }
	cam_init();	
	for (i = 0;i < 256;i++)
    	{
		(IP_MAC_BAND* )hashValue[i].ArpList[0].next=NULL;
		(IP_MAC_BAND* )hashValue[i].ArpList[1].next=NULL;     	
    	}
	for (j = 0; j < 2; j++)  
	{
	  	arpInfo[j].requestIn = 0;
		arpInfo[j].requestOut = 0;
		arpInfo[j].replyIn = 0;
		arpInfo[j].replyOut = 0;
		arpInfo[j].err = 0;
	     				
		GE_GetPortMac (arpInfo[j].selfPhyAddress,j);
		arpInfo[j].selfIpAddress=netIf[j].ipAddr;	     	
	}
	addrCount=0;	
	if ((GE_ArpMsgQId = msgQCreate(100,sizeof(TASK_MSG),MSG_Q_PRIORITY )) == NULL)
	{
		if(GE_ARP_DEBUG)
		        GE_printf(GE_ALARM,"GE_ArpInit:Creating GE_ArpMsg failed!\n");
		return ERROR;
	}
	if((GE_ArpSemId=semBCreate(SEM_Q_FIFO,SEM_FULL))==NULL)
	{
		if(GE_ARP_DEBUG)
		        GE_printf(GE_ALARM,"GE_ArpInit:creat semid failed!\n");
		return ERROR;
	}
	if( SBSL_TaskRegister(	GE_ARP_TASK_CODE, 
				GE_ArpMsgQId,
				GE_ArpReinit,
				GE_ArpDel)==ERROR )
	{
		if(GE_ARP_DEBUG)
		        GE_printf(GE_ALARM,"GE_ArpInit:tARP task register failed!\n");
		return ERROR;
	}
	GE_ARP_TIMER_ID = SBSL_TimerRequest (	GE_ARP_TASK_CODE, 
			 			GE_ArpMsgQId, 
						ARP_INTERVAL);
	if( GE_ARP_TIMER_ID == -1)
	{
		if(GE_ARP_DEBUG)
		        GE_printf(GE_ALARM,"GE_ArpInit:Timer request failed!\n");
		return ERROR;
	}
	if(taskSpawn (	TASK_NAME[GE_ARP_TASK_CODE],
			GE_ARP_TASK_PRI	,
			0,
			10000,
			(FUNCPTR)GE_Arp,
			0,0,0,0,0,0,0,0,0,0)==ERROR)
	{
		if(GE_ARP_DEBUG)
		        GE_printf(GE_ALARM,"GE_ArpInit:Creating GE_Arp task failed!\n");
		return ERROR;
	}       
	if(GE_ARP_DEBUG)
	        GE_printf(GE_EVENT,"GE_ArpInit:the arpTask init succeed!\n");
    	return OK;
}
/********************************************************************************************
* 	ARP_DEL: Delete the ARP task 
*/
STATUS  GE_ArpDel (void)
{
        if (SBSL_TaskFlagGet(GE_ARP_TASK_CODE)!=SBSL_TASK_STARTED)
        {
          	if(GE_ARP_DEBUG)
          	        GE_printf(GE_ALARM," GE_ArpDel:GE_ArpInit task has  not started!\n");
          	return ERROR;
        }
     
        if(taskDelete (SBSL_TaskIdGet(GE_ARP_TASK_CODE))==ERROR )
    	{
      		if(GE_ARP_DEBUG)
      		        GE_printf(GE_ALARM," GE_ArpDel:Delete arpTask failed!");
       	     	return ERROR; 
        }
        SBSL_TimerDelete(GE_ARP_TIMER_ID);       
	if (SBSL_TaskStop(GE_ARP_TASK_CODE) == ERROR)
	{
	    	if(GE_ARP_DEBUG)
	    	        GE_printf(GE_ALARM,"GE_ArpDel:ALARM!\n");
	    	return ERROR;
	}
  	if(GE_ARP_DEBUG)
  	        GE_printf(GE_EVENT,"GE_ArpDel:Delete task arpTask success!\n");	       
    	return OK;	     
}
/********************************************************************************************
* ARP_reinit: reinit the ARP task 
*/
STATUS  GE_ArpReinit (void)
{
	int	i;
     	if (SBSL_TaskFlagGet(GE_ARP_TASK_CODE)==SBSL_TASK_STARTED)
     	{
     	    	if(GE_ARP_DEBUG)
     	    	        GE_printf(GE_ALARM,"GE_ArpReinit: task has been started!\n");
          	return ERROR;
     	} 
     	GE_ARP_TIMER_ID = SBSL_TimerRequest (	GE_ARP_TASK_CODE,   
		 				SBSL_TaskMsgIdGet(GE_ARP_TASK_CODE),       
						ARP_INTERVAL);      
	if( GE_ARP_TIMER_ID == -1)                                  
	{                                                           
		
		if(GE_ARP_DEBUG)        
		        GE_printf(GE_ALARM,"GE_ArpReinit:Timer request failed!\n");       
		return ERROR;                                       
	}  
     	if (taskSpawn (	TASK_NAME[GE_ARP_TASK_CODE],
			GE_ARP_TASK_PRI	,
			0,
			10000,
			(FUNCPTR)GE_Arp,
			0,0,0,0,0,0,0,0,0,0)== ERROR)
     	{
		if(GE_ARP_DEBUG)
		        GE_printf(GE_ALARM,"GE_ArpReinit:Creating  task failed!\n");
		return ERROR;
     	}
                                                           
   	if(GE_ARP_DEBUG)
   	        GE_printf(GE_EVENT,"GE_ArpReinit:Recreating task success!\n");
   	return OK;
}            
             
/********************************************************************************************
* 	ARP_implement function 
*/           
STATUS  GE_Arp()
{      
	TASK_MSG  		arpMsg;
    	ULONG			ARP_DELAY_COUNT=0;
    	ULONG			ARP_TIME_COUNT=0; 

	while(BOARD_STATE != BOARD_STATE_NORMAL)
	{
		taskDelay(30);
	}

	SBSL_TaskStart(GE_ARP_TASK_CODE,taskIdSelf());
	SBSL_TimerStart (GE_ARP_TIMER_ID);

	if(GE_ARP_DEBUG)
	        GE_printf(GE_EVENT,"GE_Arp: Task is running...\n"); 	
	while(1)
	{
		if( ++ARP_DELAY_COUNT == 10)
		{
			taskDelay(1);
			ARP_DELAY_COUNT=0;
		}
        	if(SBSL_TaskMsgIdGet(GE_ARP_TASK_CODE)==NULL)
        	{
			if(GE_ARP_DEBUG)
				GE_printf(GE_ALARM,"GE_Arp:GE_ArpMsgQId==NULL!\n");
        		return ERROR;
        	} 		
		while(msgQNumMsgs(GE_ArpMsgQId)>0)
		{
			if (msgQReceive(GE_ArpMsgQId, 
       					(char *) &arpMsg, 
       					sizeof(TASK_MSG), 
       					NO_WAIT) == ERROR)
			{
				if(GE_ARP_DEBUG)
				        GE_printf(GE_ALARM,"GE_Arp: cannot receive any message !\n" );
				break;	    
			}
			switch (arpMsg.type)
			{
								
				case   MONITOR_MSG:
					if(GE_ARP_DEBUG)
					        GE_printf(GE_EVENT,"GE_Arp:receive MONITOR_MSG from tMonitor.\n");
                 			arpMsg.taskCode = GE_ARP_TASK_CODE;
	        			arpMsg.type = MONITOR_MSG_ACK;
					arpMsg.length = 0;
					memset(arpMsg.msgBuf, 0, 128);
		 
					if (msgQSend( 	SBSL_TaskMsgIdGet(MONITOR_TASK_CODE), 
							(char *) &arpMsg,
							140, 
							NO_WAIT,
							MSG_PRI_URGENT) == ERROR)
					{
						if(GE_ARP_DEBUG)
						        GE_printf(GE_ALARM,"GE_Arp:send MONITOR_MSG_ACK to tMonitor failed!");
						break;
					}	           
	       				else
	       				{
	       	   				if(GE_ARP_DEBUG)
	       	   				        GE_printf(GE_EVENT,"GE_Arp:send MONITOR_MSG_ACK to tMonitor succeed!\n");
					}   	
				break;
                	       	case  TIMER_OVERFLOW_MSG:
	       	
					if(arpMsg.msgBuf[0]!=GE_ARP_TIMER_ID)
					{
                    				if(GE_ARP_DEBUG)
                    				        GE_printf(GE_ALARM,"GE_Arp:TIMER_OVERFLOW_MSG is not belong to tArp!\n");
                    				break;
					}
					if(GE_ARP_DEBUG)
					        GE_printf(GE_EVENT,"GE_Arp:receive TIMER_OVERFLOW_MSG from tTimer.\n"); 
  
					if (SBSL_TimerMsgAck( GE_ARP_TIMER_ID) == ERROR)
					{
						if(GE_ARP_DEBUG)
						        GE_printf(GE_ALARM,"GE_Arp:send TIMER_OVEEFLOW_MSG_ACK to tTIMER failed!\n");
					}
					else 
					{
		   				if(GE_ARP_DEBUG)
		   				        GE_printf(GE_EVENT,"GE_Arp:send TIMER_OVEEFLOW_MSG_ACK to tTIMER succeed!\n");
					}		    
					
					SBSL_TimerStart (GE_ARP_TIMER_ID);
					if(GE_ArpTimer()==ERROR)		      	
					{
						if(GE_ARP_DEBUG)
						        GE_printf(GE_ALARM,"GE_Arp:GE_ArpTime deal failed!\n");
						break;
					}		        		   	     
				break;
                 		      	
				case  SYS_ARP_ENTRY_REQUEST:	
			
					if(GE_ARP_DEBUG)
					        GE_printf(GE_EVENT,"GE_Arp:tARP receive SYS_ARP_ENTRY_REQUEST from BDCOM.\n"); 
			
					if( GE_Arp_entry_index((char*)&arpMsg)==OK)
					{
						if(GE_ARP_DEBUG)
						        GE_printf(GE_EVENT,"GE_Arp:GE_Arp_entry_index succeed!\n");
						break;
    					}
					else
					{
						if(GE_ARP_DEBUG)
						        GE_printf(GE_ALARM,"GE_Arp:GE_Arp_entry_index failed!\n");
						break;
    					}
				break;
	       			default:
	       				if(GE_ARP_DEBUG)
	       				        GE_printf(GE_ALARM,"GE_Arp:receice type:%d:,Invalid!\n",arpMsg.type);
				break;
			}
		}

		GE_ReadOutfpgaReqfifo();
	}	
	return OK;
}
/***************************************************************************************
*  cpu read data from request fifo in OUTFPGA.the bit flag 26 is readable or unreadable .
*
*  flag 26 0: no data,unreadable.
*  flag 26 1: have data in it,readable.
*
*/
STATUS  GE_ReadOutfpgaReqfifo()
{	
	ULONG	   		OutBuf[10];
	ULONG	   		nextIp; 
	ULONG   	   	flag;
	ULONG   		bufLen;
	unsigned int   		i,j;
	unsigned char  		unit;
       	char	   		errorTimes=0;  
	IP_MAC_BAND*  		pEntry;     
	
	for(i=0;i<10;i++)
	{
   		taskLock();
        	flag =*(ULONG*)0x13020014;	/*flag 26*/
        	taskUnlock();	
        		    	
    		if((flag&0x0000020)==0x00000020)
    			break;
   	
	}
	if(i==10)
		return ERROR;

	for(j=0;j<10;j++)
	{
		OutBuf[j]=outfpgaRead(0x2E);
		if (OutBuf[j]==0xE25C4B89)
			break;  
	}
	if(OutBuf[j]==0xE25C4B89)         	   
	{
    		OutBuf[0]=0xE25C4B89;
    		for(i=1;i<10;i++)
    		{	 
	  		OutBuf[i] = outfpgaRead(0x2E);
			if (OutBuf[i]==0x1DA3B476)
			{	
				break;
			}
		}	 	        
		if(i>9)
		{
	 		if(GE_ARP_DEBUG)
	 		        GE_printf(GE_ALARM,"GE_ReadOutfpgaReqfifo:Received packet is too long!\n");
			return ERROR;
		}	
	} 			
	else 
	{
		if(GE_ARP_DEBUG)
		        GE_printf(GE_ALARM,"GE_ReadOutfpgaReqfifo:NOT received pkt head!\n");
		return ERROR;
	}    
	bufLen=(4*i-8);
	nextIp=OutBuf[2];
	unit=(unsigned char) ((OutBuf[1]&0x0F000000)>>24);
	  	
	pEntry=(IP_MAC_BAND*)GE_Arp_entry_lookup(unit, nextIp);
	if(pEntry==NULL)
	{
		if(GE_Arp_request_packet_generation (unit,nextIp)==ERROR)
  		{
	    		if(GE_ARP_DEBUG)
	    		        GE_printf(GE_ALARM,"GE_ReadOutfpgaReqfifo:Generation a arp packet failed!\n");
	    		return ERROR;
	    	}
	}	  
	else
	{ 
              	if(semTake(GE_ArpSemId,WAIT_FOREVER)==ERROR)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -