Annotation of embedaddon/quagga/zebra/rtread_proc.c, revision 1.1.1.2
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:
1.1.1.2 ! misho 99: rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, zebra_flags, &p, &gateway, NULL, 0, 0, 0, 0, SAFI_UNICAST);
1.1 misho 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>