#define ARP_GLOBALS #include "config.h" #include "../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]; //=========================================================== /********************************************************************** **º¯ÊýÔ­ÐÍ£º 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 ARP //²»ÊôÓÚÍ¬Ò»Íø¶ÎµÄ return (3); } //Ä¿±ê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