flushroute.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* flushroute.c - DHCP library routing table access */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01a,12oct01,rae  made ______ -> ------ fix
  8. 01d,18apr97,spm  added conditional include DHCPC_DEBUG for displayed output
  9. 01c,07apr97,spm  code cleanup, modified comments
  10. 01b,27jan97,spm  brought into compliance with Wind River coding standards
  11. 01a,03oct96,spm  created by modifying WIDE Project DHCP Implementation
  12. */
  13. /*
  14. DESCRIPTION
  15. This library contains the code which clears the routing table for the 
  16. Wide project DHCP client, modified for vxWorks compatibility.
  17. INCLUDE_FILES: None
  18. */
  19. /*
  20.  * Copyright (c) 1983, 1989 The Regents of the University of California.
  21.  * All rights reserved.
  22.  *
  23.  * Redistribution and use in source and binary forms, with or without
  24.  * modification, are permitted provided that the following conditions
  25.  * are met:
  26.  * 1. Redistributions of source code must retain the above copyright
  27.  *    notice, this list of conditions and the following disclaimer.
  28.  * 2. Redistributions in binary form must reproduce the above copyright
  29.  *    notice, this list of conditions and the following disclaimer in the
  30.  *    documentation and/or other materials provided with the distribution.
  31.  * 3. All advertising materials mentioning features or use of this software
  32.  *    must display the following acknowledgement:
  33.  * This product includes software developed by the University of
  34.  * California, Berkeley and its contributors.
  35.  * 4. Neither the name of the University nor the names of its contributors
  36.  *    may be used to endorse or promote products derived from this software
  37.  *    without specific prior written permission.
  38.  *
  39.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  40.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  41.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  42.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  43.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  44.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  45.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  46.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  47.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  48.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  49.  * SUCH DAMAGE.
  50.  */
  51. /*
  52.  * Some part are modified by kei@cs.uec.ac.jp and tomy@sfc.wide.ad.jp.
  53.  *  
  54.  */
  55. /* includes */
  56. #include "vxWorks.h"
  57. #include <stdio.h>
  58. #include <stdlib.h>
  59. #include <sys/types.h>
  60. #include <sockLib.h>
  61. #include <ioLib.h>
  62. #include <sys/ioctl.h>
  63. #include <net/mbuf.h>
  64. #include <net/route.h>
  65. #include <netinet/in.h>
  66. #include <rpc/types.h>
  67. /*******************************************************************************
  68. *
  69. * flushroutes - clean the network routing table
  70. *
  71. * This routine removes all entries except the loopback entry from the routing 
  72. * table for the network interface. Two variations are provided. The first
  73. * uses the routing table as defined in the BSD 4.3 protocol stack and
  74. * the second uses the BSD 4.4 protocol stack.
  75. *
  76. * RETURNS: 0 if successful, or -1 on error.
  77. *
  78. * ERRNO: N/A
  79. *
  80. * NOMANUAL
  81. */
  82. #if BSD < 44
  83. int flushroutes (void)
  84.     {
  85.     int s = 0;
  86.     struct mbuf mb;
  87.     register struct rtentry *rt = NULL;
  88.     register struct mbuf *m = NULL;
  89.     int rthashsize = 0, i = 0, status = 0;
  90.     bzero ( (char *)&mb, sizeof (mb));
  91.     if ( (s = socket(AF_INET, SOCK_RAW, 0)) < 0) 
  92.         return(-1);
  93.     rthashsize = RTHASHSIZ;
  94.     /* Remove all host routing entries. */
  95.     for (i = 0; i < rthashsize; i++) 
  96.         for (m = rthost[i]; m != NULL; m = m->m_next)
  97.             {
  98.             rt = mtod (m, struct rtentry *);
  99.             if ( ( (struct sockaddr_in *)&rt->rt_dst)->sin_addr.s_addr != 
  100.                 INADDR_LOOPBACK) 
  101.         status = ioctl(s, SIOCDELRT, (int)(caddr_t)rt);
  102.             }
  103.     for (i = 0; i < rthashsize; i++) 
  104.         for (m = rtnet[i]; m != NULL; m = m->m_next)
  105.             {
  106.             rt = mtod (m, struct rtentry *);
  107.             if ( ( (struct sockaddr_in *)&rt->rt_dst)->sin_addr.s_addr != 
  108.                 INADDR_LOOPBACK) 
  109.         status = ioctl(s, SIOCDELRT, (int)(caddr_t)rt);
  110.             }
  111.     /* The WIDE implementation ignores the IOCTL results, so we do too. */
  112.     close (s);
  113.     return (0);
  114.     }
  115. #else
  116. /* externals */
  117. IMPORT int sysctl_rtable(int *, int, caddr_t, size_t *, caddr_t *, size_t);
  118. int flushroutes (void)
  119.     {
  120.     int s;
  121.     size_t needed;
  122.     int mib[3], rlen, seqno;
  123.     char *buf, *next, *lim;
  124.     register struct rt_msghdr *rtm;
  125.     if ( (s = socket (PF_ROUTE, SOCK_RAW, 0)) < 0) 
  126.         {
  127. #ifdef DHCPC_DEBUG
  128.         printf ("Warning: socket() error in flushroutes()");
  129. #endif
  130.         return (-1);
  131.         }
  132.     shutdown(s, 0);
  133.     mib[0] = AF_INET;
  134.     mib[1] = NET_RT_DUMP;
  135.     mib[2] = 0;             /* no flags */
  136.     /* Retrieve the size of the routing table and allocate needed memory. */
  137.     if (sysctl_rtable (mib, 3, NULL, &needed, NULL, 0) < 0) 
  138.         {
  139. #ifdef DHCPC_DEBUG
  140.         printf ("Warning: sysctl() error in flushroutes()");
  141. #endif
  142.         close (s);
  143.         return (-1);
  144.         }
  145.     if ( (buf = calloc(1, needed)) == NULL) 
  146.         {
  147. #ifdef DHCPC_DEBUG
  148.         printf ("Warning: calloc() error in flushroutes()");
  149. #endif
  150.         close (s);
  151.         return(-1);
  152.         }
  153.     /* Copy the current routing table to the allocated buffer. */
  154.     if (sysctl_rtable(mib, 3, buf, &needed, NULL, 0) < 0) 
  155.         {
  156. #ifdef DHCPC_DEBUG
  157.         printf("Warning: sysctl() error in flushroutes()");
  158. #endif
  159.         free(buf);
  160.         close(s);
  161.         return(-1);
  162.         }
  163.     lim = buf + needed;
  164.     seqno = 0;
  165.     /* Delete each route contained in the routing tables. */
  166.     for (next = buf; next < lim; next += rtm->rtm_msglen) 
  167.          {
  168.          rtm = (struct rt_msghdr *) next;
  169.          if ((rtm->rtm_flags & (RTF_GATEWAY | RTF_LLINFO)) == 0)
  170.              continue;
  171.          rtm->rtm_type = RTM_DELETE;
  172.          rtm->rtm_seq = seqno;
  173.          rlen = write(s, next, rtm->rtm_msglen);
  174.          if (rlen < (int)rtm->rtm_msglen) 
  175.              break;
  176.          seqno++;
  177.          }
  178.     free(buf);
  179.     close(s);
  180.     return(0);
  181.     }
  182. #endif    /* BSD 4.4 version */