source: SVN/cambria/redboot/packages/redboot/current/src/net/icmp.c @ 1

Last change on this file since 1 was 1, checked in by Tim Harvey, 2 years ago

restored latest version of files from server backup

Signed-off-by: Tim Harvey <tharvey@…>

File size: 3.9 KB
Line 
1//==========================================================================
2//
3//      net/icmp.c
4//
5//      Stand-alone ICMP networking support for RedBoot
6//
7//==========================================================================
8//####ECOSGPLCOPYRIGHTBEGIN####
9// -------------------------------------------
10// This file is part of eCos, the Embedded Configurable Operating System.
11// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12//
13// eCos is free software; you can redistribute it and/or modify it under
14// the terms of the GNU General Public License as published by the Free
15// Software Foundation; either version 2 or (at your option) any later version.
16//
17// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18// WARRANTY; without even the implied warranty of MERCHANTABILITY or
19// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20// for more details.
21//
22// You should have received a copy of the GNU General Public License along
23// with eCos; if not, write to the Free Software Foundation, Inc.,
24// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25//
26// As a special exception, if other files instantiate templates or use macros
27// or inline functions from this file, or you compile this file and link it
28// with other works to produce a work based on this file, this file does not
29// by itself cause the resulting work to be covered by the GNU General Public
30// License. However the source code for this file must still be made available
31// in accordance with section (3) of the GNU General Public License.
32//
33// This exception does not invalidate any other reasons why a work based on
34// this file might be covered by the GNU General Public License.
35//
36// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37// at http://sources.redhat.com/ecos/ecos-license/
38// -------------------------------------------
39//####ECOSGPLCOPYRIGHTEND####
40//==========================================================================
41//#####DESCRIPTIONBEGIN####
42//
43// Author(s):    gthomas
44// Contributors: gthomas
45// Date:         2000-07-14
46// Purpose:     
47// Description: 
48//             
49// This code is part of RedBoot (tm).
50//
51//####DESCRIPTIONEND####
52//
53//==========================================================================
54
55#include <net/net.h>
56
57/*
58 * Handle ICMP packets.
59 */
60static void default_icmp_handler(pktbuf_t *pkt, ip_route_t *dest);
61
62static icmp_handler_t icmp_handler = default_icmp_handler;
63
64/*
65 * Install a user defined user_handler for incoming icmp packets.
66 * Returns zero if successful, -1 if the user_handler is already used.
67 */
68int
69__icmp_install_listener(icmp_handler_t user_handler)
70{
71    if (icmp_handler == user_handler) {
72        return -1;
73    }
74    icmp_handler = user_handler;
75    return 0;
76}
77
78
79/*
80 * Replace a user defined handler by the default handler.
81 */
82void
83__icmp_remove_listener(void)
84{
85  if (icmp_handler != default_icmp_handler) {
86      icmp_handler = default_icmp_handler;
87  }
88}
89
90/*
91 * ICMP entry point with an IP packet pkt and the destination dest a reply
92 * should be sent to.
93 */
94void
95__icmp_handler(pktbuf_t *pkt, ip_route_t *dest)
96{
97    (*icmp_handler)(pkt, dest);
98
99    BSPLOG(bsp_log("icmp: dest[%s] type[%d] seq[%d]\n",
100                   inet_ntoa(pkt->ip_hdr->destination),
101                   pkt->icmp_hdr->type,
102                   pkt->icmp_hdr->seqnum));
103    __pktbuf_free(pkt);
104}
105
106
107/*
108 * The default ICMP handler only handles ICMP incoming echo request and
109 * outgoing echo reply.
110 */
111static void
112default_icmp_handler(pktbuf_t *pkt, ip_route_t *dest)
113{
114    word cksum;
115
116    if (pkt->icmp_hdr->type == ICMP_TYPE_ECHOREQUEST
117        && pkt->icmp_hdr->code == 0
118        && __sum((word *)pkt->icmp_hdr, pkt->pkt_bytes, 0) == 0) {
119
120        pkt->icmp_hdr->type = ICMP_TYPE_ECHOREPLY;
121        pkt->icmp_hdr->checksum = 0;
122        cksum = __sum((word *)pkt->icmp_hdr, pkt->pkt_bytes, 0);
123        pkt->icmp_hdr->checksum = htons(cksum);
124        __ip_send(pkt, IP_PROTO_ICMP, dest);
125    }
126}
Note: See TracBrowser for help on using the repository browser.