icmp.c

来自「mc51单片机对rtl8019编程,实现ethernet的收发控制.」· C语言 代码 · 共 55 行

C
55
字号
#include "icmp.h"
#include "ethernet.h"
#include "ip.h"

extern 	 Net_inf_struc 	net_inf;
//-----------------------------------------------------------------
// send an ICMP echo response using the received request data
Bool icmp_send(	Uint8 *pBuffer,Uint8 *pIP,Uint8 *picmp_pkt,Uint8 nsize)
{
	Ip_struc* ipPkt;
	Icmphdr_struc* icmpPkt;
	
	nsize=Max(nsize,64-sizeof(Ether_header_struc) - sizeof(Ip_struc));
	// data fill common icmp header components
	icmpPkt = ( Icmphdr_struc *) (pBuffer + sizeof(Ether_header_struc) + sizeof(Ip_struc));
	memcpy(icmpPkt,picmp_pkt,nsize);
	icmpPkt->checksum = 0;
	icmpPkt->checksum = cpu_checksum(( Uint16 *) icmpPkt, nsize);
	//ip layer process
	ipPkt = ( Ip_struc *) (pBuffer + sizeof(Ether_header_struc));
	memcpy(ipPkt->ip_dst, pIP, INADDR_LEN);
	memcpy(ipPkt->ip_src, net_inf.ip_local, INADDR_LEN);
	nsize += sizeof(Ip_struc);
	ipPkt->ip_len = nsize*2;
	ipPkt->ip_p = IPPROTO_ICMP;
	ipPkt->ip_id = 0;
	ipPkt->ip_ttl = 64;
	ipPkt->ip_hl_v = 0x45;
	ipPkt->ip_tos = 0;
	ipPkt->ip_off = 0;
	ip_send(pBuffer);
	return TRUE;
}

//-----------------------------------------------------------------
// ICMP packet receive & action
Bool	icmp_receive(Uint8* pBuffer)
{
	Ip_struc* ipPkt;
	Icmphdr_struc* icmpPkt;
	ipPkt = ( Ip_struc *) (pBuffer + sizeof(Ether_header_struc));
	icmpPkt = ( Icmphdr_struc*) (pBuffer + sizeof(Ether_header_struc) + sizeof(Ip_struc));
	if (cpu_checksum(( Uint16 *) icmpPkt, ipPkt->ip_len/2 -sizeof(Ip_struc)) == 0){
		switch(icmpPkt->type){
			case ICMP_ECHO:
				icmpPkt->type = ICMP_ECHOREPLY;
				icmpPkt->subcode = 0;
				icmp_send(pBuffer,ipPkt->ip_src,(Uint8 *)icmpPkt,20);
				break;
		}
	}
	return TRUE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?