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 debugPrintHexTable(htons(packet->ip.len), (u08*)packet);
00067 #endif
00068
00069
00070 nicSend(htons(packet->ip.len)+ETH_HEADER_LEN, (((u08*)packet)-ETH_HEADER_LEN));
00071 }
00072
00073 #ifdef ICMP_DEBUG_PRINT
00074 void icmpPrintHeader(icmpip_hdr* packet)
00075 {
00076 rprintfProgStrM("ICMP Packet:\r\n");
00077
00078 rprintfProgStrM("SrcIpAddr: "); netPrintIPAddr(htonl(packet->ip.srcipaddr)); rprintfCRLF();
00079
00080 rprintfProgStrM("DstIpAddr: "); netPrintIPAddr(htonl(packet->ip.destipaddr)); rprintfCRLF();
00081
00082 rprintfProgStrM("Type : ");
00083 switch(packet->icmp.type)
00084 {
00085 case ICMP_TYPE_ECHOREQUEST: rprintfProgStrM("ECHO REQUEST"); break;
00086 case ICMP_TYPE_ECHOREPLY: rprintfProgStrM("ECHO REPLY"); break;
00087 default: rprintfProgStrM("UNKNOWN"); break;
00088 }
00089 rprintfCRLF();
00090
00091 rprintfProgStrM("Code : 0x"); rprintfu08(packet->icmp.icode); rprintfCRLF();
00092 }
00093 #endif