rtread_proc.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:4k
源码类别:

网络

开发平台:

Unix_Linux

  1. /*
  2.  * Kernel routing readup by /proc filesystem
  3.  * Copyright (C) 1997 Kunihiro Ishiguro
  4.  *
  5.  * This file is part of GNU Zebra.
  6.  *
  7.  * GNU Zebra is free software; you can redistribute it and/or modify it
  8.  * under the terms of the GNU General Public License as published by the
  9.  * Free Software Foundation; either version 2, or (at your option) any
  10.  * later version.
  11.  *
  12.  * GNU Zebra is distributed in the hope that it will be useful, but
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
  19.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  20.  * 02111-1307, USA.  
  21.  */
  22. #include <zebra.h>
  23. #include "prefix.h"
  24. #include "log.h"
  25. #include "if.h"
  26. #include "rib.h"
  27. /* Proc file system to read IPv4 routing table. */
  28. #ifndef _PATH_PROCNET_ROUTE
  29. #define _PATH_PROCNET_ROUTE      "/proc/net/route"
  30. #endif /* _PATH_PROCNET_ROUTE */
  31. /* Proc file system to read IPv6 routing table. */
  32. #ifndef _PATH_PROCNET_ROUTE6
  33. #define _PATH_PROCNET_ROUTE6     "/proc/net/ipv6_route"
  34. #endif /* _PATH_PROCNET_ROUTE6 */
  35. /* To read interface's name */
  36. #define INTERFACE_NAMSIZ 20  
  37. /* Reading buffer for one routing entry. */
  38. #define RT_BUFSIZ 1024
  39. /* Kernel routing table read up by /proc filesystem. */
  40. int
  41. proc_route_read ()
  42. {
  43.   FILE *fp;
  44.   char buf[RT_BUFSIZ];
  45.   char iface[INTERFACE_NAMSIZ], dest[9], gate[9], mask[9];
  46.   int flags, refcnt, use, metric, mtu, window, rtt;
  47.   /* Open /proc filesystem */
  48.   fp = fopen (_PATH_PROCNET_ROUTE, "r");
  49.   if (fp == NULL)
  50.     {
  51.       zlog_warn ("Can't open %s : %sn", _PATH_PROCNET_ROUTE, strerror (errno));
  52.       return -1;
  53.     }
  54.   
  55.   /* Drop first label line. */
  56.   fgets (buf, RT_BUFSIZ, fp);
  57.   while (fgets (buf, RT_BUFSIZ, fp) != NULL)
  58.     {
  59.       int n;
  60.       struct prefix_ipv4 p;
  61.       struct in_addr tmpmask;
  62.       struct in_addr gateway;
  63.       u_char zebra_flags = 0;
  64.       n = sscanf (buf, "%s %s %s %x %d %d %d %s %d %d %d",
  65.   iface, dest, gate, &flags, &refcnt, &use, &metric, 
  66.   mask, &mtu, &window, &rtt);
  67.       if (n != 11)
  68. {
  69.   zlog_warn ("can't read all of routing informationn");
  70.   continue;
  71. }
  72.       if (! (flags & RTF_UP))
  73. continue;
  74.       if (! (flags & RTF_GATEWAY))
  75. continue;
  76.       if (flags & RTF_DYNAMIC)
  77. zebra_flags |= ZEBRA_FLAG_SELFROUTE;
  78.       p.family = AF_INET;
  79.       sscanf (dest, "%lX", (unsigned long *)&p.prefix);
  80.       sscanf (mask, "%lX", (unsigned long *)&tmpmask);
  81.       p.prefixlen = ip_masklen (tmpmask);
  82.       sscanf (gate, "%lX", (unsigned long *)&gateway);
  83.       rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, zebra_flags, &p, &gateway, 0, 0, 0, 0);
  84.     }
  85.   return 0;
  86. }
  87. #ifdef HAVE_IPV6
  88. int
  89. proc_ipv6_route_read ()
  90. {
  91.   FILE *fp;
  92.   char buf [RT_BUFSIZ];
  93.   /* Open /proc filesystem */
  94.   fp = fopen (_PATH_PROCNET_ROUTE6, "r");
  95.   if (fp == NULL)
  96.     {
  97.       zlog_warn ("Can't open %s : %s", _PATH_PROCNET_ROUTE6, 
  98. strerror (errno));
  99.       return -1;
  100.     }
  101.   
  102.   /* There is no title line, so we don't drop first line.  */
  103.   while (fgets (buf, RT_BUFSIZ, fp) != NULL)
  104.     {
  105.       int n;
  106.       char dest[33], src[33], gate[33];
  107.       char iface[INTERFACE_NAMSIZ];
  108.       int dest_plen, src_plen;
  109.       int metric, use, refcnt, flags;
  110.       struct prefix_ipv6 p;
  111.       struct in6_addr gateway;
  112.       u_char zebra_flags = 0;
  113.       /* Linux 2.1.x write this information at net/ipv6/route.c
  114.          rt6_info_node () */
  115.       n = sscanf (buf, "%32s %02x %32s %02x %32s %08x %08x %08x %08x %s",
  116.   dest, &dest_plen, src, &src_plen, gate,
  117.   &metric, &use, &refcnt, &flags, iface);
  118.       if (n != 10)
  119. {
  120.   /* zlog_warn ("can't read all of routing information %dn%sn", n, buf); */
  121.   continue;
  122. }
  123.       if (! (flags & RTF_UP))
  124. continue;
  125.       if (! (flags & RTF_GATEWAY))
  126. continue;
  127.       if (flags & RTF_DYNAMIC)
  128. zebra_flags |= ZEBRA_FLAG_SELFROUTE;
  129.       p.family = AF_INET6;
  130.       str2in6_addr (dest, &p.prefix);
  131.       str2in6_addr (gate, &gateway);
  132.       p.prefixlen = dest_plen;
  133.       rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, zebra_flags, &p, &gateway, 0, 0);
  134.     }
  135.   return 0;
  136. }
  137. #endif /* HAVE_IPV6 */
  138. void
  139. route_read ()
  140. {
  141.   proc_route_read ();
  142. #ifdef HAVE_IPV6
  143.   proc_ipv6_route_read ();
  144. #endif /* HAVE_IPV6 */
  145. }