📄 icmp.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 + -