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);
}