00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "global.h"
00016 #include "net.h"
00017 #include "nic.h"
00018 #include "arp.h"
00019 #include "icmp.h"
00020
00021 #include "rprintf.h"
00022 #include "debug.h"
00023
00024
00025
00026
00027
00028
00029
00030 void icmpInit(void)
00031 {
00032 }
00033
00034 void icmpIpIn(icmpip_hdr* packet)
00035 {
00036
00037 switch(packet->icmp.type)
00038 {
00039 case ICMP_TYPE_ECHOREQUEST:
00040
00041 icmpEchoRequest(packet);
00042 break;
00043 default:
00044 break;
00045 }
00046 }
00047
00048 void icmpEchoRequest(icmpip_hdr* packet)
00049 {
00050 uint32_t tempIp;
00051
00052
00053 packet->icmp.type = ICMP_TYPE_ECHOREPLY;
00054
00055 packet->icmp.icmpchksum = 0;
00056 packet->icmp.icmpchksum = netChecksum((u08*)&packet->icmp, htons(packet->ip.len)-IP_HEADER_LEN);
00057
00058 tempIp = packet->ip.destipaddr;
00059 packet->ip.destipaddr = packet->ip.srcipaddr;
00060 packet->ip.srcipaddr = tempIp;
00061
00062 arpIpOut((struct netEthIpHeader*)(((u08*)packet)-ETH_HEADER_LEN), 0);
00063
00064
00065 #if NET_DEBUG >= 2
00066 icmpPrintHeader(packet);
00067
00068 #endif
00069
00070
00071 nicSend(htons(packet->ip.len)+ETH_HEADER_LEN, (((u08*)packet)-ETH_HEADER_LEN));
00072 }
00073
00074 #ifdef ICMP_DEBUG_PRINT
00075 void icmpPrintHeader(icmpip_hdr* packet)
00076 {
00077 rprintfProgStrM("ICMP Packet:\r\n");
00078
00079 rprintfProgStrM("SrcIpAddr: "); netPrintIPAddr(htonl(packet->ip.srcipaddr)); rprintfCRLF();
00080
00081 rprintfProgStrM("DstIpAddr: "); netPrintIPAddr(htonl(packet->ip.destipaddr)); rprintfCRLF();
00082
00083 rprintfProgStrM("Type : ");
00084 switch(packet->icmp.type)
00085 {
00086 case ICMP_TYPE_ECHOREQUEST: rprintfProgStrM("ECHO REQUEST"); break;
00087 case ICMP_TYPE_ECHOREPLY: rprintfProgStrM("ECHO REPLY"); break;
00088 default: rprintfProgStrM("UNKNOWN"); break;
00089 }
00090 rprintfCRLF();
00091
00092 rprintfProgStrM("Code : 0x"); rprintfu08(packet->icmp.icode); rprintfCRLF();
00093 }
00094 #endif