]>
Commit | Line | Data |
---|---|---|
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 | 16 | extern struct zebra_privs_t zserv_privs; |
17 | ||
2b64873d | 18 | static const char proc_net_snmp[] = "/proc/net/snmp"; |
718e3744 | 19 | |
d62a17ae | 20 | static void dropline(FILE *fp) |
718e3744 | 21 | { |
2acf1ad1 | 22 | while (getc(fp) != '\n') |
d62a17ae | 23 | ; |
718e3744 | 24 | } |
25 | ||
d62a17ae | 26 | int 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 | 56 | static const char proc_ipv4_forwarding[] = "/proc/sys/net/ipv4/ip_forward"; |
718e3744 | 57 | |
d62a17ae | 58 | int 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 | 79 | int 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 |
100 | static const char proc_ipv6_forwarding[] = |
101 | "/proc/sys/net/ipv6/conf/all/forwarding"; | |
718e3744 | 102 | |
d62a17ae | 103 | int 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 | 126 | int 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 | 148 | int 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 */ |