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);//ÉèÖñ¾µØÍø¹ØµØÖ·
}
}