📄 icmp.c
字号:
/*
* File: icmp.c
* Purpose: Handle ICMP packets.
*
* Notes: See RFC 792 "Internet Control Message Protocol"
* for more details.
*/
#include "src/include/dbug.h"
#include "src/uif/net/net.h"
#ifdef DBUG_NETWORK
/********************************************************************/
void
dump_icmp_frame (icmp_message *msg)
{
switch (msg->type)
{
case ICMP_DEST_UNREACHABLE:
printf("ICMP : ");
switch (msg->code)
{
case ICMP_NET_UNREACHABLE:
printf("Net Unreachable\n");
break;
case ICMP_HOST_UNREACHABLE:
printf("Host Unreachable\n");
break;
case ICMP_PROTOCOL_UNREACHABLE:
printf("Protocol Unreachable\n");
break;
case ICMP_PORT_UNREACHABLE:
printf("Port Unreachable\n");
break;
case ICMP_FRAG_NEEDED:
printf("Fragmentation needed and DF set\n");
break;
case ICMP_ROUTE_FAILED:
printf("Source route failed\n");
break;
default:
printf("Destination Unreachable\n");
break;
}
break;
case ICMP_TIME_EXCEEDED:
printf("ICMP_TIME_EXCEEDED\n");
break;
case ICMP_PARAMETER_PROBLEM:
printf("ICMP_PARAMETER_PROBLEM\n");
break;
case ICMP_SOURCE_QUENCH:
printf("ICMP_SOURCE_QUENCH\n");
break;
case ICMP_REDIRECT:
printf("ICMP_REDIRECT\n");
break;
case ICMP_ECHO:
printf("ICMP_ECHO\n");
break;
case ICMP_ECHO_REPLY:
printf("ICMP_ECHO_REPLY\n");
break;
case ICMP_INFORMATION_REQUEST:
printf("ICMP_INFORMATION_REQUEST\n");
break;
case ICMP_INFORMATION_REPLY:
printf("ICMP_INFORMATION_REPLY\n");
break;
case ICMP_TIMESTAMP:
printf("ICMP_TIMESTAMP\n");
break;
case ICMP_TIMESTAMP_REPLY:
printf("ICMP_TIMESTAMP_REPLY\n");
break;
default:
printf("Unknown ICMP message\n");
break;
}
}
/********************************************************************/
void
icmp_handler (NIF *nif, NBUF *pNbuf)
{
/*
* This function handles the ICMP packets.
*/
icmp_message *icmpmsg;
ip_frame_hdr *ipframe;
uint8 src[4], dest[4];
icmpmsg = (icmp_message *)&pNbuf->data[pNbuf->offset];
switch (icmpmsg->type)
{
case ICMP_ECHO:
/*
* Change ICMP echo message into a echo reply message
*/
icmpmsg->type = ICMP_ECHO_REPLY;
/*
* Recompute checksum
*/
icmpmsg->chksum = 0;
icmpmsg->chksum = ip_chksum((uint16 *)icmpmsg,pNbuf->length);
/*
* Send the Echo Reply
*/
ipframe = (ip_frame_hdr *)&pNbuf->data[IP_HDR_OFFSET];
memcpy(dest, &ipframe->source_addr[0], 4);
memcpy(src, &ipframe->dest_addr[0], 4);
ip_send(nif, dest, src, ipframe->protocol, pNbuf);
break;
case ICMP_DEST_UNREACHABLE:
case ICMP_TIME_EXCEEDED:
case ICMP_PARAMETER_PROBLEM:
case ICMP_SOURCE_QUENCH:
case ICMP_REDIRECT:
case ICMP_ECHO_REPLY:
case ICMP_INFORMATION_REQUEST:
case ICMP_INFORMATION_REPLY:
case ICMP_TIMESTAMP:
case ICMP_TIMESTAMP_REPLY:
default:
dump_icmp_frame(icmpmsg);
nbuf_free(pNbuf);
break;
}
}
/******************************************************************/
#endif /* #ifdef DBUG_NETWORK */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -