Line No. | Rev | Author | Line |
---|---|---|---|
1 | 6 | kaklik | /*! \file icmp.c \brief ICMP Protocol Library. */ |
2 | //***************************************************************************** |
||
3 | // |
||
4 | // File Name : 'icmp.c' |
||
5 | // Title : ICMP (Internet Control Message Protocol) Protocol Library |
||
6 | // Author : Pascal Stang |
||
7 | // Created : 9/10/2004 |
||
8 | // Revised : 7/3/2005 |
||
9 | // Version : 0.1 |
||
10 | // Target MCU : Atmel AVR series |
||
11 | // Editor Tabs : 4 |
||
12 | // |
||
13 | //***************************************************************************** |
||
14 | |||
15 | #include "global.h" |
||
16 | #include "net.h" |
||
17 | #include "nic.h" |
||
18 | #include "arp.h" |
||
19 | #include "icmp.h" |
||
20 | |||
21 | #include "rprintf.h" |
||
22 | #include "debug.h" |
||
23 | |||
24 | //extern void nicSend(unsigned int len, unsigned char* packet); |
||
25 | |||
26 | // global variables |
||
27 | |||
28 | |||
29 | // functions |
||
30 | void icmpInit(void) |
||
31 | { |
||
32 | } |
||
33 | |||
34 | void icmpIpIn(icmpip_hdr* packet) |
||
35 | { |
||
36 | // check ICMP type |
||
37 | switch(packet->icmp.type) |
||
38 | { |
||
39 | case ICMP_TYPE_ECHOREQUEST: |
||
40 | // echo request |
||
41 | icmpEchoRequest(packet); |
||
42 | break; |
||
43 | default: |
||
44 | break; |
||
45 | } |
||
46 | } |
||
47 | |||
48 | void icmpEchoRequest(icmpip_hdr* packet) |
||
49 | { |
||
50 | uint32_t tempIp; |
||
51 | |||
52 | // change type to reply |
||
53 | packet->icmp.type = ICMP_TYPE_ECHOREPLY; |
||
54 | // recalculate checksum |
||
55 | packet->icmp.icmpchksum = 0; |
||
56 | packet->icmp.icmpchksum = netChecksum((u08*)&packet->icmp, htons(packet->ip.len)-IP_HEADER_LEN); |
||
57 | // return to sender |
||
58 | tempIp = packet->ip.destipaddr; |
||
59 | packet->ip.destipaddr = packet->ip.srcipaddr; |
||
60 | packet->ip.srcipaddr = tempIp; |
||
61 | // add ethernet routing |
||
62 | arpIpOut((struct netEthIpHeader*)(((u08*)packet)-ETH_HEADER_LEN), 0); |
||
63 | |||
64 | // debugging |
||
65 | #if NET_DEBUG >= 2 |
||
66 | icmpPrintHeader(packet); |
||
67 | //debugPrintHexTable(htons(packet->ip.len), (u08*)packet); |
||
68 | #endif |
||
69 | |||
70 | // send it (packet->ip.len+ETH_HEADER_LEN |
||
71 | nicSend(htons(packet->ip.len)+ETH_HEADER_LEN, (((u08*)packet)-ETH_HEADER_LEN)); |
||
72 | } |
||
73 | |||
74 | #ifdef ICMP_DEBUG_PRINT |
||
75 | void icmpPrintHeader(icmpip_hdr* packet) |
||
76 | { |
||
77 | rprintfProgStrM("ICMP Packet:\r\n"); |
||
78 | // print source IP address |
||
79 | rprintfProgStrM("SrcIpAddr: "); netPrintIPAddr(htonl(packet->ip.srcipaddr)); rprintfCRLF(); |
||
80 | // print dest IP address |
||
81 | rprintfProgStrM("DstIpAddr: "); netPrintIPAddr(htonl(packet->ip.destipaddr)); rprintfCRLF(); |
||
82 | // print type |
||
83 | rprintfProgStrM("Type : "); |
||
84 | switch(packet->icmp.type) |
||
85 | { |
||
86 | case ICMP_TYPE_ECHOREQUEST: rprintfProgStrM("ECHO REQUEST"); break; |
||
87 | case ICMP_TYPE_ECHOREPLY: rprintfProgStrM("ECHO REPLY"); break; |
||
88 | default: rprintfProgStrM("UNKNOWN"); break; |
||
89 | } |
||
90 | rprintfCRLF(); |
||
91 | // print code |
||
92 | rprintfProgStrM("Code : 0x"); rprintfu08(packet->icmp.icode); rprintfCRLF(); |
||
93 | } |
||
94 | #endif |
Powered by WebSVN v2.8.3