Annotation of embedaddon/quagga/zebra/rtread_proc.c, revision 1.1
1.1 ! misho 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:
! 23: #include <zebra.h>
! 24:
! 25: #include "prefix.h"
! 26: #include "log.h"
! 27: #include "if.h"
! 28: #include "rib.h"
! 29:
! 30: #include "zebra/zserv.h"
! 31: #include "zebra/rt.h"
! 32:
! 33: /* Proc file system to read IPv4 routing table. */
! 34: #ifndef _PATH_PROCNET_ROUTE
! 35: #define _PATH_PROCNET_ROUTE "/proc/net/route"
! 36: #endif /* _PATH_PROCNET_ROUTE */
! 37:
! 38: /* Proc file system to read IPv6 routing table. */
! 39: #ifndef _PATH_PROCNET_ROUTE6
! 40: #define _PATH_PROCNET_ROUTE6 "/proc/net/ipv6_route"
! 41: #endif /* _PATH_PROCNET_ROUTE6 */
! 42:
! 43: /* To read interface's name */
! 44: #define INTERFACE_NAMSIZ 20
! 45:
! 46: /* Reading buffer for one routing entry. */
! 47: #define RT_BUFSIZ 1024
! 48:
! 49: /* Kernel routing table read up by /proc filesystem. */
! 50: static int
! 51: proc_route_read (void)
! 52: {
! 53: FILE *fp;
! 54: char buf[RT_BUFSIZ];
! 55: char iface[INTERFACE_NAMSIZ], dest[9], gate[9], mask[9];
! 56: int flags, refcnt, use, metric, mtu, window, rtt;
! 57:
! 58: /* Open /proc filesystem */
! 59: fp = fopen (_PATH_PROCNET_ROUTE, "r");
! 60: if (fp == NULL)
! 61: {
! 62: zlog_warn ("Can't open %s : %s\n", _PATH_PROCNET_ROUTE, safe_strerror (errno));
! 63: return -1;
! 64: }
! 65:
! 66: /* Drop first label line. */
! 67: fgets (buf, RT_BUFSIZ, fp);
! 68:
! 69: while (fgets (buf, RT_BUFSIZ, fp) != NULL)
! 70: {
! 71: int n;
! 72: struct prefix_ipv4 p;
! 73: struct in_addr tmpmask;
! 74: struct in_addr gateway;
! 75: u_char zebra_flags = 0;
! 76:
! 77: n = sscanf (buf, "%s %s %s %x %d %d %d %s %d %d %d",
! 78: iface, dest, gate, &flags, &refcnt, &use, &metric,
! 79: mask, &mtu, &window, &rtt);
! 80: if (n != 11)
! 81: {
! 82: zlog_warn ("can't read all of routing information\n");
! 83: continue;
! 84: }
! 85: if (! (flags & RTF_UP))
! 86: continue;
! 87: if (! (flags & RTF_GATEWAY))
! 88: continue;
! 89:
! 90: if (flags & RTF_DYNAMIC)
! 91: zebra_flags |= ZEBRA_FLAG_SELFROUTE;
! 92:
! 93: p.family = AF_INET;
! 94: sscanf (dest, "%lX", (unsigned long *)&p.prefix);
! 95: sscanf (mask, "%lX", (unsigned long *)&tmpmask);
! 96: p.prefixlen = ip_masklen (tmpmask);
! 97: sscanf (gate, "%lX", (unsigned long *)&gateway);
! 98:
! 99: rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, zebra_flags, &p, &gateway, NULL, 0, 0, 0, 0);
! 100: }
! 101:
! 102: fclose (fp);
! 103: return 0;
! 104: }
! 105:
! 106: #ifdef HAVE_IPV6
! 107: static int
! 108: proc_ipv6_route_read ()
! 109: {
! 110: FILE *fp;
! 111: char buf [RT_BUFSIZ];
! 112:
! 113: /* Open /proc filesystem */
! 114: fp = fopen (_PATH_PROCNET_ROUTE6, "r");
! 115: if (fp == NULL)
! 116: {
! 117: zlog_warn ("Can't open %s : %s", _PATH_PROCNET_ROUTE6,
! 118: safe_strerror (errno));
! 119: return -1;
! 120: }
! 121:
! 122: /* There is no title line, so we don't drop first line. */
! 123: while (fgets (buf, RT_BUFSIZ, fp) != NULL)
! 124: {
! 125: int n;
! 126: char dest[33], src[33], gate[33];
! 127: char iface[INTERFACE_NAMSIZ];
! 128: int dest_plen, src_plen;
! 129: int metric, use, refcnt, flags;
! 130: struct prefix_ipv6 p;
! 131: struct in6_addr gateway;
! 132: u_char zebra_flags = 0;
! 133:
! 134: /* Linux 2.1.x write this information at net/ipv6/route.c
! 135: rt6_info_node () */
! 136: n = sscanf (buf, "%32s %02x %32s %02x %32s %08x %08x %08x %08x %s",
! 137: dest, &dest_plen, src, &src_plen, gate,
! 138: &metric, &use, &refcnt, &flags, iface);
! 139:
! 140: if (n != 10)
! 141: {
! 142: /* zlog_warn ("can't read all of routing information %d\n%s\n", n, buf); */
! 143: continue;
! 144: }
! 145:
! 146: if (! (flags & RTF_UP))
! 147: continue;
! 148: if (! (flags & RTF_GATEWAY))
! 149: continue;
! 150:
! 151: if (flags & RTF_DYNAMIC)
! 152: zebra_flags |= ZEBRA_FLAG_SELFROUTE;
! 153:
! 154: p.family = AF_INET6;
! 155: str2in6_addr (dest, &p.prefix);
! 156: str2in6_addr (gate, &gateway);
! 157: p.prefixlen = dest_plen;
! 158:
! 159: rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, zebra_flags, &p, &gateway, 0, 0,
! 160: metric, 0);
! 161: }
! 162:
! 163: fclose (fp);
! 164: return 0;
! 165: }
! 166: #endif /* HAVE_IPV6 */
! 167:
! 168: void
! 169: route_read (void)
! 170: {
! 171: proc_route_read ();
! 172: #ifdef HAVE_IPV6
! 173: proc_ipv6_route_read ();
! 174: #endif /* HAVE_IPV6 */
! 175: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>