]> git.proxmox.com Git - mirror_frr.git/blob - zebra/ipforward_sysctl.c
Merge pull request #12816 from gpnaveen/stc_rte_err_msg
[mirror_frr.git] / zebra / ipforward_sysctl.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* IP forward control by sysctl function.
3 * Copyright (C) 1997, 1999 Kunihiro Ishiguro
4 */
5
6 #include <zebra.h>
7
8 #if !defined(GNU_LINUX)
9
10 #include "privs.h"
11 #include "zebra/ipforward.h"
12 #include "zebra/zebra_errors.h"
13
14 #include "log.h"
15 #include "lib_errors.h"
16
17 #define MIB_SIZ 4
18
19 extern struct zebra_privs_t zserv_privs;
20
21 /* IPv4 forwarding control MIB. */
22 int mib[MIB_SIZ] = {CTL_NET, PF_INET, IPPROTO_IP, IPCTL_FORWARDING};
23
24 int ipforward(void)
25 {
26 size_t len;
27 int ipforwarding = 0;
28
29 len = sizeof(ipforwarding);
30 if (sysctl(mib, MIB_SIZ, &ipforwarding, &len, 0, 0) < 0) {
31 flog_err_sys(EC_LIB_SYSTEM_CALL,
32 "Can't get ipforwarding value");
33 return -1;
34 }
35 return ipforwarding;
36 }
37
38 int ipforward_on(void)
39 {
40 size_t len;
41 int ipforwarding = 1;
42
43 len = sizeof(ipforwarding);
44 frr_with_privs(&zserv_privs) {
45 if (sysctl(mib, MIB_SIZ, NULL, NULL, &ipforwarding, len) < 0) {
46 flog_err_sys(EC_LIB_SYSTEM_CALL,
47 "Can't set ipforwarding on");
48 return -1;
49 }
50 }
51 return ipforwarding;
52 }
53
54 int ipforward_off(void)
55 {
56 size_t len;
57 int ipforwarding = 0;
58
59 len = sizeof(ipforwarding);
60 frr_with_privs(&zserv_privs) {
61 if (sysctl(mib, MIB_SIZ, NULL, NULL, &ipforwarding, len) < 0) {
62 flog_err_sys(EC_LIB_SYSTEM_CALL,
63 "Can't set ipforwarding on");
64 return -1;
65 }
66 }
67 return ipforwarding;
68 }
69
70 /* IPv6 forwarding control MIB. */
71 int mib_ipv6[MIB_SIZ] = {CTL_NET, PF_INET6,
72 #if defined(BSD_V6_SYSCTL)
73 IPPROTO_IPV6, IPV6CTL_FORWARDING
74 #else /* NOT BSD_V6_SYSCTL */
75 IPPROTO_IP, IP6CTL_FORWARDING
76 #endif /* BSD_V6_SYSCTL */
77 };
78
79 int ipforward_ipv6(void)
80 {
81 size_t len;
82 int ip6forwarding = 0;
83
84 len = sizeof(ip6forwarding);
85 frr_with_privs(&zserv_privs) {
86 if (sysctl(mib_ipv6, MIB_SIZ, &ip6forwarding, &len, 0, 0) < 0) {
87 flog_err_sys(EC_LIB_SYSTEM_CALL,
88 "can't get ip6forwarding value");
89 return -1;
90 }
91 }
92 return ip6forwarding;
93 }
94
95 int ipforward_ipv6_on(void)
96 {
97 size_t len;
98 int ip6forwarding = 1;
99
100 len = sizeof(ip6forwarding);
101 frr_with_privs(&zserv_privs) {
102 if (sysctl(mib_ipv6, MIB_SIZ, NULL, NULL, &ip6forwarding, len)
103 < 0) {
104 flog_err_sys(EC_LIB_SYSTEM_CALL,
105 "can't get ip6forwarding value");
106 return -1;
107 }
108 }
109 return ip6forwarding;
110 }
111
112 int ipforward_ipv6_off(void)
113 {
114 size_t len;
115 int ip6forwarding = 0;
116
117 len = sizeof(ip6forwarding);
118 frr_with_privs(&zserv_privs) {
119 if (sysctl(mib_ipv6, MIB_SIZ, NULL, NULL, &ip6forwarding, len)
120 < 0) {
121 flog_err_sys(EC_LIB_SYSTEM_CALL,
122 "can't get ip6forwarding value");
123 return -1;
124 }
125 }
126 return ip6forwarding;
127 }
128
129 #endif /* !defined(GNU_LINUX) */