diff options
Diffstat (limited to 'net/ipv4/devinet.c')
-rw-r--r-- | net/ipv4/devinet.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 040c4f05b653..51ca946e3392 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
@@ -64,20 +64,20 @@ | |||
64 | 64 | ||
65 | static struct ipv4_devconf ipv4_devconf = { | 65 | static struct ipv4_devconf ipv4_devconf = { |
66 | .data = { | 66 | .data = { |
67 | [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, | 67 | [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1, |
68 | [NET_IPV4_CONF_SEND_REDIRECTS - 1] = 1, | 68 | [IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1, |
69 | [NET_IPV4_CONF_SECURE_REDIRECTS - 1] = 1, | 69 | [IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1, |
70 | [NET_IPV4_CONF_SHARED_MEDIA - 1] = 1, | 70 | [IPV4_DEVCONF_SHARED_MEDIA - 1] = 1, |
71 | }, | 71 | }, |
72 | }; | 72 | }; |
73 | 73 | ||
74 | static struct ipv4_devconf ipv4_devconf_dflt = { | 74 | static struct ipv4_devconf ipv4_devconf_dflt = { |
75 | .data = { | 75 | .data = { |
76 | [NET_IPV4_CONF_ACCEPT_REDIRECTS - 1] = 1, | 76 | [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1, |
77 | [NET_IPV4_CONF_SEND_REDIRECTS - 1] = 1, | 77 | [IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1, |
78 | [NET_IPV4_CONF_SECURE_REDIRECTS - 1] = 1, | 78 | [IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1, |
79 | [NET_IPV4_CONF_SHARED_MEDIA - 1] = 1, | 79 | [IPV4_DEVCONF_SHARED_MEDIA - 1] = 1, |
80 | [NET_IPV4_CONF_ACCEPT_SOURCE_ROUTE - 1] = 1, | 80 | [IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE - 1] = 1, |
81 | }, | 81 | }, |
82 | }; | 82 | }; |
83 | 83 | ||
@@ -1317,14 +1317,19 @@ static int devinet_sysctl_forward(ctl_table *ctl, int write, | |||
1317 | { | 1317 | { |
1318 | int *valp = ctl->data; | 1318 | int *valp = ctl->data; |
1319 | int val = *valp; | 1319 | int val = *valp; |
1320 | loff_t pos = *ppos; | ||
1320 | int ret = proc_dointvec(ctl, write, buffer, lenp, ppos); | 1321 | int ret = proc_dointvec(ctl, write, buffer, lenp, ppos); |
1321 | 1322 | ||
1322 | if (write && *valp != val) { | 1323 | if (write && *valp != val) { |
1323 | struct net *net = ctl->extra2; | 1324 | struct net *net = ctl->extra2; |
1324 | 1325 | ||
1325 | if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) { | 1326 | if (valp != &IPV4_DEVCONF_DFLT(net, FORWARDING)) { |
1326 | if (!rtnl_trylock()) | 1327 | if (!rtnl_trylock()) { |
1328 | /* Restore the original values before restarting */ | ||
1329 | *valp = val; | ||
1330 | *ppos = pos; | ||
1327 | return restart_syscall(); | 1331 | return restart_syscall(); |
1332 | } | ||
1328 | if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) { | 1333 | if (valp == &IPV4_DEVCONF_ALL(net, FORWARDING)) { |
1329 | inet_forward_change(net); | 1334 | inet_forward_change(net); |
1330 | } else if (*valp) { | 1335 | } else if (*valp) { |
@@ -1360,7 +1365,7 @@ int ipv4_doint_and_flush(ctl_table *ctl, int write, | |||
1360 | { \ | 1365 | { \ |
1361 | .procname = name, \ | 1366 | .procname = name, \ |
1362 | .data = ipv4_devconf.data + \ | 1367 | .data = ipv4_devconf.data + \ |
1363 | NET_IPV4_CONF_ ## attr - 1, \ | 1368 | IPV4_DEVCONF_ ## attr - 1, \ |
1364 | .maxlen = sizeof(int), \ | 1369 | .maxlen = sizeof(int), \ |
1365 | .mode = mval, \ | 1370 | .mode = mval, \ |
1366 | .proc_handler = proc, \ | 1371 | .proc_handler = proc, \ |
@@ -1381,7 +1386,7 @@ int ipv4_doint_and_flush(ctl_table *ctl, int write, | |||
1381 | 1386 | ||
1382 | static struct devinet_sysctl_table { | 1387 | static struct devinet_sysctl_table { |
1383 | struct ctl_table_header *sysctl_header; | 1388 | struct ctl_table_header *sysctl_header; |
1384 | struct ctl_table devinet_vars[__NET_IPV4_CONF_MAX]; | 1389 | struct ctl_table devinet_vars[__IPV4_DEVCONF_MAX]; |
1385 | char *dev_name; | 1390 | char *dev_name; |
1386 | } devinet_sysctl = { | 1391 | } devinet_sysctl = { |
1387 | .devinet_vars = { | 1392 | .devinet_vars = { |
@@ -1408,6 +1413,7 @@ static struct devinet_sysctl_table { | |||
1408 | DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE, "arp_ignore"), | 1413 | DEVINET_SYSCTL_RW_ENTRY(ARP_IGNORE, "arp_ignore"), |
1409 | DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT, "arp_accept"), | 1414 | DEVINET_SYSCTL_RW_ENTRY(ARP_ACCEPT, "arp_accept"), |
1410 | DEVINET_SYSCTL_RW_ENTRY(ARP_NOTIFY, "arp_notify"), | 1415 | DEVINET_SYSCTL_RW_ENTRY(ARP_NOTIFY, "arp_notify"), |
1416 | DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP_PVLAN, "proxy_arp_pvlan"), | ||
1411 | 1417 | ||
1412 | DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM, "disable_xfrm"), | 1418 | DEVINET_SYSCTL_FLUSHING_ENTRY(NOXFRM, "disable_xfrm"), |
1413 | DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY, "disable_policy"), | 1419 | DEVINET_SYSCTL_FLUSHING_ENTRY(NOPOLICY, "disable_policy"), |
@@ -1486,8 +1492,7 @@ static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf) | |||
1486 | 1492 | ||
1487 | static void devinet_sysctl_register(struct in_device *idev) | 1493 | static void devinet_sysctl_register(struct in_device *idev) |
1488 | { | 1494 | { |
1489 | neigh_sysctl_register(idev->dev, idev->arp_parms, NET_IPV4, | 1495 | neigh_sysctl_register(idev->dev, idev->arp_parms, "ipv4", NULL); |
1490 | NET_IPV4_NEIGH, "ipv4", NULL); | ||
1491 | __devinet_sysctl_register(dev_net(idev->dev), idev->dev->name, | 1496 | __devinet_sysctl_register(dev_net(idev->dev), idev->dev->name, |
1492 | &idev->cnf); | 1497 | &idev->cnf); |
1493 | } | 1498 | } |
@@ -1502,7 +1507,7 @@ static struct ctl_table ctl_forward_entry[] = { | |||
1502 | { | 1507 | { |
1503 | .procname = "ip_forward", | 1508 | .procname = "ip_forward", |
1504 | .data = &ipv4_devconf.data[ | 1509 | .data = &ipv4_devconf.data[ |
1505 | NET_IPV4_CONF_FORWARDING - 1], | 1510 | IPV4_DEVCONF_FORWARDING - 1], |
1506 | .maxlen = sizeof(int), | 1511 | .maxlen = sizeof(int), |
1507 | .mode = 0644, | 1512 | .mode = 0644, |
1508 | .proc_handler = devinet_sysctl_forward, | 1513 | .proc_handler = devinet_sysctl_forward, |
@@ -1546,7 +1551,7 @@ static __net_init int devinet_init_net(struct net *net) | |||
1546 | if (tbl == NULL) | 1551 | if (tbl == NULL) |
1547 | goto err_alloc_ctl; | 1552 | goto err_alloc_ctl; |
1548 | 1553 | ||
1549 | tbl[0].data = &all->data[NET_IPV4_CONF_FORWARDING - 1]; | 1554 | tbl[0].data = &all->data[IPV4_DEVCONF_FORWARDING - 1]; |
1550 | tbl[0].extra1 = all; | 1555 | tbl[0].extra1 = all; |
1551 | tbl[0].extra2 = net; | 1556 | tbl[0].extra2 = net; |
1552 | #endif | 1557 | #endif |