]> git.proxmox.com Git - mirror_frr.git/blame - zebra/ipforward_proc.c
Merge pull request #13649 from donaldsharp/unlock_the_node_or_else
[mirror_frr.git] / zebra / ipforward_proc.c
CommitLineData
acddc0ed 1// SPDX-License-Identifier: GPL-2.0-or-later
718e3744 2/*
3 * Fetch ipforward value by reading /proc filesystem.
4 * Copyright (C) 1997 Kunihiro Ishiguro
718e3744 5 */
6
7#include <zebra.h>
8
ddfeb486
DL
9#ifdef GNU_LINUX
10
edd7c245 11#include "log.h"
12#include "privs.h"
13
a1ac18c4 14#include "zebra/ipforward.h"
15
edd7c245 16extern struct zebra_privs_t zserv_privs;
17
2b64873d 18static const char proc_net_snmp[] = "/proc/net/snmp";
718e3744 19
d62a17ae 20static void dropline(FILE *fp)
718e3744 21{
2acf1ad1 22 while (getc(fp) != '\n')
d62a17ae 23 ;
718e3744 24}
25
d62a17ae 26int ipforward(void)
718e3744 27{
116e176d 28 int ret = 0;
d62a17ae 29 FILE *fp;
30 int ipforwarding = 0;
31 char buf[10];
32
33 fp = fopen(proc_net_snmp, "r");
34
35 if (fp == NULL)
36 return -1;
37
38 /* We don't care about the first line. */
39 dropline(fp);
40
41 /* Get ip_statistics.IpForwarding :
42 1 => ip forwarding enabled
43 2 => ip forwarding off. */
44 if (fgets(buf, 6, fp))
116e176d 45 ret = sscanf(buf, "Ip: %d", &ipforwarding);
d62a17ae 46
47 fclose(fp);
48
116e176d 49 if (ret == 1 && ipforwarding == 1)
d62a17ae 50 return 1;
51
52 return 0;
718e3744 53}
54
55/* char proc_ipv4_forwarding[] = "/proc/sys/net/ipv4/conf/all/forwarding"; */
2b64873d 56static const char proc_ipv4_forwarding[] = "/proc/sys/net/ipv4/ip_forward";
718e3744 57
d62a17ae 58int ipforward_on(void)
718e3744 59{
d62a17ae 60 FILE *fp;
61
0cf6db21 62 frr_with_privs(&zserv_privs) {
718e3744 63
01b9e3fd 64 fp = fopen(proc_ipv4_forwarding, "w");
edd7c245 65
01b9e3fd
DL
66 if (fp == NULL) {
67 return -1;
68 }
718e3744 69
01b9e3fd 70 fprintf(fp, "1\n");
718e3744 71
01b9e3fd 72 fclose(fp);
718e3744 73
01b9e3fd 74 }
41d3fc96 75
d62a17ae 76 return ipforward();
718e3744 77}
78
d62a17ae 79int ipforward_off(void)
718e3744 80{
d62a17ae 81 FILE *fp;
718e3744 82
0cf6db21 83 frr_with_privs(&zserv_privs) {
edd7c245 84
01b9e3fd 85 fp = fopen(proc_ipv4_forwarding, "w");
edd7c245 86
01b9e3fd
DL
87 if (fp == NULL) {
88 return -1;
89 }
718e3744 90
01b9e3fd 91 fprintf(fp, "0\n");
718e3744 92
01b9e3fd 93 fclose(fp);
718e3744 94
01b9e3fd 95 }
41d3fc96 96
d62a17ae 97 return ipforward();
718e3744 98}
718e3744 99
2b64873d
DL
100static const char proc_ipv6_forwarding[] =
101 "/proc/sys/net/ipv6/conf/all/forwarding";
718e3744 102
d62a17ae 103int ipforward_ipv6(void)
718e3744 104{
116e176d 105 int ret = 0;
d62a17ae 106 FILE *fp;
107 char buf[5];
108 int ipforwarding = 0;
718e3744 109
d62a17ae 110 fp = fopen(proc_ipv6_forwarding, "r");
718e3744 111
d62a17ae 112 if (fp == NULL)
113 return -1;
718e3744 114
d62a17ae 115 if (fgets(buf, 2, fp))
116e176d 116 ret = sscanf(buf, "%d", &ipforwarding);
718e3744 117
d62a17ae 118 fclose(fp);
116e176d
DS
119
120 if (ret != 1)
121 return 0;
122
d62a17ae 123 return ipforwarding;
718e3744 124}
125
d62a17ae 126int ipforward_ipv6_on(void)
718e3744 127{
d62a17ae 128 FILE *fp;
718e3744 129
0cf6db21 130 frr_with_privs(&zserv_privs) {
edd7c245 131
01b9e3fd 132 fp = fopen(proc_ipv6_forwarding, "w");
edd7c245 133
01b9e3fd
DL
134 if (fp == NULL) {
135 return -1;
136 }
718e3744 137
01b9e3fd 138 fprintf(fp, "1\n");
718e3744 139
01b9e3fd 140 fclose(fp);
718e3744 141
01b9e3fd 142 }
41d3fc96 143
d62a17ae 144 return ipforward_ipv6();
718e3744 145}
146
56c1f7d8 147
d62a17ae 148int ipforward_ipv6_off(void)
718e3744 149{
d62a17ae 150 FILE *fp;
718e3744 151
0cf6db21 152 frr_with_privs(&zserv_privs) {
edd7c245 153
01b9e3fd 154 fp = fopen(proc_ipv6_forwarding, "w");
edd7c245 155
01b9e3fd
DL
156 if (fp == NULL) {
157 return -1;
158 }
718e3744 159
01b9e3fd 160 fprintf(fp, "0\n");
718e3744 161
01b9e3fd 162 fclose(fp);
718e3744 163
01b9e3fd 164 }
41d3fc96 165
d62a17ae 166 return ipforward_ipv6();
718e3744 167}
ddfeb486
DL
168
169#endif /* GNU_LINUX */