?? icmp.c
字號:
/*****************************************************************************
*
* File Name : icmp.c
*
* DESCRIPTION : Used for ICMP Protocol
*
* Written by TomXue @2003
* Modified by houlei @2004.10.10
*****************************************************************************/
#include "ne64api.h"
#include "ethernet.h"
#include "etherinit.h"
#include "IO_MAP.h"
#include "MOTTYPES.h"
extern tU16 checksum(tU16 *, tU16);
extern void icmp_echo(in_Header *, tU16);
extern tU08 *sed_FormatPacket( tU08 *, tU08 *, tU16 );
extern tU08 sed_Send( tU16 );
extern void Move( tU08 *, tU08 *, tU16 );
extern tU08 *EtherPtr;
void icmp_in(in_Header *ip_icmp,tU16 ip_len) //used to process a icmp packet
{
tU16 old_icmp_checksum=((icmphdr *)(ip_icmp+1))->icmp_checksum;
tU16 icmp_len = ip_len - 0x0014; // 0x0014 is length of ip packet head
((icmphdr *)(ip_icmp+1))->icmp_checksum = 0x0000;
if( checksum((tU16 *)((icmphdr *)(ip_icmp+1)), icmp_len)==old_icmp_checksum ){
switch( ((icmphdr *)(ip_icmp+1))->icmp_type ){
case ICMP_ECHO :
icmp_echo(ip_icmp,icmp_len);
break;
default:
break;
}
}
}
void icmp_echo(in_Header *ip,tU16 icmp_len) {
struct _pkt {
in_Header in;
icmphdr icmp;
} *pkt;
in_HwAddress addrtemp;
icmphdr *icmpptr = ((icmphdr *)(ip+1));
pkt = (struct _pkt *)sed_FormatPacket( EtherPtr,(((tU08 *)ip)-8),0x0800);
addrtemp = pkt->in.destination;
pkt->in.destination = ip->source;
pkt->in.source = addrtemp;
icmpptr->icmp_type = 0x00;
pkt->icmp.icmp_checksum = checksum((tU16 *)icmpptr, icmp_len);
pkt->icmp.icmp_type = 0x00;
sed_Send(sizeof(in_Header)+icmp_len);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -