aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/devinet.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/devinet.c')
-rw-r--r--net/ipv4/devinet.c66
1 files changed, 44 insertions, 22 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 9e2747aab252..d1dc0150647d 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -1263,6 +1263,28 @@ static void devinet_copy_dflt_conf(int i)
1263 read_unlock(&dev_base_lock); 1263 read_unlock(&dev_base_lock);
1264} 1264}
1265 1265
1266static void inet_forward_change(void)
1267{
1268 struct net_device *dev;
1269 int on = IPV4_DEVCONF_ALL(FORWARDING);
1270
1271 IPV4_DEVCONF_ALL(ACCEPT_REDIRECTS) = !on;
1272 IPV4_DEVCONF_DFLT(FORWARDING) = on;
1273
1274 read_lock(&dev_base_lock);
1275 for_each_netdev(&init_net, dev) {
1276 struct in_device *in_dev;
1277 rcu_read_lock();
1278 in_dev = __in_dev_get_rcu(dev);
1279 if (in_dev)
1280 IN_DEV_CONF_SET(in_dev, FORWARDING, on);
1281 rcu_read_unlock();
1282 }
1283 read_unlock(&dev_base_lock);
1284
1285 rt_cache_flush(0);
1286}
1287
1266static int devinet_conf_proc(ctl_table *ctl, int write, 1288static int devinet_conf_proc(ctl_table *ctl, int write,
1267 struct file* filp, void __user *buffer, 1289 struct file* filp, void __user *buffer,
1268 size_t *lenp, loff_t *ppos) 1290 size_t *lenp, loff_t *ppos)
@@ -1332,28 +1354,6 @@ static int devinet_conf_sysctl(ctl_table *table, int __user *name, int nlen,
1332 return 1; 1354 return 1;
1333} 1355}
1334 1356
1335void inet_forward_change(void)
1336{
1337 struct net_device *dev;
1338 int on = IPV4_DEVCONF_ALL(FORWARDING);
1339
1340 IPV4_DEVCONF_ALL(ACCEPT_REDIRECTS) = !on;
1341 IPV4_DEVCONF_DFLT(FORWARDING) = on;
1342
1343 read_lock(&dev_base_lock);
1344 for_each_netdev(&init_net, dev) {
1345 struct in_device *in_dev;
1346 rcu_read_lock();
1347 in_dev = __in_dev_get_rcu(dev);
1348 if (in_dev)
1349 IN_DEV_CONF_SET(in_dev, FORWARDING, on);
1350 rcu_read_unlock();
1351 }
1352 read_unlock(&dev_base_lock);
1353
1354 rt_cache_flush(0);
1355}
1356
1357static int devinet_sysctl_forward(ctl_table *ctl, int write, 1357static int devinet_sysctl_forward(ctl_table *ctl, int write,
1358 struct file* filp, void __user *buffer, 1358 struct file* filp, void __user *buffer,
1359 size_t *lenp, loff_t *ppos) 1359 size_t *lenp, loff_t *ppos)
@@ -1536,6 +1536,27 @@ static void devinet_sysctl_unregister(struct ipv4_devconf *p)
1536} 1536}
1537#endif 1537#endif
1538 1538
1539static struct ctl_table ctl_forward_entry[] = {
1540 {
1541 .ctl_name = NET_IPV4_FORWARD,
1542 .procname = "ip_forward",
1543 .data = &ipv4_devconf.data[
1544 NET_IPV4_CONF_FORWARDING - 1],
1545 .maxlen = sizeof(int),
1546 .mode = 0644,
1547 .proc_handler = devinet_sysctl_forward,
1548 .strategy = devinet_conf_sysctl,
1549 .extra1 = &ipv4_devconf,
1550 },
1551 { },
1552};
1553
1554static __initdata struct ctl_path net_ipv4_path[] = {
1555 { .procname = "net", .ctl_name = CTL_NET, },
1556 { .procname = "ipv4", .ctl_name = NET_IPV4, },
1557 { },
1558};
1559
1539void __init devinet_init(void) 1560void __init devinet_init(void)
1540{ 1561{
1541 register_gifconf(PF_INET, inet_gifconf); 1562 register_gifconf(PF_INET, inet_gifconf);
@@ -1549,6 +1570,7 @@ void __init devinet_init(void)
1549 &ipv4_devconf); 1570 &ipv4_devconf);
1550 __devinet_sysctl_register("default", NET_PROTO_CONF_DEFAULT, 1571 __devinet_sysctl_register("default", NET_PROTO_CONF_DEFAULT,
1551 &ipv4_devconf_dflt); 1572 &ipv4_devconf_dflt);
1573 register_sysctl_paths(net_ipv4_path, ctl_forward_entry);
1552#endif 1574#endif
1553} 1575}
1554 1576