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