www.pudn.com > ARM_RTL8019.rar > ARP.C


#define ARP_GLOBALS 
#include "config.h" 
#include "cfg_net.h" 
typedef struct    { /* arp±¨ÎĵÄÄÚÈÝ×ܳ¤28×Ö½Ú*/ 
                                        
                 uint16 	HardwareType;  	    /*ÒÔÌ«ÍøÎª0x0001*/ 
                 uint16 	ProtocalType;   	/*ip Ϊ0X0800*/ 
                 uint8 	HardwareLen;        /*=0X06*/ 
                 uint8 	ProtocalLen;        /*=0X04*/ 
                 uint16 	Operation;         	/*²Ù×÷  0X0001ΪÇëÇó   0X0002ΪӦ´ð  */ 
                                           	/*0X0003Ϊ·´ÏòµØÖ·ÇëÇó 0X0004Ϊ·´ÏòµØÖ·Ó¦´ð*/ 
                 uint8 	SourceMacId[6];   	/*Ô´Íø¿¨µØÖ·*/ 
                 uint8 	SourceIp[4];       	/*Ô´IPµØÖ·*/ 
                 uint8 	DestMacId[6];     	/*Ä¿µÄÍø¿¨µØÖ·*/ 
                 uint8 	DestId[4];         	/*Ä¿µÄIPµØÖ·*/ 
                } arp ; 
uint8 ARP_REP_MAC[6]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF}; 
uint8 Ping_Ip_Address[4]; 
uint8 Ping_IP_TTL; 
 
//uint8 My_Ip_Address[4]=MY_IP; 
//uint8 My_Gateway_Ip_Address[4]=MY_GATEWAY; 
//uint8 MY_IP_MARK[4]=IP_MARK_SETTING; 
struct a_t ARP_TERM[MAX_ARP_TERM]; 
/*¸ø±¾¶Ë¿Ú¸½Öµ 
 
void Arp_add_enty(uint8 num) 
{NetPort[num].My_Ip=MY_IP_1ID  ; 
NetPort[num].My_Gateway=MY_GATEWAY_1ID ; 
NetPort[num].My_Ip_Mark=IP_MARK_1ID ; 
NetPort[num].My_Mac=My_Mac_1ID ; 
NetPort[num].Gateway_IP_TTL=100; 
} 
*/ 
 
//=========================================================== 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ£º    unsigned char Arp_Answer(unsigned char EX_RAM * ARP_REC_PTR) 
**Èë¿Ú²ÎÊý:		* ARP_REC_PTR	:½ÓÊÕµ½µÄARPÇëÇó°üµÄÖ¸Õë 
**³ö¿Ú²ÎÊý:		unsigned char 
**·µ »Ø Öµ£º	0		:±¾×ÓÍøÄÚµÄARP»º³åÇøÒѾ­ÓÐMAC 
**				1		:Ä¿±êIP²»ÊDZ¾»ú²»×÷»ØÓ¦ 
**				2		:±¾×ÓÍøÄڵ쬵«ARP»º³åÇø»¹Ã»ÓÐMAC 
**				3		:²»ÊDZ¾×ÓÍøµÄARPÇëÇó 
**				4		:ARP»º³åÇøÒѾ­Âú 
**˵    Ã÷£º	¶ÔARPÇëÇó±¨ÎĵÄÓ¦´ð:Ìî³ä±¾µØÎïÀíµØÖ·,½«ARP²Ù×÷¸ÄΪ»Ø´ð. 
************************************************************************/ 
uint8 Arp_Answer(uint8 * ARP_REC_PTR,uint8 num)  
{ 
struct _pkst TxdArp; 
uint8 SEND_ARP_MAC[6]; 
uint8 i; 
//Èç¹ûÄ¿±êIPµØÖ·ÊDZ¾»úIP 
if (((arp*)ARP_REC_PTR)->DestId[0]==NetPort[num].My_Ip[0]) 
if (((arp*)ARP_REC_PTR)->DestId[1]==NetPort[num].My_Ip[1]) 
if (((arp*)ARP_REC_PTR)->DestId[2]==NetPort[num].My_Ip[2]) 
if (((arp*)ARP_REC_PTR)->DestId[3]==NetPort[num].My_Ip[3]) 
	{										//±íʾÊÇÒª½âÎö±¾µØIPµÄÇëÇó 
	for(i=0;i<4;i++)						//¸´ÖƶԷ½IPµØÖ·£¬Ìî³äÔ´µØÖ· 
		{ 
        SEND_ARP_MAC[i]=((arp*)ARP_REC_PTR)->SourceIp[i]; 
		((arp*)ARP_REC_PTR)->SourceIp[i]=NetPort[num].My_Ip[i]; 
		((arp*)ARP_REC_PTR)->DestId[i]=SEND_ARP_MAC[i]; 
		} 
	for(i=0;i<6;i++) 
   		{									//¸´ÖƶԷ½ÎïÀíµØÖ·»òÍø¹ØµØÖ· 
        SEND_ARP_MAC[i]=((arp*)ARP_REC_PTR)->SourceMacId[i]; 
		((arp*)ARP_REC_PTR)->SourceMacId[i]=NetPort[num].My_Mac[i]; 
		((arp*)ARP_REC_PTR)->DestMacId[i]=SEND_ARP_MAC[i]; 
    	        } 
#ifdef Big_End 
	((arp*)ARP_REC_PTR)->Operation=0x0002;	//±íÃ÷Êý¾Ý֡ΪARPÓ¦´ð 
#endif 
#ifdef Little_End 
	((arp*)ARP_REC_PTR)->Operation=0x0200;	//±íÃ÷Êý¾Ý֡ΪARPÓ¦´ð 
#endif 
	TxdArp.STPTR=NULL; 
	TxdArp.length=0x60; 
	TxdArp.DAPTR=ARP_REC_PTR; 
	Send_ethernet_Frame(&TxdArp,SEND_ARP_MAC,ARP_PACKED,num);//·¢ËÍARPÓ¦´ðÖ¡ 
 
	//Èç¹û·¢ËÍ·½ÊôÓÚ±¾Íø¶Î 
		if((((arp*)ARP_REC_PTR)->SourceIp[0]&NetPort[num].My_Ip_Mark[0])==(NetPort[num].My_Ip[0]&NetPort[num].My_Ip_Mark[0])) 
		if((((arp*)ARP_REC_PTR)->SourceIp[1]&NetPort[num].My_Ip_Mark[1])==(NetPort[num].My_Ip[1]&NetPort[num].My_Ip_Mark[1])) 
		if((((arp*)ARP_REC_PTR)->SourceIp[2]&NetPort[num].My_Ip_Mark[2])==(NetPort[num].My_Ip[2]&NetPort[num].My_Ip_Mark[2])) 
		if((((arp*)ARP_REC_PTR)->SourceIp[3]&NetPort[num].My_Ip_Mark[3])==(NetPort[num].My_Ip[3]&NetPort[num].My_Ip_Mark[3])) 
		{ 
			//²éÕÒÓзñÊôÓÚ¸ÃIPµÄ¶ÔÓ¦MAC±í 
			for(i=0;iSourceIp[2]) 
				if(NetPort[num].ARP_TERM[i].IP_NUM[3]==((arp*)ARP_REC_PTR)->SourceIp[3]) 
				if(NetPort[num].ARP_TERM[i].TTL>0) 
				{//ÓÐÔòˢР
					NetPort[num].ARP_TERM[i].TTL=100; 
					return(0); 
				} 
			} 
			//²éÕÒÓзñ¿ÕµÄMAC±íÏî 
			for(i=0;iSourceIp[0]; 
					NetPort[num].ARP_TERM[i].IP_NUM[1]=((arp*)ARP_REC_PTR)->SourceIp[1]; 
					NetPort[num].ARP_TERM[i].IP_NUM[2]=((arp*)ARP_REC_PTR)->SourceIp[2]; 
					NetPort[num].ARP_TERM[i].IP_NUM[3]=((arp*)ARP_REC_PTR)->SourceIp[3]; 
					NetPort[num].ARP_TERM[i].MAC_NUM[0]=((arp*)ARP_REC_PTR)->SourceMacId[0]; 
					NetPort[num].ARP_TERM[i].MAC_NUM[1]=((arp*)ARP_REC_PTR)->SourceMacId[1]; 
					NetPort[num].ARP_TERM[i].MAC_NUM[2]=((arp*)ARP_REC_PTR)->SourceMacId[2]; 
					NetPort[num].ARP_TERM[i].MAC_NUM[3]=((arp*)ARP_REC_PTR)->SourceMacId[3]; 
					NetPort[num].ARP_TERM[i].MAC_NUM[4]=((arp*)ARP_REC_PTR)->SourceMacId[4]; 
					NetPort[num].ARP_TERM[i].MAC_NUM[5]=((arp*)ARP_REC_PTR)->SourceMacId[5]; 
					NetPort[num].ARP_TERM[i].TTL=100; 
					return(2); 
				} 
			}//FOR 
			//MAC±íÒѾ­Âú 
			return(4); 
		}//IF ÊôÓÚ±¾Íø¶Î 
		//²»ÊôÓÚÍ¬Ò»Íø¶ÎµÄ 
		return (3); 
   	}//IFÊôÓÚ±¾»ú 
   	 
	//Ä¿±êIP²»ÊDZ¾»ú 
	return (1); 
	 
} 
 
uint8 REC_ARP_REQ(uint8 * ARP_REC_REQ_PTR,uint8 num)   
{ 
uint8 i; 
//====================================================================== 
if(((arp*)ARP_REC_REQ_PTR)->SourceIp[0]==NetPort[num].My_Gateway[0]) 
if(((arp*)ARP_REC_REQ_PTR)->SourceIp[1]==NetPort[num].My_Gateway[1]) 
if(((arp*)ARP_REC_REQ_PTR)->SourceIp[2]==NetPort[num].My_Gateway[2]) 
if(((arp*)ARP_REC_REQ_PTR)->SourceIp[3]==NetPort[num].My_Gateway[3]) 
	{  				//±íʾÊÇÍø¹Ø¶ÔARPÇëÇóµÄ»Ø´ð. 
   	for (i=0;i<6;i++) 
		{ 
		NetPort[num].My_Gateway_Mac[i]=((arp*)ARP_REC_REQ_PTR)->SourceMacId[i]; 
		} 
   	NetPort[num].Gateway_IP_TTL=100;	//±íÊ¾Íø¹ØµØÖ·Òѵõ½½âÎö 
	//return(3); 
	} 
	//Èç¹û·¢ËÍ·½ÊôÓÚ±¾Íø¶Î 
if((((arp*)ARP_REC_REQ_PTR)->SourceIp[0]&NetPort[num].My_Ip_Mark[0])==(NetPort[num].My_Ip[0]&NetPort[num].My_Ip_Mark[0])) 
if((((arp*)ARP_REC_REQ_PTR)->SourceIp[1]&NetPort[num].My_Ip_Mark[1])==(NetPort[num].My_Ip[1]&NetPort[num].My_Ip_Mark[1])) 
if((((arp*)ARP_REC_REQ_PTR)->SourceIp[2]&NetPort[num].My_Ip_Mark[2])==(NetPort[num].My_Ip[2]&NetPort[num].My_Ip_Mark[2])) 
if((((arp*)ARP_REC_REQ_PTR)->SourceIp[3]&NetPort[num].My_Ip_Mark[3])==(NetPort[num].My_Ip[3]&NetPort[num].My_Ip_Mark[3])) 
{//²éÕÒÓзñÊôÓÚ¸ÃIPµÄ¶ÔÓ¦MAC±í 
	for(i=0;iSourceIp[2]) 
		if(NetPort[num].ARP_TERM[i].IP_NUM[3]==((arp*)ARP_REC_REQ_PTR)->SourceIp[3]) 
		if(NetPort[num].ARP_TERM[i].TTL>0) 
		{//ÓÐÔòˢР
			NetPort[num].ARP_TERM[i].TTL=100; 
			return(0); 
		} 
	} 
	//²éÕÒÓзñ¿ÕµÄMAC±íÏî 
	for(i=0;iSourceIp[0]; 
			NetPort[num].ARP_TERM[i].IP_NUM[1]=((arp*)ARP_REC_REQ_PTR)->SourceIp[1]; 
			NetPort[num].ARP_TERM[i].IP_NUM[2]=((arp*)ARP_REC_REQ_PTR)->SourceIp[2]; 
			NetPort[num].ARP_TERM[i].IP_NUM[3]=((arp*)ARP_REC_REQ_PTR)->SourceIp[3]; 
			NetPort[num].ARP_TERM[i].MAC_NUM[0]=((arp*)ARP_REC_REQ_PTR)->SourceMacId[0]; 
			NetPort[num].ARP_TERM[i].MAC_NUM[1]=((arp*)ARP_REC_REQ_PTR)->SourceMacId[1]; 
			NetPort[num].ARP_TERM[i].MAC_NUM[2]=((arp*)ARP_REC_REQ_PTR)->SourceMacId[2]; 
			NetPort[num].ARP_TERM[i].MAC_NUM[3]=((arp*)ARP_REC_REQ_PTR)->SourceMacId[3]; 
			NetPort[num].ARP_TERM[i].MAC_NUM[4]=((arp*)ARP_REC_REQ_PTR)->SourceMacId[4]; 
			NetPort[num].ARP_TERM[i].MAC_NUM[5]=((arp*)ARP_REC_REQ_PTR)->SourceMacId[5]; 
			NetPort[num].ARP_TERM[i].TTL=100; 
			return(2); 
		} 
	} 
	//MAC±íÒѾ­Âú 
	return(4); 
} 
//¶Ô·½IP¼´²»ÊDZ¾Íø¶ÎÒ²²»ÊÇGATEWAY 
return(1); 
} 
 
 
//=========================================================================== 
//======================================================================= 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ£º    void PROCESS_ARP_REC(unsigned char EX_RAM * ARP_PTR) 
**Èë¿Ú²ÎÊý:		* ARP_PTR	:½ÓÊÕµ½µÄARP°üµÄÖ¸Õë 
**³ö¿Ú²ÎÊý:		ÎÞ 
**·µ »Ø Öµ£º	ÎÞ 
**˵    Ã÷£º	¶ÔARP°ü½øÐзÖÀà´¦Àí 
************************************************************************/ 
void PROCESS_ARP_REC(uint8 * ARP_PTR,uint8 num)   
{ 
//	EX_RAM PKST ARP_PACKED; 
#ifdef Big_End 
if(((arp*)ARP_PTR)->Operation==0x0001) 
#endif 
#ifdef Little_End 
if(((arp*)ARP_PTR)->Operation==0x0100) 
#endif 
	{ 
		Arp_Answer(ARP_PTR,num); 
	} 
 
#ifdef Big_End 
else if(((arp*)ARP_PTR)->Operation==0x0002) 
#endif 
#ifdef Little_End 
else if(((arp*)ARP_PTR)->Operation==0x0200) 
#endif 
	{ 
		REC_ARP_REQ(ARP_PTR,num); 
	} 
	//¿ÉÌí¼ÓREARP²Ù×÷¡£ 
	 
 
} 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ:º    void        Arp_Request(unsigned char * ip_address) 
**Èë¿Ú²ÎÊý:º	ip_address: Òª½âÎöµÄIPµØÖ· 
**³ö¿Ú²ÎÊý:		ÎÞ 
**·µ »Ø Öµ:º	ÎÞ 
**˵    Ã÷:º	ÇëÇó¶ÔÖ¸¶¨µÄIPµØÖ·½øÐнâÎö,»ñÈ¡ÆäÎïÀíµØÖ· 
************************************************************************/ 
void Arp_Request(uint8 * ip_address,uint8 num) 
{ 
struct _pkst TxdArpReq; 
uint8 ARPREQ[46]; 
uint8 i; 
for(i=0;i<6;i++)			  					//¸´ÖƶԷ½Íø¿¨µØÖ·»òÍø¹ØµØÖ· 
	{											 
	((arp*)ARPREQ)->SourceMacId[i]=NetPort[num].My_Mac[i]; 
	((arp*)ARPREQ)->DestMacId[i]=0x00;	//arp±¨ÎĵÄÄ¿µÄÎïÀíµØÖ·ÌîΪ0,ÓÉarp»Ø´ð±¨ÎÄ										//¸ºÔðÌî³ä 
    } 
for(i=0;i<4;i++)								 
	{ 
	((arp*)ARPREQ)->SourceIp[i]=NetPort[num].My_Ip[i];//Ìî³äÔ´IPµØÖ· 
	((arp*)ARPREQ)->DestId[i]=*ip_address;//Ìî³äÄ¿µÄIPµØÖ· 
	ip_address++; 
	} 
#ifdef Big_End	 
((arp*)ARPREQ)->HardwareType=0x0001;		//Ó²¼þÀàÐÍ£º0x0001,ÒÔÌ«ÍøÀàÐÍ 
((arp*)ARPREQ)->ProtocalType=0x0800;		//ЭÒéÀàÐÍ£º0x0800,¶ÔÓ¦IPv4 
((arp*)ARPREQ)->Operation=0x0001;			//²Ù×÷ÀàÐÍ£ºARPÇëÇó 
#endif 
 
#ifdef Little_End 
((arp*)ARPREQ)->HardwareType=0x0100;		//Ó²¼þÀàÐÍ£º0x0001,ÒÔÌ«ÍøÀàÐÍ 
((arp*)ARPREQ)->ProtocalType=0x0008;		//ЭÒéÀàÐÍ£º0x0800,¶ÔÓ¦IPv4 
((arp*)ARPREQ)->Operation=0x0100;			//²Ù×÷ÀàÐÍ£ºARPÇëÇó 
#endif	 
((arp*)ARPREQ)->HardwareLen=0x06;			//Ó²¼þ³¤¶È£º¼´ÎïÀíµØÖ·³¤¶È£¬µ¥Î»×Ö½Ú 
((arp*)ARPREQ)->ProtocalLen=0x04;			//ЭÒ鳤¶È£º¼´Âß¼­µØÖ·³¤¶È£¬µ¥Î»×Ö½Ú 
 
/******************************************************* 
 *×¢Òâ:	 
 *arp±¨ÎĶεij¤¶ÈΪ28×Ö½Ú,¶øÒÔÌ«ÍøÊý¾Ý°üµÄ×îСµ¥ÔªÎª60×Ö½Ú,ËùÒÔÔÚ·¢ËÍarp±¨ÎÄʱÐèÒª¶Ô 
 *ÒÔÌ«Íø±¨ÎĶνøÐÐÌî³ä,ÒÔÂú×ã×îС³¤¶ÈÒªÇó. 
 *arp·Ö×éµÄ·â×°¸ñʽ: 
 *·¢Ëͱ¨ÎÄ:               |     ÒÔÌ«ÍøÊײ¿(¹²14×Ö½Ú)    |    arpÇëÇó·Ö×é(28×Ö½Ú)  | Ìî³äÊý¾Ý |        
 *½ÓÊÕ±¨ÎÄ: | RTL8019Êײ¿ |     ÒÔÌ«ÍøÊײ¿(¹²14×Ö½Ú)    |    arp»Ø´ð·Ö×é(28×Ö½Ú)  | Ìî³äÊý¾Ý | 
 *          |--> 4×Ö½Ú <--|------->   14×Ö½Ú    <-------|-------> 28×Ö½Ú <--------|->18×Ö½Ú<-|                    
 *          |--------------------------->0x00¡«0x<2e<-----------------------------|                                  
 *ʵ¼ÊÉÏ4×Ö½ÚµÄ8019Êײ¿ÔÚ·¢ËÍʱÊDz»Æð×÷ÓõÄ,ÕæÕý·¢Ë͵ÄÊý¾Ý´ÓÒÔÌ«ÍøÊײ¿Æð.ËùÒÔÔÚÌî³äÊý¾Ýʱ,ÊÇ´Ó0x2e¿ªÊ¼µÄ. 
 *ÒòΪ³ÌÐòÖн«·¢ËÍÊý¾Ý±¨Êý¾Ý½á¹¹Óë½ÓÊÕÊý¾Ý±¨Êý¾Ý½á¹¹¶¨ÒåÓÚ¹«ÓÃÌåÖÐ,·½±ã²Ù×÷.¹ØÓÚÊý¾Ý½á¹¹¶¨Òå 
 *¿ÉÒԲο´arp.h,ÒÔ¼°ÏàÓ¦µÄÎĵµËµÃ÷. 
 ******************************************************/ 
//for(i=28;i<29;i++)				//²»ÐèÒª46		//µ±Êý¾Ý³¤¶È<60×Ö½Úʱ£¬ÐèÒª²¹×ã60×Ö½ÚÊý¾Ý 
//	{ 
	ARPREQ[28]=0x00;			//Ìî³äÊý¾ÝΪ0x00 
//	} 
//Æô¶¯·¢ËÍÊý¾Ý,·¢Ë͵ÄÊÇÒ»¸öarpÇëÇó. 
TxdArpReq.STPTR=NULL; 
TxdArpReq.length=46; 
TxdArpReq.DAPTR=ARPREQ; 
Send_ethernet_Frame(&TxdArpReq,ARP_REP_MAC,ARP_PACKED,num); 
} 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ:º    void	Initial_arp() 
**Èë¿Ú²ÎÊý:º	ÎÞ 
**³ö¿Ú²ÎÊý:		ÎÞ 
**·µ »Ø Öµ:º	ÎÞ 
**˵    Ã÷:º	ARP³õʼ»¯º¯Êý 
************************************************************************/ 
void	Initial_arp()   
{ 
uint8 i,num; 
	Ping_IP_TTL=0; 
	for(num=0;num