www.pudn.com > ARM_RTL8019.rar > ICMP.C
#define ICMP_GLOBALS
#include "config.h"
#include "cfg_net.h"
/*
void memcpy(void *s1, const void *s2, int n)
{
int i;
for (i = 0; i < n; i++)
((char *)(s1))[i] = ((const char *)(s2))[i];
}
*/
/**********************************************************************
**º¯ÊýÔÐÍ£º void CreateIcmpCrc( )
**Èë¿Ú²ÎÊý:º Ö¸ÏòicmpÊý¾Ý°üÍÖ¸Õë·
**³ö¿Ú²ÎÊý: ÎÞ
**·µ »Ø Öµ£º crc £º 16λµÄУÑéºÍ
**˵ Ã÷£º ²úÉúICMPÊý¾Ý¶ÎµÄУÑéºÍ
************************************************************************/
uint16 CreateIcmpCrc(union icmp_rc icmppk)
{
uint8 i;
union w CrcTemp;
CrcTemp.dwords=0;
for(i=0;i<20;i++) //ÓÃÓÚ²éѯµÄICMP±¨ÎĹ²40×Ö½Ú
{
CrcTemp.dwords = CrcTemp.dwords + icmppk.words.wordbuf[i];
}
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);
}
/*
uint16 CreateIcmpCrc1(union icmp_rc icmppk)
{
uint8 i;
union w CrcTemp;
CrcTemp.dwords=0;
for(i=0;i<18;i++) //ÓÃÓÚ²éѯµÄICMP±¨ÎĹ²40×Ö½Ú
{
CrcTemp.dwords = CrcTemp.dwords + icmppk.words.wordbuf[i];
}
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);
}
*/
/**********************************************************************
**º¯ÊýÔÐÍ£º void icmp_process(unsigned char * ICMPSENDPTR)
**Èë¿Ú²ÎÊý:º * ICMPSENDPTR : Êý¾ÝÖ¸Õë
**³ö¿Ú²ÎÊý: ÎÞ
**·µ »Ø Öµ£º ÎÞ
**˵ Ã÷£º ´¦ÀíICMP°ü
************************************************************************/
void icmp_process(uint8 * ICMPSENDPTR,uint8 num)
{
uint8 i,temp;
struct _pkst SendIcmpData;
if(((icmppro*)ICMPSENDPTR)->icmpf.e_icmp.type==0x08)//ÇëÇ󣡣¡
{
((icmppro*)ICMPSENDPTR)->icmpf.e_icmp.type=0;//»Ø¸´
((icmppro*)ICMPSENDPTR)->ipf.e_ip.ttl--;
for (i = 0; i < 4; i++)//IP·×ª
{
temp = ((icmppro*)ICMPSENDPTR)->ipf.e_ip.SourceIp[i];
((icmppro*)ICMPSENDPTR)->ipf.e_ip.SourceIp[i] = ((icmppro*)ICMPSENDPTR)->ipf.e_ip.DestId[i];
((icmppro*)ICMPSENDPTR)->ipf.e_ip.DestId[i] = temp;
}
((icmppro*)ICMPSENDPTR)->ipf.e_ip.Crc=0; //Éú³ÉipУÑéºÍ
((icmppro*)ICMPSENDPTR)->ipf.e_ip.Crc=CreateIpHeadCrc(ICMPSENDPTR);//(((icmppro*)ICMPSENDPTR)->ipf);
#ifdef Little_End
((icmppro*)ICMPSENDPTR)->ipf.e_ip.Crc=swap_int16(((icmppro*)ICMPSENDPTR)->ipf.e_ip.Crc);
#endif
((icmppro*)ICMPSENDPTR)->icmpf.e_icmp.Crc=0; //Éú³ÉicmpУÑéºÍ
((icmppro*)ICMPSENDPTR)->icmpf.e_icmp.Crc=CreateIcmpCrc(((icmppro*)ICMPSENDPTR)->icmpf);
SendIcmpData.length=((icmppro*)ICMPSENDPTR)->ipf.e_ip.TotalLen;
#ifdef Little_End
SendIcmpData.length=swap_int16(SendIcmpData.length);
#endif
SendIcmpData.STPTR=NULL;
SendIcmpData.DAPTR=ICMPSENDPTR;
Send_Ip_To_LLC(&SendIcmpData,((icmppro*)ICMPSENDPTR)->ipf.e_ip.DestId,num);
//}
}
else if(((icmppro*)ICMPSENDPTR)->icmpf.e_icmp.type==0x00)//»Ø¸´
{
i=i;
}
}
/*
void Icmp_Send(uint8 type,uint8 option,uint8 *so_ip,uint8 *de_ip, uint8 * REC_FRAME )
{
struct _pkst SendPingData;
union icmp_rc IcmpPacked;
//static uint16 temp_findex=0x2345;
memcpy (&(IcmpPacked.e_icmp.icmpdata), REC_FRAME, 28);
IcmpPacked.e_icmp.type=type;
IcmpPacked.e_icmp.option=option;
IcmpPacked.e_icmp.Crc=0;
IcmpPacked.e_icmp.id=0;
IcmpPacked.e_icmp.seq=0;
IcmpPacked.e_icmp.Crc=CreateIcmpCrc1(IcmpPacked);
SendPingData.length=36;
SendPingData.STPTR=NULL;
SendPingData.DAPTR=( uint8 * )&IcmpPacked;
Send_Ip_Frame (
&SendPingData,
de_ip,
so_ip,
1
);
}
*/
/*
void Ping_Precess(uint8 * de_ip,uint8 * so_ip)
{
struct _pkst SendPingData;
union icmp_rc IcmpPacked;
static uint16 temp_findex=0x2345;
IcmpPacked.e_icmp.type=0x08;
IcmpPacked.e_icmp.option=0;
IcmpPacked.e_icmp.Crc=0;
#ifdef Big_End
IcmpPacked.e_icmp.id=0x0300;
#endif
#ifdef Little_End
IcmpPacked.e_icmp.id=0x0003;
#endif
IcmpPacked.e_icmp.seq=temp_findex++;
IcmpPacked.e_icmp.Crc=CreateIcmpCrc(IcmpPacked);
SendPingData.length=40;
SendPingData.STPTR=NULL;
SendPingData.DAPTR=( uint8 * )&IcmpPacked;
Send_Ip_Frame (
&SendPingData,
de_ip,
so_ip,
1
);
}
*/