2023-02-08 13:17:09 +01:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2002-12-13 21:15:29 +01:00
|
|
|
/* IP forward control by sysctl function.
|
|
|
|
* Copyright (C) 1997, 1999 Kunihiro Ishiguro
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <zebra.h>
|
2017-07-26 19:49:15 +02:00
|
|
|
|
2020-09-09 05:59:18 +02:00
|
|
|
#if !defined(GNU_LINUX)
|
2017-07-26 19:49:15 +02:00
|
|
|
|
2003-06-04 15:59:38 +02:00
|
|
|
#include "privs.h"
|
2005-06-28 19:17:12 +02:00
|
|
|
#include "zebra/ipforward.h"
|
2018-08-16 22:10:32 +02:00
|
|
|
#include "zebra/zebra_errors.h"
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
#include "log.h"
|
2018-06-14 16:38:40 +02:00
|
|
|
#include "lib_errors.h"
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
#define MIB_SIZ 4
|
|
|
|
|
2003-06-04 15:59:38 +02:00
|
|
|
extern struct zebra_privs_t zserv_privs;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* IPv4 forwarding control MIB. */
|
|
|
|
int mib[MIB_SIZ] = {CTL_NET, PF_INET, IPPROTO_IP, IPCTL_FORWARDING};
|
|
|
|
|
2005-06-28 19:17:12 +02:00
|
|
|
int ipforward(void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2004-08-26 15:24:00 +02:00
|
|
|
size_t len;
|
2002-12-13 21:15:29 +01:00
|
|
|
int ipforwarding = 0;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2020-03-08 20:43:26 +01:00
|
|
|
len = sizeof(ipforwarding);
|
2002-12-13 21:15:29 +01:00
|
|
|
if (sysctl(mib, MIB_SIZ, &ipforwarding, &len, 0, 0) < 0) {
|
2018-09-13 21:38:57 +02:00
|
|
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
|
|
|
"Can't get ipforwarding value");
|
2002-12-13 21:15:29 +01:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return ipforwarding;
|
|
|
|
}
|
|
|
|
|
2005-06-28 19:17:12 +02:00
|
|
|
int ipforward_on(void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2004-08-26 15:24:00 +02:00
|
|
|
size_t len;
|
2002-12-13 21:15:29 +01:00
|
|
|
int ipforwarding = 1;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2020-03-08 20:43:26 +01:00
|
|
|
len = sizeof(ipforwarding);
|
2019-08-13 15:47:23 +02:00
|
|
|
frr_with_privs(&zserv_privs) {
|
2018-08-10 18:36:43 +02:00
|
|
|
if (sysctl(mib, MIB_SIZ, NULL, NULL, &ipforwarding, len) < 0) {
|
2018-09-13 21:34:28 +02:00
|
|
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
2018-08-16 22:10:32 +02:00
|
|
|
"Can't set ipforwarding on");
|
2018-08-10 18:36:43 +02:00
|
|
|
return -1;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return ipforwarding;
|
|
|
|
}
|
|
|
|
|
2005-06-28 19:17:12 +02:00
|
|
|
int ipforward_off(void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2004-08-26 15:24:00 +02:00
|
|
|
size_t len;
|
2002-12-13 21:15:29 +01:00
|
|
|
int ipforwarding = 0;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2020-03-08 20:43:26 +01:00
|
|
|
len = sizeof(ipforwarding);
|
2019-08-13 15:47:23 +02:00
|
|
|
frr_with_privs(&zserv_privs) {
|
2018-08-10 18:36:43 +02:00
|
|
|
if (sysctl(mib, MIB_SIZ, NULL, NULL, &ipforwarding, len) < 0) {
|
2018-09-13 21:34:28 +02:00
|
|
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
2018-08-16 22:10:32 +02:00
|
|
|
"Can't set ipforwarding on");
|
2018-08-10 18:36:43 +02:00
|
|
|
return -1;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return ipforwarding;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* IPv6 forwarding control MIB. */
|
|
|
|
int mib_ipv6[MIB_SIZ] = {CTL_NET, PF_INET6,
|
2017-12-04 15:29:08 +01:00
|
|
|
#if defined(BSD_V6_SYSCTL)
|
2002-12-13 21:15:29 +01:00
|
|
|
IPPROTO_IPV6, IPV6CTL_FORWARDING
|
2017-12-04 15:29:08 +01:00
|
|
|
#else /* NOT BSD_V6_SYSCTL */
|
2002-12-13 21:15:29 +01:00
|
|
|
IPPROTO_IP, IP6CTL_FORWARDING
|
2017-12-04 15:29:08 +01:00
|
|
|
#endif /* BSD_V6_SYSCTL */
|
2002-12-13 21:15:29 +01:00
|
|
|
};
|
|
|
|
|
2005-06-28 19:17:12 +02:00
|
|
|
int ipforward_ipv6(void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2004-08-26 15:24:00 +02:00
|
|
|
size_t len;
|
2002-12-13 21:15:29 +01:00
|
|
|
int ip6forwarding = 0;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2020-03-08 20:43:26 +01:00
|
|
|
len = sizeof(ip6forwarding);
|
2019-08-13 15:47:23 +02:00
|
|
|
frr_with_privs(&zserv_privs) {
|
2018-08-10 18:36:43 +02:00
|
|
|
if (sysctl(mib_ipv6, MIB_SIZ, &ip6forwarding, &len, 0, 0) < 0) {
|
2018-09-13 21:34:28 +02:00
|
|
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
2018-08-16 22:10:32 +02:00
|
|
|
"can't get ip6forwarding value");
|
2018-08-10 18:36:43 +02:00
|
|
|
return -1;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return ip6forwarding;
|
|
|
|
}
|
|
|
|
|
2005-06-28 19:17:12 +02:00
|
|
|
int ipforward_ipv6_on(void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2004-08-26 15:24:00 +02:00
|
|
|
size_t len;
|
2002-12-13 21:15:29 +01:00
|
|
|
int ip6forwarding = 1;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2020-03-08 20:43:26 +01:00
|
|
|
len = sizeof(ip6forwarding);
|
2019-08-13 15:47:23 +02:00
|
|
|
frr_with_privs(&zserv_privs) {
|
2018-08-13 19:52:57 +02:00
|
|
|
if (sysctl(mib_ipv6, MIB_SIZ, NULL, NULL, &ip6forwarding, len)
|
|
|
|
< 0) {
|
2018-09-13 21:34:28 +02:00
|
|
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
2018-08-16 22:10:32 +02:00
|
|
|
"can't get ip6forwarding value");
|
2018-08-10 18:36:43 +02:00
|
|
|
return -1;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return ip6forwarding;
|
|
|
|
}
|
|
|
|
|
2005-06-28 19:17:12 +02:00
|
|
|
int ipforward_ipv6_off(void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2004-08-26 15:24:00 +02:00
|
|
|
size_t len;
|
2002-12-13 21:15:29 +01:00
|
|
|
int ip6forwarding = 0;
|
2017-07-17 14:03:14 +02:00
|
|
|
|
2020-03-08 20:43:26 +01:00
|
|
|
len = sizeof(ip6forwarding);
|
2019-08-13 15:47:23 +02:00
|
|
|
frr_with_privs(&zserv_privs) {
|
2018-08-13 19:52:57 +02:00
|
|
|
if (sysctl(mib_ipv6, MIB_SIZ, NULL, NULL, &ip6forwarding, len)
|
|
|
|
< 0) {
|
2018-09-13 21:34:28 +02:00
|
|
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
2018-08-16 22:10:32 +02:00
|
|
|
"can't get ip6forwarding value");
|
2018-08-10 18:36:43 +02:00
|
|
|
return -1;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return ip6forwarding;
|
|
|
|
}
|
2017-07-26 19:49:15 +02:00
|
|
|
|
2020-09-09 05:59:18 +02:00
|
|
|
#endif /* !defined(GNU_LINUX) */
|