Annotation of embedaddon/quagga/zebra/if_sysctl.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Get interface's address and mask information by sysctl() function.
3: * Copyright (C) 1997, 98 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 "if.h"
26: #include "sockunion.h"
27: #include "prefix.h"
28: #include "connected.h"
29: #include "memory.h"
30: #include "ioctl.h"
31: #include "log.h"
32:
33: #include "zebra/rt.h"
34: #include "zebra/kernel_socket.h"
35:
36: void
37: ifstat_update_sysctl (void)
38: {
39: caddr_t ref, buf, end;
40: size_t bufsiz;
41: struct if_msghdr *ifm;
42: struct interface *ifp;
43:
44: #define MIBSIZ 6
45: int mib[MIBSIZ] =
46: {
47: CTL_NET,
48: PF_ROUTE,
49: 0,
50: 0, /* AF_INET & AF_INET6 */
51: NET_RT_IFLIST,
52: 0
53: };
54:
55: /* Query buffer size. */
56: if (sysctl (mib, MIBSIZ, NULL, &bufsiz, NULL, 0) < 0)
57: {
58: zlog_warn ("sysctl() error by %s", safe_strerror (errno));
59: return;
60: }
61:
62: /* We free this memory at the end of this function. */
63: ref = buf = XMALLOC (MTYPE_TMP, bufsiz);
64:
65: /* Fetch interface informations into allocated buffer. */
66: if (sysctl (mib, MIBSIZ, buf, &bufsiz, NULL, 0) < 0)
67: {
68: zlog (NULL, LOG_WARNING, "sysctl error by %s", safe_strerror (errno));
69: return;
70: }
71:
72: /* Parse both interfaces and addresses. */
73: for (end = buf + bufsiz; buf < end; buf += ifm->ifm_msglen)
74: {
75: ifm = (struct if_msghdr *) buf;
76: if (ifm->ifm_type == RTM_IFINFO)
77: {
78: ifp = if_lookup_by_index (ifm->ifm_index);
79: if (ifp)
80: ifp->stats = ifm->ifm_data;
81: }
82: }
83:
84: /* Free sysctl buffer. */
85: XFREE (MTYPE_TMP, ref);
86:
87: return;
88: }
89:
90: /* Interface listing up function using sysctl(). */
91: void
92: interface_list ()
93: {
94: caddr_t ref, buf, end;
95: size_t bufsiz;
96: struct if_msghdr *ifm;
97:
98: #define MIBSIZ 6
99: int mib[MIBSIZ] =
100: {
101: CTL_NET,
102: PF_ROUTE,
103: 0,
104: 0, /* AF_INET & AF_INET6 */
105: NET_RT_IFLIST,
106: 0
107: };
108:
109: /* Query buffer size. */
110: if (sysctl (mib, MIBSIZ, NULL, &bufsiz, NULL, 0) < 0)
111: {
112: zlog (NULL, LOG_WARNING, "sysctl() error by %s", safe_strerror (errno));
113: return;
114: }
115:
116: /* We free this memory at the end of this function. */
117: ref = buf = XMALLOC (MTYPE_TMP, bufsiz);
118:
119: /* Fetch interface informations into allocated buffer. */
120: if (sysctl (mib, MIBSIZ, buf, &bufsiz, NULL, 0) < 0)
121: {
122: zlog (NULL, LOG_WARNING, "sysctl error by %s", safe_strerror (errno));
123: return;
124: }
125:
126: /* Parse both interfaces and addresses. */
127: for (end = buf + bufsiz; buf < end; buf += ifm->ifm_msglen)
128: {
129: ifm = (struct if_msghdr *) buf;
130:
131: switch (ifm->ifm_type)
132: {
133: case RTM_IFINFO:
134: ifm_read (ifm);
135: break;
136: case RTM_NEWADDR:
137: ifam_read ((struct ifa_msghdr *) ifm);
138: break;
139: default:
140: zlog_info ("interfaces_list(): unexpected message type");
141: XFREE (MTYPE_TMP, ref);
142: return;
143: break;
144: }
145: }
146:
147: /* Free sysctl buffer. */
148: XFREE (MTYPE_TMP, ref);
149: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>