]> git.proxmox.com Git - mirror_frr.git/blob - zebra/ipforward_sysctl.c
Merge remote-tracking branch 'origin/stable/2.0'
[mirror_frr.git] / zebra / ipforward_sysctl.c
1 /* IP forward control by sysctl function.
2 * Copyright (C) 1997, 1999 Kunihiro Ishiguro
3 *
4 * This file is part of GNU Zebra.
5 *
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
9 * later version.
10 *
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include <zebra.h>
22 #include "privs.h"
23 #include "zebra/ipforward.h"
24
25 #include "log.h"
26
27 #define MIB_SIZ 4
28
29 extern struct zebra_privs_t zserv_privs;
30
31 /* IPv4 forwarding control MIB. */
32 int mib[MIB_SIZ] =
33 {
34 CTL_NET,
35 PF_INET,
36 IPPROTO_IP,
37 IPCTL_FORWARDING
38 };
39
40 int
41 ipforward (void)
42 {
43 size_t len;
44 int ipforwarding = 0;
45
46 len = sizeof ipforwarding;
47 if (sysctl (mib, MIB_SIZ, &ipforwarding, &len, 0, 0) < 0)
48 {
49 zlog_warn ("Can't get ipforwarding value");
50 return -1;
51 }
52 return ipforwarding;
53 }
54
55 int
56 ipforward_on (void)
57 {
58 size_t len;
59 int ipforwarding = 1;
60
61 len = sizeof ipforwarding;
62 if (zserv_privs.change(ZPRIVS_RAISE))
63 zlog_err("Can't raise privileges");
64 if (sysctl (mib, MIB_SIZ, NULL, NULL, &ipforwarding, len) < 0)
65 {
66 if (zserv_privs.change(ZPRIVS_LOWER))
67 zlog_err("Can't lower privileges");
68 zlog_warn ("Can't set ipforwarding on");
69 return -1;
70 }
71 if (zserv_privs.change(ZPRIVS_LOWER))
72 zlog_err("Can't lower privileges");
73 return ipforwarding;
74 }
75
76 int
77 ipforward_off (void)
78 {
79 size_t len;
80 int ipforwarding = 0;
81
82 len = sizeof ipforwarding;
83 if (zserv_privs.change(ZPRIVS_RAISE))
84 zlog_err("Can't raise privileges");
85 if (sysctl (mib, MIB_SIZ, NULL, NULL, &ipforwarding, len) < 0)
86 {
87 if (zserv_privs.change(ZPRIVS_LOWER))
88 zlog_err("Can't lower privileges");
89 zlog_warn ("Can't set ipforwarding on");
90 return -1;
91 }
92 if (zserv_privs.change(ZPRIVS_LOWER))
93 zlog_err("Can't lower privileges");
94 return ipforwarding;
95 }
96
97 /* IPv6 forwarding control MIB. */
98 int mib_ipv6[MIB_SIZ] =
99 {
100 CTL_NET,
101 PF_INET6,
102 #if defined(KAME)
103 IPPROTO_IPV6,
104 IPV6CTL_FORWARDING
105 #else /* NOT KAME */
106 IPPROTO_IP,
107 IP6CTL_FORWARDING
108 #endif /* KAME */
109 };
110
111 int
112 ipforward_ipv6 (void)
113 {
114 size_t len;
115 int ip6forwarding = 0;
116
117 len = sizeof ip6forwarding;
118 if (zserv_privs.change(ZPRIVS_RAISE))
119 zlog_err("Can't raise privileges");
120 if (sysctl (mib_ipv6, MIB_SIZ, &ip6forwarding, &len, 0, 0) < 0)
121 {
122 if (zserv_privs.change(ZPRIVS_LOWER))
123 zlog_err("Can't lower privileges");
124 zlog_warn ("can't get ip6forwarding value");
125 return -1;
126 }
127 if (zserv_privs.change(ZPRIVS_LOWER))
128 zlog_err("Can't lower privileges");
129 return ip6forwarding;
130 }
131
132 int
133 ipforward_ipv6_on (void)
134 {
135 size_t len;
136 int ip6forwarding = 1;
137
138 len = sizeof ip6forwarding;
139 if (zserv_privs.change(ZPRIVS_RAISE))
140 zlog_err("Can't raise privileges");
141 if (sysctl (mib_ipv6, MIB_SIZ, NULL, NULL, &ip6forwarding, len) < 0)
142 {
143 if (zserv_privs.change(ZPRIVS_LOWER))
144 zlog_err("Can't lower privileges");
145 zlog_warn ("can't get ip6forwarding value");
146 return -1;
147 }
148 if (zserv_privs.change(ZPRIVS_LOWER))
149 zlog_err("Can't lower privileges");
150 return ip6forwarding;
151 }
152
153 int
154 ipforward_ipv6_off (void)
155 {
156 size_t len;
157 int ip6forwarding = 0;
158
159 len = sizeof ip6forwarding;
160 if (zserv_privs.change(ZPRIVS_RAISE))
161 zlog_err("Can't raise privileges");
162 if (sysctl (mib_ipv6, MIB_SIZ, NULL, NULL, &ip6forwarding, len) < 0)
163 {
164 if (zserv_privs.change(ZPRIVS_LOWER))
165 zlog_err("Can't lower privileges");
166 zlog_warn ("can't get ip6forwarding value");
167 return -1;
168 }
169 if (zserv_privs.change(ZPRIVS_LOWER))
170 zlog_err("Can't lower privileges");
171 return ip6forwarding;
172 }