]>
Commit | Line | Data |
---|---|---|
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 | 19 | extern struct zebra_privs_t zserv_privs; |
20 | ||
718e3744 | 21 | /* IPv4 forwarding control MIB. */ |
d62a17ae | 22 | int mib[MIB_SIZ] = {CTL_NET, PF_INET, IPPROTO_IP, IPCTL_FORWARDING}; |
718e3744 | 23 | |
d62a17ae | 24 | int 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 | 38 | int 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 | 54 | int 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 | 71 | int 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 | 79 | int 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 | 95 | int 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 | 112 | int 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) */ |