#define ETHERNET_GLOBALS #include "config.h" #include "../include/cfg_net.h" 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, //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±¨Í·µÄÖ¸Õë OS_ENTER_CRITICAL();//±£»¤ switch(num) { case 0: Send_Packet(&PKethernet);//·¢Ë͸ÃÖ¡ break; case 1: break; case 2: break; default: break; } OS_EXIT_CRITICAL();//»Ö¸´ return(1); } /********************************************************************** **º¯ÊýÔ­ÐÍ£º uint8 Send_Ip_To_LLC(struct _pkst *TxdData,unsigned char * de_ip) **Èë¿Ú²ÎÊý:º *TxdData : ·¢ËͽṹָÕë ** * de_ip : IPµØÖ·Ö¸Õë **³ö¿Ú²ÎÊý: unsigned char **·µ »Ø Öµ£º 1 :OK 0 :FAIL **˵ Ã÷£º ΪIPÊý¾Ý°üµÄÄ¿±êIP²éÕÒMACµØÖ·£¬²¢·¢ËÍ¡£ ************************************************************************/ uint8 Send_Ip_To_LLC(struct _pkst *TxdData,uint8 * de_ip,uint8 num) { uint8 i; //Èç¹û¸Ã°üÔÚ if((de_ip[0]&NetPort[num].My_Ip_Mark[0])==(NetPort[num].My_Ip[0]&NetPort[num].My_Ip_Mark[0])) if((de_ip[1]&NetPort[num].My_Ip_Mark[1])==(NetPort[num].My_Ip[1]&NetPort[num].My_Ip_Mark[1])) if((de_ip[2]&NetPort[num].My_Ip_Mark[2])==(NetPort[num].My_Ip[2]&NetPort[num].My_Ip_Mark[2])) if((de_ip[3]&NetPort[num].My_Ip_Mark[3])==(NetPort[num].My_Ip[3]&NetPort[num].My_Ip_Mark[3])) { i=0;//²éÕÒÒ»´ÎMAC±í¡£ do { OS_ENTER_CRITICAL();//±£»¤ if(NetPort[num].ARP_TERM[i].IP_NUM[2]==((IP_NUMBER*)de_ip)->IP[2]) if(NetPort[num].ARP_TERM[i].IP_NUM[3]==((IP_NUMBER*)de_ip)->IP[3])//Èç¹ûARP±íµÄ×îºóÁ½¸öÊýÏàµÈ¶øÇÒTTL>0±íʾ£¬ÓжÔÓ¦µÄMAC if(NetPort[num].ARP_TERM[i].TTL>0) { NetPort[num].ARP_TERM[i].TTL=100;//·¢ËÍ Send_ethernet_Frame(TxdData,NetPort[num].ARP_TERM[i].MAC_NUM,IP_PACKED,num); OS_EXIT_CRITICAL();//±£»¤ return(1); } OS_EXIT_CRITICAL();//±£»¤ i++; } while(iNextProtocal==0x0800)//¿ÉÒÔ¼õÉÙ¶ÔÊý¾Ý»º³åÈ¡µÄÀûÓà #endif #ifdef Little_End if(((ipethernet*)RecData)->NextProtocal==0x0008)//¿ÉÒÔ¼õÉÙ¶ÔÊý¾Ý»º³åÈ¡µÄÀûÓà #endif { 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 { RecData=RecData+14; PROCESS_ARP_REC(RecData,num); return(1); } return(3); } 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 } }