diff options
Diffstat (limited to 'net/ipv4/devinet.c')
-rw-r--r-- | net/ipv4/devinet.c | 66 |
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 | ||
1266 | static 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 | |||
1266 | static int devinet_conf_proc(ctl_table *ctl, int write, | 1288 | static 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 | ||
1335 | void 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 | |||
1357 | static int devinet_sysctl_forward(ctl_table *ctl, int write, | 1357 | static 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 | ||
1539 | static 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 | |||
1554 | static __initdata struct ctl_path net_ipv4_path[] = { | ||
1555 | { .procname = "net", .ctl_name = CTL_NET, }, | ||
1556 | { .procname = "ipv4", .ctl_name = NET_IPV4, }, | ||
1557 | { }, | ||
1558 | }; | ||
1559 | |||
1539 | void __init devinet_init(void) | 1560 | void __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 | ||