1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* IP forward control by sysctl function.
3 * Copyright (C) 1997, 1999 Kunihiro Ishiguro
8 #if !defined(GNU_LINUX)
11 #include "zebra/ipforward.h"
12 #include "zebra/zebra_errors.h"
15 #include "lib_errors.h"
19 extern struct zebra_privs_t zserv_privs
;
21 /* IPv4 forwarding control MIB. */
22 int mib
[MIB_SIZ
] = {CTL_NET
, PF_INET
, IPPROTO_IP
, IPCTL_FORWARDING
};
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");
38 int ipforward_on(void)
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");
54 int ipforward_off(void)
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");
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 */
79 int ipforward_ipv6(void)
82 int ip6forwarding
= 0;
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");
95 int ipforward_ipv6_on(void)
98 int ip6forwarding
= 1;
100 len
= sizeof(ip6forwarding
);
101 frr_with_privs(&zserv_privs
) {
102 if (sysctl(mib_ipv6
, MIB_SIZ
, NULL
, NULL
, &ip6forwarding
, len
)
104 flog_err_sys(EC_LIB_SYSTEM_CALL
,
105 "can't get ip6forwarding value");
109 return ip6forwarding
;
112 int ipforward_ipv6_off(void)
115 int ip6forwarding
= 0;
117 len
= sizeof(ip6forwarding
);
118 frr_with_privs(&zserv_privs
) {
119 if (sysctl(mib_ipv6
, MIB_SIZ
, NULL
, NULL
, &ip6forwarding
, len
)
121 flog_err_sys(EC_LIB_SYSTEM_CALL
,
122 "can't get ip6forwarding value");
126 return ip6forwarding
;
129 #endif /* !defined(GNU_LINUX) */