www.pudn.com > ARM_RTL8019.rar > Ethernet.c


#define ETHERNET_GLOBALS 
#include "config.h" 
#include "cfg_net.h" 
uint8 IP_DA[]="Ip data received\n"; 
uint8 ARP_DA[]="Arp data received\n";  
 
uint8 My_Ip_1ID[4]=MY_IP_1ID; 
uint8 My_Gateway_1ID[4]=MY_GATEWAY_1ID; 
uint8 MY_IP_MARK_1ID[4]=IP_MARK_1ID; 
uint8 MY_MAC_1ID[6]=MY_Mac_1ID;//MACµØÖ· 
#if (MAX_NET_PORT>=2) 
uint8 My_Ip_2ID[4]=MY_IP_2ID; 
uint8 My_Gateway_2ID[4]=MY_GATEWAY_2ID; 
uint8 MY_IP_MARK_2ID[4]=IP_MARK_2ID; 
uint8 MY_MAC_2ID[6]=MY_Mac_2ID;//MACµØÖ· 
#endif 
 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ£º    	unsigned char Send_ethernet_Frame(struct _pkst *TxdData,unsigned char * de_mac,unsigned char PROTOCOL) 
**Èë¿Ú²ÎÊý:º		*TxdData 	: ·¢ËͽṹָÕë 
**		* de_mac     	: MACµØÖ·Ö¸Õë 
**		NextProtocal 	: ÏÂÒ»²ãЭÒ飬ÀýÈçIPЭÒé»òARPЭÒé(È磺IP_PACKED¡¢ARP_PACKED) 
**³ö¿Ú²ÎÊý:	unsigned char  
**·µ »Ø Öµ£º	1 
**˵    Ã÷£º	ΪIP¡¢ARPÊý¾Ý°ü²úÉúETHERNET°üÍ·£¬²¢·¢ËÍ¡£ 
************************************************************************/ 
uint8 Send_ethernet_Frame	( 
					 struct _pkst *TxdData,//½á¹¹Ö¸Õë 
					 uint8 * de_mac,			//¶Ô·½µÄMACµØÖ·Ö¸Õë 
					 uint8 PROTOCOL,			//01ΪIPЭÒ飬òARPЭÒé 
					 uint8	num 
				 )   
{ //Èç¹ûûÓÐMACµØÖ·£¬¾Í·¢ËÍÒ»¸öARP°ü¡£µÃµ½MACµØÖ·ÔÙ·¢¡£ 
ipethernet ethernet_head; //ETHERNET´¦Àí»º´æÇø 
struct _pkst PKethernet; 
	 
	ethernet_head.DestMacId[0]=*de_mac;	//ÉèÖöԷ½MAC 
	de_mac++; 
	ethernet_head.DestMacId[1]=*de_mac; 
	de_mac++; 
	ethernet_head.DestMacId[2]=*de_mac; 
	de_mac++; 
	ethernet_head.DestMacId[3]=*de_mac; 
	de_mac++; 
	ethernet_head.DestMacId[4]=*de_mac; 
	de_mac++; 
	ethernet_head.DestMacId[5]=*de_mac; 
	ethernet_head.SourceMacId[0]=NetPort[num].My_Mac[0];//ÉèÖñ¾»úMACµØÖ· 
	ethernet_head.SourceMacId[1]=NetPort[num].My_Mac[1]; 
	ethernet_head.SourceMacId[2]=NetPort[num].My_Mac[2]; 
	ethernet_head.SourceMacId[3]=NetPort[num].My_Mac[3]; 
	ethernet_head.SourceMacId[4]=NetPort[num].My_Mac[4]; 
	ethernet_head.SourceMacId[5]=NetPort[num].My_Mac[5]; 
#ifdef Little_End 
	if(PROTOCOL==IP_PACKED)//Èç¹ûÊÇIP°ü£¬¾ÍÉèΪ0X0800 
		ethernet_head.NextProtocal=0x0008; 
	else if(PROTOCOL==ARP_PACKED)//Èç¹ûÊÇARP°ü£¬¾ÍÉèΪ0X0806 
		ethernet_head.NextProtocal=0x0608;//0X0806; 
#endif 
#ifdef Big_End 
	if(PROTOCOL==IP_PACKED)//Èç¹ûÊÇIP°ü£¬¾ÍÉèΪ0X0800 
		ethernet_head.NextProtocal=0X0800; 
	else if(PROTOCOL==ARP_PACKED)//Èç¹ûÊÇARP°ü£¬¾ÍÉèΪ0X0806 
		ethernet_head.NextProtocal=0X0806;//0X0806; 
#endif 
	PKethernet.STPTR=TxdData;//Ö¸Ïòǰһ¸ö½á¹¹Êý×é 
	PKethernet.length=14;			//ETHERNET±¨Í·µÄ³¤¶È 
	PKethernet.DAPTR=(uint8 EX_RAM *)ðernet_head;//ETHERNET±¨Í·µÄÖ¸Õë 
	 
	switch(num) 
	{ 
	case 0:  
		Send_Packet(&PKethernet);//·¢Ë͸ÃÖ¡ 
		break; 
	case 1:  
		break; 
	case 2:  
		break; 
	default: 
		break; 
	} 
	 
	return(1); 
} 
 
 
uint8 Rec_Ethernet_Packed(uint8 * RecData,uint8 num) 
{ 
uint8 i; 
	 
#ifdef Big_End 
	if(((ipethernet*)RecData)->NextProtocal==0x0800)//¿ÉÒÔ¼õÉÙ¶ÔÊý¾Ý»º³åÈ¡µÄÀûÓà 
#endif 
#ifdef Little_End 
	if(((ipethernet*)RecData)->NextProtocal==0x0008)//¿ÉÒÔ¼õÉÙ¶ÔÊý¾Ý»º³åÈ¡µÄÀûÓà 
#endif 
	{   //  UartSendStr(IP_DA); 
		RecData=RecData+14;//Ö¸ÏòIP°üÍ· 
		//¼ì²éÊÇ·ñÊôÓÚ±¾IP¶Î£¬·ñÔò²»±£´æµ½ARP±í	 
		if((((eip*)RecData)->SourceIp[0]&NetPort[num].My_Ip_Mark[0])==(NetPort[num].My_Ip[0]&NetPort[num].My_Ip_Mark[0])) 
		if((((eip*)RecData)->SourceIp[1]&NetPort[num].My_Ip_Mark[1])==(NetPort[num].My_Ip[1]&NetPort[num].My_Ip_Mark[1])) 
		if((((eip*)RecData)->SourceIp[2]&NetPort[num].My_Ip_Mark[2])==(NetPort[num].My_Ip[2]&NetPort[num].My_Ip_Mark[2])) 
		if((((eip*)RecData)->SourceIp[3]&NetPort[num].My_Ip_Mark[3])==(NetPort[num].My_Ip[3]&NetPort[num].My_Ip_Mark[3])) 
		{ 
			for(i=0;iSourceIp[2]) 
				if(NetPort[num].ARP_TERM[i].IP_NUM[3]==((eip*)RecData)->SourceIp[3]) 
				if(NetPort[num].ARP_TERM[i].TTL>0)//Èç¹ûÒѾ­±£´æÓжÔÓ¦µÄMACµØÖ·¶øÇÒTTLÓÐЧ 
				{//Ë¢ÐÂTTL,´¦ÀíIP°ü 
					NetPort[num].ARP_TERM[i].TTL=100; 
					IP_PROCESS(RecData,num); 
					return(2); 
				} 
			} 
			//ARP±íûÓжÔÓ¦µÄMACµØÖ· 
			for(i=0;iSourceIp[0]; 
					NetPort[num].ARP_TERM[i].IP_NUM[1]=((eip*)RecData)->SourceIp[1]; 
					NetPort[num].ARP_TERM[i].IP_NUM[2]=((eip*)RecData)->SourceIp[2]; 
					NetPort[num].ARP_TERM[i].IP_NUM[3]=((eip*)RecData)->SourceIp[3]; 
					RecData=RecData-14; 
					NetPort[num].ARP_TERM[i].MAC_NUM[0]=((ipethernet*)RecData)->SourceMacId[0]; 
					NetPort[num].ARP_TERM[i].MAC_NUM[1]=((ipethernet*)RecData)->SourceMacId[1]; 
					NetPort[num].ARP_TERM[i].MAC_NUM[2]=((ipethernet*)RecData)->SourceMacId[2]; 
					NetPort[num].ARP_TERM[i].MAC_NUM[3]=((ipethernet*)RecData)->SourceMacId[3]; 
					NetPort[num].ARP_TERM[i].MAC_NUM[4]=((ipethernet*)RecData)->SourceMacId[4]; 
					NetPort[num].ARP_TERM[i].MAC_NUM[5]=((ipethernet*)RecData)->SourceMacId[5]; 
					NetPort[num].ARP_TERM[i].TTL=100; 
					RecData=RecData+14;//±£´æÆäIPºÍ¶ÔÓ¦µÄMACµØÖ· 
					IP_PROCESS(RecData,num); 
					return(2); 
				} 
			} 
			//MAC±íÒç³ö£¡£¡ 
			IP_PROCESS(RecData,num); 
			return(4); 
		}//if((((eip*)TEMP)-> 
		//·Ç±¾µØIP 
		IP_PROCESS(RecData,num); 
		return(3); 
	}//if(((ipethernet*) 
#ifdef Big_End 
	else if(((ipethernet*)RecData)->NextProtocal==0x0806)//¿ÉÒÔ¼õÉÙ¶ÔÊý¾Ý»º³åÈ¡µÄÀûÓà 
#endif 
#ifdef Little_End 
	else if(((ipethernet*)RecData)->NextProtocal==0x0608)//¿ÉÒÔ¼õÉÙ¶ÔÊý¾Ý»º³åÈ¡µÄÀûÓà 
#endif 
	{  // UartSendStr(ARP_DA); 
		RecData=RecData+14; 
		PROCESS_ARP_REC(RecData,num); 
		return(1); 
	} 
	return(3); 
} 
/* 
void SetNetPort(uint8 num) 
{ 
		NetPort[0].My_Ip=MY_IP_1ID; 
		NetPort[0].My_Gateway=MY_GATEWAY_1ID; 
		NetPort[0].My_Ip_Mark=IP_MARK_1ID; 
		NetPort[0].My_Mac=MY_Mac_1ID; 
#if MAX_NET_PORT>=2 
		NetPort[1].My_Ip=MY_IP_2ID; 
		NetPort[1].My_Gateway=MY_GATEWAY_2ID; 
		NetPort[1].My_Ip_Mark=IP_MARK_2ID; 
		NetPort[1].My_Mac=MY_Mac_2ID; 
#endif 
	 
}*/ 
void SetNetPort(void) 
{ 
	uint8 i; 
	for(i=0;i<4;i++) 
	{ 
		NetPort[0].My_Ip[i]=My_Ip_1ID[i]; 
		NetPort[0].My_Gateway[i]=My_Gateway_1ID[i]; 
		NetPort[0].My_Ip_Mark[i]=MY_IP_MARK_1ID[i]; 
#if MAX_NET_PORT>=2 
		NetPort[1].My_Ip[i]=My_Ip_2ID[i]; 
		NetPort[1].My_Gateway[i]=My_Gateway_2ID[i]; 
		NetPort[1].My_Ip_Mark[i]=MY_IP_MARK_2ID[i]; 
#endif 
	} 
	for(i=0;i<6;i++) 
	{ 
		NetPort[0].My_Mac[i]=MY_MAC_1ID[i]; 
#if MAX_NET_PORT>=2 
		NetPort[1].My_Mac[i]=MY_MAC_2ID[i]; 
#endif 
   //Arp_Request(NetPort[num].My_Gateway,num);//ÉèÖñ¾µØÍø¹ØµØÖ· 
	} 
}