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