route.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2001-2003 by egnite Software GmbH. All rights reserved.
00003  *
00004  * Redistribution and use in source and binary forms, with or without
00005  * modification, are permitted provided that the following conditions
00006  * are met:
00007  *
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the copyright holders nor the names of
00014  *    contributors may be used to endorse or promote products derived
00015  *    from this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS
00018  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00019  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00020  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE
00021  * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00022  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00023  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
00024  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
00025  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00026  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
00027  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00028  * SUCH DAMAGE.
00029  *
00030  * For additional information see http://www.ethernut.de/
00031  *
00032  * -
00033  * Portions Copyright (C) 2000 David J. Hudson <dave@humbug.demon.co.uk>
00034  *
00035  * This file is distributed in the hope that it will be useful, but WITHOUT
00036  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00037  * FITNESS FOR A PARTICULAR PURPOSE.
00038  *
00039  * You can redistribute this file and/or modify it under the terms of the GNU
00040  * General Public License (GPL) as published by the Free Software Foundation;
00041  * either version 2 of the License, or (at your discretion) any later version.
00042  * See the accompanying file "copying-gpl.txt" for more details.
00043  *
00044  * As a special exception to the GPL, permission is granted for additional
00045  * uses of the text contained in this file.  See the accompanying file
00046  * "copying-liquorice.txt" for details.
00047  * -
00048  * Portions Copyright (c) 1983, 1993 by
00049  *  The Regents of the University of California.  All rights reserved.
00050  *
00051  * Redistribution and use in source and binary forms, with or without
00052  * modification, are permitted provided that the following conditions
00053  * are met:
00054  * 1. Redistributions of source code must retain the above copyright
00055  *    notice, this list of conditions and the following disclaimer.
00056  * 2. Redistributions in binary form must reproduce the above copyright
00057  *    notice, this list of conditions and the following disclaimer in the
00058  *    documentation and/or other materials provided with the distribution.
00059  * 3. Neither the name of the University nor the names of its contributors
00060  *    may be used to endorse or promote products derived from this software
00061  *    without specific prior written permission.
00062  *
00063  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
00064  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00065  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00066  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
00067  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00068  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00069  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00070  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00071  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00072  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00073  * SUCH DAMAGE.
00074  * -
00075  * Portions Copyright (c) 1993 by Digital Equipment Corporation.
00076  *
00077  * Permission to use, copy, modify, and distribute this software for any
00078  * purpose with or without fee is hereby granted, provided that the above
00079  * copyright notice and this permission notice appear in all copies, and that
00080  * the name of Digital Equipment Corporation not be used in advertising or
00081  * publicity pertaining to distribution of the document or software without
00082  * specific, written prior permission.
00083  * 
00084  * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
00085  * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
00086  * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
00087  * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
00088  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
00089  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
00090  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
00091  * SOFTWARE.
00092  */
00093 
00094 /*
00095  * $Log: route.c,v $
00096  * Revision 1.6  2008/08/11 07:00:32  haraldkipp
00097  * BSD types replaced by stdint types (feature request #1282721).
00098  *
00099  * Revision 1.5  2005/07/23 14:30:40  haraldkipp
00100  * Removed unnecessary critical sections and atomic inc-/decrements.
00101  * Fixed a bug in NutIpRouteList(), which filled the first entry only.
00102  * Corrected the comment about unavailabilty of removing routes.
00103  *
00104  * Revision 1.4  2005/04/30 16:42:42  chaac
00105  * Fixed bug in handling of NUTDEBUG. Added include for cfg/os.h. If NUTDEBUG
00106  * is defined in NutConf, it will make effect where it is used.
00107  *
00108  * Revision 1.3  2004/12/17 15:27:19  haraldkipp
00109  * Added Adam Pierce's routing management functions.
00110  *
00111  * Revision 1.2  2004/10/10 16:37:03  drsung
00112  * Detection of directed broadcasts to local network added.
00113  *
00114  * Revision 1.1.1.1  2003/05/09 14:41:38  haraldkipp
00115  * Initial using 3.2.1
00116  *
00117  * Revision 1.12  2003/03/31 14:53:28  harald
00118  * Prepare release 3.1
00119  *
00120  * Revision 1.11  2003/02/04 18:14:57  harald
00121  * Version 3 released
00122  *
00123  * Revision 1.10  2002/06/26 17:29:36  harald
00124  * First pre-release with 2.4 stack
00125  *
00126  */
00127 
00128 #include <cfg/os.h>
00129 #include <sys/heap.h>
00130 
00131 #include <net/if_var.h>
00132 #include <net/route.h>
00133 
00134 #include <string.h>
00135 
00136 #ifdef NUTDEBUG
00137 #include <sys/osdebug.h>
00138 #endif
00139 
00144 
00145 RTENTRY *rteList;           
00164 int NutIpRouteAdd(uint32_t ip, uint32_t mask, uint32_t gate, NUTDEVICE * dev)
00165 {
00166     int rc = -1;
00167     RTENTRY *rte;
00168     RTENTRY *rtp;
00169     RTENTRY **rtpp;
00170 
00171     /*
00172      * Insert a new entry into the list, which is
00173      * sorted based on the mask. Host routes are
00174      * in front, default routes at the end and
00175      * networks in between.
00176      */
00177     rtp = rteList;
00178     rtpp = &rteList;
00179     while (rtp && rtp->rt_mask > mask) {
00180         rtpp = &rtp->rt_next;
00181         rtp = rtp->rt_next;
00182     }
00183     if ((rte = NutHeapAlloc(sizeof(RTENTRY))) != 0) {
00184         rte->rt_ip = ip & mask;
00185         rte->rt_mask = mask;
00186         rte->rt_gateway = gate;
00187         rte->rt_dev = dev;
00188         rte->rt_next = rtp;
00189         *rtpp = rte;
00190         rc = 0;
00191     }
00192     return rc;
00193 }
00194 
00202 int NutIpRouteDelAll(NUTDEVICE * dev)
00203 {
00204     RTENTRY **rtpp;
00205     RTENTRY *rte;
00206 
00207     rtpp = &rteList;
00208 
00209     while (*rtpp) {
00210         rte = *rtpp;
00211 
00212         if (rte->rt_dev == dev || dev == 0) {
00213             *rtpp = rte->rt_next;
00214             NutHeapFree(rte);
00215         } else
00216             *rtpp = (*rtpp)->rt_next;
00217     }
00218     return 0;
00219 }
00220 
00221 
00235 int NutIpRouteDel(uint32_t ip, uint32_t mask, uint32_t gate, NUTDEVICE * dev)
00236 {
00237     int rc = -1;
00238     RTENTRY **rtpp;
00239     RTENTRY *rte;
00240 
00241     for (rtpp = &rteList; *rtpp; *rtpp = (*rtpp)->rt_next) {
00242         rte = *rtpp;
00243 
00244         if (rte->rt_ip == ip && rte->rt_mask == mask && rte->rt_gateway == gate && rte->rt_dev == dev) {
00245             *rtpp = rte->rt_next;
00246             NutHeapFree(rte);
00247             rc = 0;
00248         }
00249     }
00250     return rc;
00251 }
00252 
00262 RTENTRY *NutIpRouteList(int *numEntries)
00263 {
00264     RTENTRY *rc;
00265     RTENTRY *rte;
00266 
00267     /* First count the number of entries. */
00268     *numEntries = 0;
00269     for (rte = rteList; rte; rte = rte->rt_next) {
00270         (*numEntries)++;
00271     }
00272 
00273     /* Allocate space for the result. */
00274     rc = (RTENTRY *) NutHeapAlloc(sizeof(RTENTRY) * (*numEntries));
00275 
00276     /* Fill in the result. */
00277     if (rc) {
00278         for (rte = rteList; rte; rc++, rte = rte->rt_next) {
00279             memcpy(rc, rte, sizeof(RTENTRY));
00280         }
00281     }
00282     else {
00283         *numEntries = 0;
00284     }
00285     return rc;
00286 }
00287 
00302 static RTENTRY *NutIpRouteRecQuery(uint32_t ip, uint32_t * gate, uint8_t level)
00303 {
00304     RTENTRY *rte = 0;
00305 
00306     if (level < 4) {
00307         for (rte = rteList; rte; rte = rte->rt_next) {
00308             if ((ip & rte->rt_mask) == rte->rt_ip)
00309                 break;
00310         }
00311         if (rte) {
00312             if (gate && rte->rt_gateway)
00313                 *gate = rte->rt_gateway;
00314             if (rte->rt_dev == 0)
00315                 rte = NutIpRouteRecQuery(rte->rt_gateway, gate, level + 1);
00316         }
00317     }
00318     return rte;
00319 }
00320 
00337 NUTDEVICE *NutIpRouteQuery(uint32_t ip, uint32_t * gate)
00338 {
00339     RTENTRY *rte;
00340 
00341     if (gate)
00342         *gate = 0;
00343     /* Return the first interface if the IP is broadcast. This solves the
00344        long existing problem with bad checksums on UDP broadcasts. Many
00345        thanks to Nicolas Moreau for this patch. */
00346     if (ip == 0xFFFFFFFF)
00347         rte = rteList;
00348     else
00349         rte = NutIpRouteRecQuery(ip, gate, 0);
00350 
00351     return rte ? rte->rt_dev : 0;
00352 }
00353 

© 2000-2007 by egnite Software GmbH - visit http://www.ethernut.de/