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


/********************************************************************** 
**º¯ÊýÔ­ÐÍ:	    unsigned int CheckSum(unsigned int xdata *check,unsigned int length) 
**Èë¿Ú²ÎÊý:  	check	:	±»Ð£ÑéÊý¾ÝÆðʼµØÖ· 
				length	:	±»Ð£ÑéÊý¾Ý³¤¶È£¬µ¥Î»×Ö 
**³ö¿Ú²ÎÊý:		ÎÞ 
**·µ »Ø Öµ:		~((sum)&0xffff))		        
**˵    Ã÷:		¼ÆËãУÑéºÍ  
************************************************************************/ 
unsigned int CheckSum(unsigned int xdata *check,unsigned int length) 
{ 
unsigned long sum=0; 
unsigned int i; 
for (i=0;i<(length)/2;i++) 
	{ 
	sum += *check++; 
	} 
if(length&0x01)//³¤¶ÈÎªÆæÊý¸öʱ£¬Òª½øÐиòÙ×÷ 
	{ 
	sum = sum + ((*check)&0xff00); 
	} 
sum = (sum&0xffff) + ((sum>>16)&0xffff);//¸ß16λºÍµÍ16λÏà¼Ó 
if(sum & 0xffff0000) 
	{//±íʾÓнøÎ» 
	sum++; 
	} 
return ( (unsigned int)(~((sum)&0xffff))  ); 
} 
 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ£º    unsigned char  VerifyIpHeadCrc() 
**Èë¿Ú²ÎÊý:º	ÎÞ 
**³ö¿Ú²ÎÊý:		ÎÞ 
**·µ »Ø Öµ£º	0   :  	УÑé´íÎó 
**				1   :	УÑéÕýÈ·        
**˵    Ã÷£º	¶ÔIPÍ·½øÐÐУÑé  
************************************************************************/ 
unsigned char  VerifyIpHeadCrc() 
{ 
unsigned int crc; 
crc = CheckSum(&RxdNetBuff.IpPacket.IpPacket[0],(RxdNetBuff.IpFrame.VerandIphLen&0x0f)*4);//1λ´ú±í1×Ö½Ú 
if(crc == 0) 
	{ 
	return (1); 
	} 
return(0); 
} 
//=============================================================== 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ:º    unsigned char  VerifyTcpCrc() 
**Èë¿Ú²ÎÊý:º	ÎÞ 
**³ö¿Ú²ÎÊý:		ÎÞ 
**·µ »Ø Öµ:º	0   :º  УÑé´íÎó 
**				1   :º	УÑéÕýÈ·        
**˵    Ã÷:º	¶ÔTCPÍ·½øÐÐУÑé  
************************************************************************/ 
unsigned char  VerifyTcpCrc() 
{ 
unsigned int crc; 
RxdNetBuff.IpFrame.ttl=0; 
RxdNetBuff.IpFrame.Crc=RxdNetBuff.IpFrame.TotalLen-(RxdNetBuff.IpFrame.VerandIphLen&0x0f)*4; 
crc = CheckSum(&RxdNetBuff.IpPacket.IpPacket[4],RxdNetBuff.IpFrame.Crc+12); 
if(crc == 0) 
	{ 
	 return (1); 
	} 
return(0); 
} 
//================================================================ 
 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ£º    void 	CreateIpHeadCrc() 
**Èë¿Ú²ÎÊý:º	ÎÞ 
**³ö¿Ú²ÎÊý:		ÎÞ 
**·µ »Ø Öµ£º	crc £º  16λµÄУÑéºÍ         
**˵    Ã÷£º	²úÉúIPÊײ¿µÄУÑéºÍ  
 
uint8  CreateIpHeadCrc() 
{ 
  uint8 i; 
CrcTemp.dwords = 0; 
for(i=0;i<19;i++)              				//IPÊײ¿¹²20×Ö½Ú 
	{ 
 	CrcTemp.dwords = CrcTemp.dwords + TxdNetBuff.words.wordbuf[i]; 
	} 
while(CrcTemp.words.high>0)  
	{ 
    CrcTemp.dwords = (ulong)(CrcTemp.words.high + CrcTemp.words.low); 
    } 
CrcTemp.words.low = 0xffff - CrcTemp.words.low;  //È¡·´ 
return(CrcTemp.words.low); 
} 
***********************************************************************/ 
 
//================================================================ 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ£º    void 	CreateIcmpCrc( ) 
**Èë¿Ú²ÎÊý:º	ÎÞ 
**³ö¿Ú²ÎÊý:		ÎÞ 
**·µ »Ø Öµ£º	crc £º  16λµÄУÑéºÍ         
**˵    Ã÷£º	²úÉúICMPÊý¾Ý¶ÎµÄУÑéºÍ  
 
uint  CreateIcmpCrc()// 
{ 
uchar i; 
CrcTemp.dwords=0; 
for(i=19;i<39;i++)				//ÓÃÓÚ²éѯµÄICMP±¨ÎĹ²40×Ö½Ú 
	{ 
	CrcTemp.dwords = CrcTemp.dwords + TxdNetBuff.words.wordbuf[i]; 
	} 
while(CrcTemp.words.high>0)  
	{ 
    CrcTemp.dwords = (ulong)(CrcTemp.words.high+CrcTemp.words.low); 
    } 
CrcTemp.words.low = 0xffff - CrcTemp.words.low; 
return(CrcTemp.words.low); 
} 
************************************************************************/ 
 
//================================================================= 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ£º    unsigned char  VerifyUdpCrc() 
**Èë¿Ú²ÎÊý:º	ÎÞ 
**³ö¿Ú²ÎÊý:		ÎÞ 
**·µ »Ø Öµ£º	0   £º  УÑé´íÎó 
**		1   £º	УÑéÕýÈ·        
**˵    Ã÷£º	¶ÔUDPÍ·½øÐÐУÑé  
************************************************************************/ 
unsigned char  VerifyUdpCrc() 
{ 
unsigned int crc; 
 
RxdNetBuff.IpFrame.ttl = 0; 
RxdNetBuff.IpFrame.Crc = RxdNetBuff.IpFrame.TotalLen - (RxdNetBuff.IpFrame.VerandIphLen&0x0f)*4; 
crc = CheckSum(&RxdNetBuff.IpPacket.IpPacket[4],RxdNetBuff.IpFrame.Crc+12); 
if(crc==0) 
	{ 
	 return (1); 
 	} 
return(0); 
} 
//================================================================== 
/********************************************************************** 
**º¯ÊýÔ­ÐÍ£º    void 	CreateTcpCrc() 
**Èë¿Ú²ÎÊý:º	ÎÞ 
**³ö¿Ú²ÎÊý:		ÎÞ 
**·µ »Ø Öµ£º	crc £º  16λµÄУÑéºÍ        
**˵    Ã÷£º	²úÉúTCPÊý¾Ý¶ÎµÄУÑéºÍ  
************************************************************************/ 
uint CreateTcpCrc() 
{ 
uint crc; 
crc = CheckSum(&TxdNetBuff.IpPacket.IpPacket[4],TxdNetBuff.IpFrame.Crc+12); 
return (crc); 
}