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