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$
00096  * Revision 1.8  2009/02/13 14:52:05  haraldkipp
00097  * Include memdebug.h for heap management debugging support.
00098  *
00099  * Revision 1.7  2009/02/06 15:40:29  haraldkipp
00100  * Using newly available strdup() and calloc().
00101  * Replaced NutHeap routines by standard malloc/free.
00102  * Replaced pointer value 0 by NULL.
00103  *
00104  * Revision 1.6  2008/08/11 07:00:32  haraldkipp
00105  * BSD types replaced by stdint types (feature request #1282721).
00106  *
00107  * Revision 1.5  2005/07/23 14:30:40  haraldkipp
00108  * Removed unnecessary critical sections and atomic inc-/decrements.
00109  * Fixed a bug in NutIpRouteList(), which filled the first entry only.
00110  * Corrected the comment about unavailabilty of removing routes.
00111  *
00112  * Revision 1.4  2005/04/30 16:42:42  chaac
00113  * Fixed bug in handling of NUTDEBUG. Added include for cfg/os.h. If NUTDEBUG
00114  * is defined in NutConf, it will make effect where it is used.
00115  *
00116  * Revision 1.3  2004/12/17 15:27:19  haraldkipp
00117  * Added Adam Pierce's routing management functions.
00118  *
00119  * Revision 1.2  2004/10/10 16:37:03  drsung
00120  * Detection of directed broadcasts to local network added.
00121  *
00122  * Revision 1.1.1.1  2003/05/09 14:41:38  haraldkipp
00123  * Initial using 3.2.1
00124  *
00125  * Revision 1.12  2003/03/31 14:53:28  harald
00126  * Prepare release 3.1
00127  *
00128  * Revision 1.11  2003/02/04 18:14:57  harald
00129  * Version 3 released
00130  *
00131  * Revision 1.10  2002/06/26 17:29:36  harald
00132  * First pre-release with 2.4 stack
00133  *
00134  */
00135 
00136 #include <cfg/os.h>
00137 #include <sys/heap.h>
00138 
00139 #include <net/if_var.h>
00140 #include <net/route.h>
00141 
00142 #include <stdlib.h>
00143 #include <string.h>
00144 #include <memdebug.h>
00145 
00146 #ifdef NUTDEBUG
00147 #include <sys/osdebug.h>
00148 #endif
00149 
00154 
00155 RTENTRY *rteList;           
00174 int NutIpRouteAdd(uint32_t ip, uint32_t mask, uint32_t gate, NUTDEVICE * dev)
00175 {
00176     int rc = -1;
00177     RTENTRY *rte;
00178     RTENTRY *rtp;
00179     RTENTRY **rtpp;
00180 
00181     /*
00182      * Insert a new entry into the list, which is
00183      * sorted based on the mask. Host routes are
00184      * in front, default routes at the end and
00185      * networks in between.
00186      */
00187     rtp = rteList;
00188     rtpp = &rteList;
00189     while (rtp && rtp->rt_mask > mask) {
00190         rtpp = &rtp->rt_next;
00191         rtp = rtp->rt_next;
00192     }
00193     if ((rte = malloc(sizeof(RTENTRY))) != NULL) {
00194         rte->rt_ip = ip & mask;
00195         rte->rt_mask = mask;
00196         rte->rt_gateway = gate;
00197         rte->rt_dev = dev;
00198         rte->rt_next = rtp;
00199         *rtpp = rte;
00200         rc = 0;
00201     }
00202     return rc;
00203 }
00204 
00212 int NutIpRouteDelAll(NUTDEVICE * dev)
00213 {
00214     RTENTRY **rtpp;
00215     RTENTRY *rte;
00216 
00217     rtpp = &rteList;
00218 
00219     while (*rtpp) {
00220         rte = *rtpp;
00221 
00222         if (rte->rt_dev == dev || dev == 0) {
00223             *rtpp = rte->rt_next;
00224             free(rte);
00225         } else
00226             *rtpp = (*rtpp)->rt_next;
00227     }
00228     return 0;
00229 }
00230 
00231 
00245 int NutIpRouteDel(uint32_t ip, uint32_t mask, uint32_t gate, NUTDEVICE * dev)
00246 {
00247     int rc = -1;
00248     RTENTRY **rtpp;
00249     RTENTRY *rte;
00250 
00251     for (rtpp = &rteList; *rtpp; *rtpp = (*rtpp)->rt_next) {
00252         rte = *rtpp;
00253 
00254         if (rte->rt_ip == ip && rte->rt_mask == mask && rte->rt_gateway == gate && rte->rt_dev == dev) {
00255             *rtpp = rte->rt_next;
00256             free(rte);
00257             rc = 0;
00258         }
00259     }
00260     return rc;
00261 }
00262 
00272 RTENTRY *NutIpRouteList(int *numEntries)
00273 {
00274     RTENTRY *rc;
00275     RTENTRY *rte;
00276 
00277     /* First count the number of entries. */
00278     *numEntries = 0;
00279     for (rte = rteList; rte; rte = rte->rt_next) {
00280         (*numEntries)++;
00281     }
00282 
00283     /* Allocate space for the result. */
00284     rc = (RTENTRY *) malloc(sizeof(RTENTRY) * (*numEntries));
00285 
00286     /* Fill in the result. */
00287     if (rc) {
00288         for (rte = rteList; rte; rc++, rte = rte->rt_next) {
00289             memcpy(rc, rte, sizeof(RTENTRY));
00290         }
00291     }
00292     else {
00293         *numEntries = 0;
00294     }
00295     return rc;
00296 }
00297 
00312 static RTENTRY *NutIpRouteRecQuery(uint32_t ip, uint32_t * gate, uint8_t level)
00313 {
00314     RTENTRY *rte = 0;
00315 
00316     if (level < 4) {
00317         for (rte = rteList; rte; rte = rte->rt_next) {
00318             if ((ip & rte->rt_mask) == rte->rt_ip)
00319                 break;
00320         }
00321         if (rte) {
00322             if (gate && rte->rt_gateway)
00323                 *gate = rte->rt_gateway;
00324             if (rte->rt_dev == 0)
00325                 rte = NutIpRouteRecQuery(rte->rt_gateway, gate, level + 1);
00326         }
00327     }
00328     return rte;
00329 }
00330 
00347 NUTDEVICE *NutIpRouteQuery(uint32_t ip, uint32_t * gate)
00348 {
00349     RTENTRY *rte;
00350 
00351     if (gate)
00352         *gate = 0;
00353     /* Return the first interface if the IP is broadcast. This solves the
00354        long existing problem with bad checksums on UDP broadcasts. Many
00355        thanks to Nicolas Moreau for this patch. */
00356     if (ip == 0xFFFFFFFF)
00357         rte = rteList;
00358     else
00359         rte = NutIpRouteRecQuery(ip, gate, 0);
00360 
00361     return rte ? rte->rt_dev : 0;
00362 }
00363 

© 2000-2010 by contributors - visit http://www.ethernut.de/