⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 icmp.c

📁 mc51单片机对rtl8019编程,实现ethernet的收发控制.
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -