icmp.c

来自「MC9S12NE64串口与网络通信源代码」· C语言 代码 · 共 62 行

C
62
字号
 /*****************************************************************************
 *
 * 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 + =
减小字号Ctrl + -
显示快捷键?