www.pudn.com > ARM_RTL8019.rar > IP.C


#define IP_GLOBALS 
#include "Config.h" 
#include "cfg_net.h" 
/* 
OS_EVENT  		*RecIcmpQFlag; 
OS_EVENT  		*RecTcpQFlag; 
OS_EVENT  		*RecUdpQFlag; 
 
OS_EVENT  		*SendFlag; 	*/ 
 
Rec_Ptr	RECQ[MAX_REC_BUFF]; 
 
void *RecIcmpQ[Q_Max_Size]; 
void *RecUdpQ[Q_Max_Size]; 
void *RecTcpQ[Q_Max_Size]; 
 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ£º    void 	CreateIpHeadCrc() 
**Èë¿Ú²ÎÊý:*ip     ipÊý¾Ý°üÊײ¿Ö¸Õë 
**³ö¿Ú²ÎÊý:		ÎÞ 
**·µ »Ø Öµ£º	crc £º  16λµÄУÑéºÍ         
**˵    Ã÷£º	²úÉúIPÊײ¿µÄУÑéºÍ  
************************************************************************/ 
uint16  CreateIpHeadCrc(uint8 * Ip)  
{ 
union  w  CrcTemp; 
uint8  i; 
CrcTemp.dwords = 0; 
	for(i=0;i<10;i++)       //IPÊײ¿¹²20×Ö½Ú 
	{ 
		CrcTemp.dwords = CrcTemp.dwords + ((uint32)Ip[2*i]<<8)+(uint32)Ip[2*i+1]; 
	} 
	while(CrcTemp.words.high>0)  
	{ 
    		CrcTemp.dwords = (uint32)(CrcTemp.words.high + CrcTemp.words.low); 
    } 
	CrcTemp.words.low = 0xffff - CrcTemp.words.low;  //È¡·´ 
	return(CrcTemp.words.low); 
} 
 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ£º    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; 
	//Èç¹ûÄ¿±êµØÖ·ÔÚ±¾ip¶Î 
	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 
		{	 
			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); 
				return(1); 
			} 
			i++; 
		} 
		while(i=MAX_NET_PORT) 
		return (0xff); 
	IpHead.e_ip.VerandIphLen=0x45;			//IP°æ±¾ºÍÍ·³¤¶È 
	IpHeadUint8[0]=0x45; 
	 
	IpHead.e_ip.ServerType=0x00;                     //·þÎñÀàÐÍΪ0 
	IpHeadUint8[1]=0x00;//·þÎñÀàÐÍ 
	 
	IpHead.e_ip.TotalLen=(*TxdData).length+20;			//IPÊý¾Ý±¨×ܳ¤¶È 
	IpHeadUint8[2]=(IpHead.e_ip.TotalLen&0xff00)>>8;//IPÊý¾Ý±¨×ܳ¤¶È¸ß×Ö½Ú 
	IpHeadUint8[3]=IpHead.e_ip.TotalLen&0x00ff;//IPÊý¾Ý±¨×ܳ¤¶ÈµÍ×Ö½Ú 
	 
	IpHead.e_ip.FrameIndex=FrameIndex+1; 
	IpHeadUint8[4]=(FrameIndex&0xff00)>>8;//IPÊý¾Ý±¨±êʶ¸ß×Ö½Ú 
	IpHeadUint8[5]=FrameIndex&0x00ff;//IPÊý¾Ý±¨±êʶµÍ×Ö½Ú 
	FrameIndex++; 
	 
	IpHeadUint8[6]=0x40;//IPÊý¾Ý±¨±êÖ¾¼°·Ö¶ÎÆ«ÒÆÁ¿ 
	IpHeadUint8[7]=0x00;//IPÊý¾Ý±¨±êÖ¾¼°·Ö¶ÎÆ«ÒÆÁ¿ 
	 
	IpHead.e_ip.ttl=0x80;       //128;				//TTL 
	IpHeadUint8[8]=0x80;//ttl 
 
	IpHead.e_ip.NextProtocal=PROTOCOL;		//ϲãЭÒé 
    	IpHeadUint8[9]=PROTOCOL; 
	 
    	IpHead.e_ip.Crc=0; 
	IpHeadUint8[10]=0;//CRC h 
	IpHeadUint8[11]=0;//CRC l 
	 
	IpHead.e_ip.SourceIp[0]=NetPort[num].My_Ip[0];	//Ìî³äÔ´IPµØÖ· 
    	IpHead.e_ip.SourceIp[1]=NetPort[num].My_Ip[1]; 
	IpHead.e_ip.SourceIp[2]=NetPort[num].My_Ip[2]; 
	IpHead.e_ip.SourceIp[3]=NetPort[num].My_Ip[3]; 
	 
	IpHeadUint8[12]=NetPort[num].My_Ip[0];	//Ìî³äÔ´IPµØÖ· 
    	IpHeadUint8[13]=NetPort[num].My_Ip[1]; 
	IpHeadUint8[14]=NetPort[num].My_Ip[2]; 
	IpHeadUint8[15]=NetPort[num].My_Ip[3]; 
 
    	IpHead.e_ip.DestId[0]=de_ip[0];			//Ìî³äÄ¿µÄIPµØÖ· 
    	IpHead.e_ip.DestId[1]=de_ip[1]; 
	IpHead.e_ip.DestId[2]=de_ip[2]; 
	IpHead.e_ip.DestId[3]=de_ip[3]; 
 
	IpHeadUint8[16]=de_ip[0];			//Ìî³äÄ¿µÄIPµØÖ· 
    	IpHeadUint8[17]=de_ip[1]; 
	IpHeadUint8[18]=de_ip[2]; 
	IpHeadUint8[19]=de_ip[3]; 
 
    	IpHead.e_ip.Crc=CreateIpHeadCrc(IpHeadUint8);		//²úÉúIPÍ·µÄ¼ìÑéºÍ 
    	IpHeadUint8[10]=(IpHead.e_ip.Crc&0xff00)>>8;//IPÊý¾Ý±¨×ܳ¤¶È¸ß×Ö½Ú 
	IpHeadUint8[11]=IpHead.e_ip.Crc&0x00ff;//IPÊý¾Ý±¨×ܳ¤¶ÈµÍ×Ö½Ú	 
 
	TxdIpData.STPTR=TxdData; 
	TxdIpData.length=20; 
	TxdIpData.DAPTR=IpHeadUint8; 
	if(Send_Ip_To_LLC(&TxdIpData,IpHead.e_ip.DestId,num)) 
		{ 
			return(1); 
		} 
		else 
		{ 
			return(0); 
		} 
//	} 
	//else 
	//	return (0); 
 
} 
*/ 
 
uint8 IP_PROCESS(uint8 * RecData,uint8 num)  
{ 
static temp=0; 
uint8  	iii; 
uint16	PackedLength; 
uint8 	TempIP[4]; 
#ifdef Little_End 
uint16	Ltemp; 
#endif 
	TempIP[0]=((eip*)RecData)->SourceIp[0]; 
	TempIP[1]=((eip*)RecData)->SourceIp[1]; 
	TempIP[2]=((eip*)RecData)->SourceIp[2]; 
	TempIP[3]=((eip*)RecData)->SourceIp[3];//±£´æ¶Ô·½IP 
	iii=((eip*)RecData)->VerandIphLen&0x0f; 
	iii=iii*4;//È¡IP°üÍ·µÄ³¤¶È 
#ifdef Big_End 
	PackedLength=((eip*)RecData)->TotalLen; 
#endif 
#ifdef Little_End 
	PackedLength=((eip*)RecData)->TotalLen; 
	Ltemp=PackedLength&0x00ff; 
	PackedLength=(PackedLength&0xff00)>>8; 
	PackedLength=PackedLength+(Ltemp<<8); 
#endif 
	PackedLength=PackedLength-(uint16)iii;//¼ÆËãÓÐЧÊý¾ÝµÄ³¤¶È 
	temp++;                 //ͳ¼Æ½ÓÊܵÄÓÐЧÊý¾Ý°üÊý 
	if(temp>=MAX_REC_BUFF) 
		temp=1; 
	switch(((eip*)RecData)->NextProtocal) 
	{ 
		case 1: 
			icmp_process(RecData,num);						   
			break; 
             /*case 6: 
			if(((eip*)RecData)->DestId[0]==NetPort[num].My_Ip[0]) 
			if(((eip*)RecData)->DestId[1]==NetPort[num].My_Ip[1]) 
			if(((eip*)RecData)->DestId[2]==NetPort[num].My_Ip[2]) 
			if(((eip*)RecData)->DestId[3]==NetPort[num].My_Ip[3])//Ä¿±êΪ±¾IP 
			{ 
				RecData=RecData+iii; 
				RECQ[temp].RecDataPtr=RecData; 
				RECQ[temp].length=PackedLength;				//Òª´«ÊäipµØÖ· 
				RECQ[temp].ip[0]=TempIP[0]; 
				RECQ[temp].ip[1]=TempIP[1]; 
				RECQ[temp].ip[2]=TempIP[2]; 
				RECQ[temp].ip[3]=TempIP[3]; 
				RECQ[temp].num=num; 
				RECQ[temp].My_Ip[0]=NetPort[num].My_Ip[0]; 
				RECQ[temp].My_Ip[1]=NetPort[num].My_Ip[1]; 
				RECQ[temp].My_Ip[2]=NetPort[num].My_Ip[2]; 
				RECQ[temp].My_Ip[3]=NetPort[num].My_Ip[3];	 
				OSQPost(RecTcpQFlag,(void *)&RECQ[temp]); 
			}	 
				//TCP 
			break;        
		case 17: 
			//Òª´«ÊäipµØÖ· 
			if(((eip*)RecData)->DestId[0]==NetPort[num].My_Ip[0]) 
			if(((eip*)RecData)->DestId[1]==NetPort[num].My_Ip[1]) 
			if(((eip*)RecData)->DestId[2]==NetPort[num].My_Ip[2]) 
			if(((eip*)RecData)->DestId[3]==NetPort[num].My_Ip[3])//Ä¿±êΪ±¾IP 
			{ 
			RecData=RecData+iii; 
			RECQ[temp].RecDataPtr=RecData; 
			RECQ[temp].length=PackedLength; 
			RECQ[temp].ip[0]=TempIP[0]; 
			RECQ[temp].ip[1]=TempIP[1]; 
			RECQ[temp].ip[2]=TempIP[2]; 
			RECQ[temp].ip[3]=TempIP[3]; 
			RECQ[temp].num=num; 
			RECQ[temp].My_Ip[0]=NetPort[num].My_Ip[0]; 
			RECQ[temp].My_Ip[1]=NetPort[num].My_Ip[1]; 
			RECQ[temp].My_Ip[2]=NetPort[num].My_Ip[2]; 
			RECQ[temp].My_Ip[3]=NetPort[num].My_Ip[3];	 
			OSQPost(RecUdpQFlag,(void *)&RECQ[temp]); 
			} 
			//UDP 
			break;     */ 
		default :  
			break; 
	}// end for switch 
	return 1; 
}