Main Page   Modules   Data Structures   File List   Data Fields   Globals   Related Pages   Examples  

/opentcp/icmp.c

Go to the documentation of this file.
00001 /*
00002  *Copyright (c) 2000-2002 Viola Systems Ltd.
00003  *All rights reserved.
00004  *
00005  *Redistribution and use in source and binary forms, with or without 
00006  *modification, are permitted provided that the following conditions 
00007  *are met:
00008  *
00009  *1. Redistributions of source code must retain the above copyright 
00010  *notice, this list of conditions and the following disclaimer.
00011  *
00012  *2. Redistributions in binary form must reproduce the above copyright 
00013  *notice, this list of conditions and the following disclaimer in the 
00014  *documentation and/or other materials provided with the distribution.
00015  *
00016  *3. The end-user documentation included with the redistribution, if 
00017  *any, must include the following acknowledgment:
00018  *      "This product includes software developed by Viola 
00019  *      Systems (http://www.violasystems.com/)."
00020  *
00021  *Alternately, this acknowledgment may appear in the software itself, 
00022  *if and wherever such third-party acknowledgments normally appear.
00023  *
00024  *4. The names "OpenTCP" and "Viola Systems" must not be used to 
00025  *endorse or promote products derived from this software without prior 
00026  *written permission. For written permission, please contact 
00027  *opentcp@opentcp.org.
00028  *
00029  *5. Products derived from this software may not be called "OpenTCP", 
00030  *nor may "OpenTCP" appear in their name, without prior written 
00031  *permission of the Viola Systems Ltd.
00032  *
00033  *THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 
00034  *WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
00035  *MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
00036  *IN NO EVENT SHALL VIOLA SYSTEMS LTD. OR ITS CONTRIBUTORS BE LIABLE 
00037  *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
00038  *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
00039  *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
00040  *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
00041  *WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
00042  *OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
00043  *EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00044  *====================================================================
00045  *
00046  *OpenTCP is the unified open source TCP/IP stack available on a series 
00047  *of 8/16-bit microcontrollers, please see <http://www.opentcp.org>.
00048  *
00049  *For more information on how to network-enable your devices, or how to 
00050  *obtain commercial technical support for OpenTCP, please see 
00051  *<http://www.violasystems.com/>.
00052  */
00053 
00072 #include <inet/debug.h>
00073 #include <inet/datatypes.h>
00074 #include <inet/ethernet.h>
00075 #include <inet/ip.h>
00076 #include <inet/tcp_ip.h>
00077 #include <inet/system.h>
00078 
00097 INT16 process_icmp_in (struct ip_frame* frame, UINT16 len) 
00098 {
00099         UINT8 type;
00100         UINT8 code;
00101         UINT16 checksum;
00102         UINT16 i;
00103         
00104         
00105         /* Is this ICMP?        */
00106         
00107         ICMP_DEBUGOUT("Processing ICMP...\n\r");
00108         
00109         if( frame->protocol != IP_ICMP ) {
00110                 ICMP_DEBUGOUT("ERROR: The protocol is not ICMP\n\r");
00111                 return(-1);
00112         }
00113         
00114         /* Calculate checksum for received packet       */
00115 
00116         checksum = 0;
00117         i = 0;
00118         
00119         NETWORK_RECEIVE_INITIALIZE(frame->buf_index);
00120         
00121         for(i=0; i < len; i++)
00122                 checksum = ip_checksum(checksum, RECEIVE_NETWORK_B(), (UINT8)i);
00123         
00124         checksum = ~ checksum;
00125         
00126         if(checksum != IP_GOOD_CS) {
00127                 ICMP_DEBUGOUT("ERROR: ICMP Checksum failed!\n\r");
00128                 return (-1);
00129         }
00130         
00131         ICMP_DEBUGOUT("ICMP Checksum OK\n\r");
00132         
00133         /* Start processing the message */
00134         
00135         NETWORK_RECEIVE_INITIALIZE(frame->buf_index);
00136         
00137         type = RECEIVE_NETWORK_B();
00138         code = RECEIVE_NETWORK_B();
00139         
00140         /* We have already checked the CS, skip it      */
00141         
00142         RECEIVE_NETWORK_B();
00143         RECEIVE_NETWORK_B();
00144 
00145         switch(type) {
00146                 case ICMP_ECHO_REQUEST:
00147                 
00148                         if(code != 0) {
00149                                 ICMP_DEBUGOUT("ERROR:Misformed ICMP ECHO Request\n\r");
00150                                 return(-1);
00151                         }
00152                         
00153                         ICMP_DEBUGOUT("ICMP ECHO Request received\n\r");
00154                         
00155                         /* Is it a packet for setting temporary IP?     */
00156                         
00157                         if(len == (ICMP_ECHOREQ_HLEN + ICMP_TEMPIPSET_DATALEN) )
00158                         {
00159                                 /* Yep, set temporary IP address        */
00160                                 
00161                                 ICMP_DEBUGOUT("PING with 102 bytes of data, getting temp. IP\r\n");                     
00162                                 localmachine.localip = frame->dip;
00163                                 
00164                         }
00165                         
00166                         
00167                         /* Same IP?             */
00168                         
00169                         if(localmachine.localip != frame->dip)
00170                                 return(-1);
00171 
00172                         /* Reply it     */
00173                         
00174                         TXBUF[0] = ICMP_ECHO_REPLY;
00175                         TXBUF[1] = 0;
00176                         TXBUF[2] = 0;
00177                         TXBUF[3] = 0;
00178                         
00179                         /* Copy with truncate if needed */
00180                         
00181                         if(len > NETWORK_TX_BUFFER_SIZE)
00182                                 len = NETWORK_TX_BUFFER_SIZE;
00183 
00184                         /* Calculate Checksum for packet to be sent     AND copy it to buffer*/
00185                         
00186                         checksum = ((UINT16)ICMP_ECHO_REPLY)<<8;
00187                         
00188                         for(i=4; i<len; i++){
00189                                 checksum = ip_checksum(checksum, TXBUF[i] = RECEIVE_NETWORK_B(), (UINT8)i);
00190                                 }
00191         
00192                         checksum = ~ checksum;
00193                         
00194                         /* Put the checksum on place    */
00195                         
00196                         TXBUF[2] = (UINT8)(checksum>>8);
00197                         TXBUF[3] = (UINT8)checksum;
00198                         
00199                         /* Send it                                              */
00200                         
00201                         process_ip_out(frame->sip, IP_ICMP, 0, 100, &TXBUF[0], len);
00202                         
00203                         ICMP_DEBUGOUT("ICMP Reply sent\n\r");
00204                         
00205                         return(0);
00206                         
00207                 
00208                 break;
00209                 
00210                 case ICMP_ECHO_REPLY:
00211                 
00212                 break;
00213         
00214                 default:                                /* Unregognized ICMP message    */
00215                         
00216                         ICMP_DEBUGOUT("Unregognized ICMP message\n\r");
00217                         return(-1); 
00218         }
00219         
00220 }
00221 
00222 
00223 
00224 
00225 

Generated on Sat Jan 25 17:13:14 2003 for OpenTCP by doxygen1.2.18