diff options
Diffstat (limited to 'net/ipv4/devinet.c')
-rw-r--r-- | net/ipv4/devinet.c | 111 |
1 files changed, 17 insertions, 94 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 5df2f6a0b0f0..e049da8311b5 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
@@ -1293,58 +1293,6 @@ static int devinet_conf_proc(ctl_table *ctl, int write, | |||
1293 | return ret; | 1293 | return ret; |
1294 | } | 1294 | } |
1295 | 1295 | ||
1296 | static int devinet_conf_sysctl(ctl_table *table, | ||
1297 | void __user *oldval, size_t __user *oldlenp, | ||
1298 | void __user *newval, size_t newlen) | ||
1299 | { | ||
1300 | struct ipv4_devconf *cnf; | ||
1301 | struct net *net; | ||
1302 | int *valp = table->data; | ||
1303 | int new; | ||
1304 | int i; | ||
1305 | |||
1306 | if (!newval || !newlen) | ||
1307 | return 0; | ||
1308 | |||
1309 | if (newlen != sizeof(int)) | ||
1310 | return -EINVAL; | ||
1311 | |||
1312 | if (get_user(new, (int __user *)newval)) | ||
1313 | return -EFAULT; | ||
1314 | |||
1315 | if (new == *valp) | ||
1316 | return 0; | ||
1317 | |||
1318 | if (oldval && oldlenp) { | ||
1319 | size_t len; | ||
1320 | |||
1321 | if (get_user(len, oldlenp)) | ||
1322 | return -EFAULT; | ||
1323 | |||
1324 | if (len) { | ||
1325 | if (len > table->maxlen) | ||
1326 | len = table->maxlen; | ||
1327 | if (copy_to_user(oldval, valp, len)) | ||
1328 | return -EFAULT; | ||
1329 | if (put_user(len, oldlenp)) | ||
1330 | return -EFAULT; | ||
1331 | } | ||
1332 | } | ||
1333 | |||
1334 | *valp = new; | ||
1335 | |||
1336 | cnf = table->extra1; | ||
1337 | net = table->extra2; | ||
1338 | i = (int *)table->data - cnf->data; | ||
1339 | |||
1340 | set_bit(i, cnf->state); | ||
1341 | |||
1342 | if (cnf == net->ipv4.devconf_dflt) | ||
1343 | devinet_copy_dflt_conf(net, i); | ||
1344 | |||
1345 | return 1; | ||
1346 | } | ||
1347 | |||
1348 | static int devinet_sysctl_forward(ctl_table *ctl, int write, | 1296 | static int devinet_sysctl_forward(ctl_table *ctl, int write, |
1349 | void __user *buffer, | 1297 | void __user *buffer, |
1350 | size_t *lenp, loff_t *ppos) | 1298 | size_t *lenp, loff_t *ppos) |
@@ -1390,47 +1338,28 @@ int ipv4_doint_and_flush(ctl_table *ctl, int write, | |||
1390 | return ret; | 1338 | return ret; |
1391 | } | 1339 | } |
1392 | 1340 | ||
1393 | int ipv4_doint_and_flush_strategy(ctl_table *table, | 1341 | #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc) \ |
1394 | void __user *oldval, size_t __user *oldlenp, | ||
1395 | void __user *newval, size_t newlen) | ||
1396 | { | ||
1397 | int ret = devinet_conf_sysctl(table, oldval, oldlenp, newval, newlen); | ||
1398 | struct net *net = table->extra2; | ||
1399 | |||
1400 | if (ret == 1) | ||
1401 | rt_cache_flush(net, 0); | ||
1402 | |||
1403 | return ret; | ||
1404 | } | ||
1405 | |||
1406 | |||
1407 | #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc, sysctl) \ | ||
1408 | { \ | 1342 | { \ |
1409 | .ctl_name = NET_IPV4_CONF_ ## attr, \ | ||
1410 | .procname = name, \ | 1343 | .procname = name, \ |
1411 | .data = ipv4_devconf.data + \ | 1344 | .data = ipv4_devconf.data + \ |
1412 | NET_IPV4_CONF_ ## attr - 1, \ | 1345 | NET_IPV4_CONF_ ## attr - 1, \ |
1413 | .maxlen = sizeof(int), \ | 1346 | .maxlen = sizeof(int), \ |
1414 | .mode = mval, \ | 1347 | .mode = mval, \ |
1415 | .proc_handler = proc, \ | 1348 | .proc_handler = proc, \ |
1416 | .strategy = sysctl, \ | ||
1417 | .extra1 = &ipv4_devconf, \ | 1349 | .extra1 = &ipv4_devconf, \ |
1418 | } | 1350 | } |
1419 | 1351 | ||
1420 | #define DEVINET_SYSCTL_RW_ENTRY(attr, name) \ | 1352 | #define DEVINET_SYSCTL_RW_ENTRY(attr, name) \ |
1421 | DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc, \ | 1353 | DEVINET_SYSCTL_ENTRY(attr, name, 0644, devinet_conf_proc) |
1422 | devinet_conf_sysctl) | ||
1423 | 1354 | ||
1424 | #define DEVINET_SYSCTL_RO_ENTRY(attr, name) \ | 1355 | #define DEVINET_SYSCTL_RO_ENTRY(attr, name) \ |
1425 | DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc, \ | 1356 | DEVINET_SYSCTL_ENTRY(attr, name, 0444, devinet_conf_proc) |
1426 | devinet_conf_sysctl) | ||
1427 | 1357 | ||
1428 | #define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc, sysctl) \ | 1358 | #define DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, proc) \ |
1429 | DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc, sysctl) | 1359 | DEVINET_SYSCTL_ENTRY(attr, name, 0644, proc) |
1430 | 1360 | ||
1431 | #define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \ | 1361 | #define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \ |
1432 | DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush, \ | 1362 | DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush) |
1433 | ipv4_doint_and_flush_strategy) | ||
1434 | 1363 | ||
1435 | static struct devinet_sysctl_table { | 1364 | static struct devinet_sysctl_table { |
1436 | struct ctl_table_header *sysctl_header; | 1365 | struct ctl_table_header *sysctl_header; |
@@ -1439,8 +1368,7 @@ static struct devinet_sysctl_table { | |||
1439 | } devinet_sysctl = { | 1368 | } devinet_sysctl = { |
1440 | .devinet_vars = { | 1369 | .devinet_vars = { |
1441 | DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding", | 1370 | DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding", |
1442 | devinet_sysctl_forward, | 1371 | devinet_sysctl_forward), |
1443 | devinet_conf_sysctl), | ||
1444 | DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING, "mc_forwarding"), | 1372 | DEVINET_SYSCTL_RO_ENTRY(MC_FORWARDING, "mc_forwarding"), |
1445 | 1373 | ||
1446 | DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS, "accept_redirects"), | 1374 | DEVINET_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS, "accept_redirects"), |
@@ -1471,7 +1399,7 @@ static struct devinet_sysctl_table { | |||
1471 | }; | 1399 | }; |
1472 | 1400 | ||
1473 | static int __devinet_sysctl_register(struct net *net, char *dev_name, | 1401 | static int __devinet_sysctl_register(struct net *net, char *dev_name, |
1474 | int ctl_name, struct ipv4_devconf *p) | 1402 | struct ipv4_devconf *p) |
1475 | { | 1403 | { |
1476 | int i; | 1404 | int i; |
1477 | struct devinet_sysctl_table *t; | 1405 | struct devinet_sysctl_table *t; |
@@ -1479,9 +1407,9 @@ static int __devinet_sysctl_register(struct net *net, char *dev_name, | |||
1479 | #define DEVINET_CTL_PATH_DEV 3 | 1407 | #define DEVINET_CTL_PATH_DEV 3 |
1480 | 1408 | ||
1481 | struct ctl_path devinet_ctl_path[] = { | 1409 | struct ctl_path devinet_ctl_path[] = { |
1482 | { .procname = "net", .ctl_name = CTL_NET, }, | 1410 | { .procname = "net", }, |
1483 | { .procname = "ipv4", .ctl_name = NET_IPV4, }, | 1411 | { .procname = "ipv4", }, |
1484 | { .procname = "conf", .ctl_name = NET_IPV4_CONF, }, | 1412 | { .procname = "conf", }, |
1485 | { /* to be set */ }, | 1413 | { /* to be set */ }, |
1486 | { }, | 1414 | { }, |
1487 | }; | 1415 | }; |
@@ -1506,7 +1434,6 @@ static int __devinet_sysctl_register(struct net *net, char *dev_name, | |||
1506 | goto free; | 1434 | goto free; |
1507 | 1435 | ||
1508 | devinet_ctl_path[DEVINET_CTL_PATH_DEV].procname = t->dev_name; | 1436 | devinet_ctl_path[DEVINET_CTL_PATH_DEV].procname = t->dev_name; |
1509 | devinet_ctl_path[DEVINET_CTL_PATH_DEV].ctl_name = ctl_name; | ||
1510 | 1437 | ||
1511 | t->sysctl_header = register_net_sysctl_table(net, devinet_ctl_path, | 1438 | t->sysctl_header = register_net_sysctl_table(net, devinet_ctl_path, |
1512 | t->devinet_vars); | 1439 | t->devinet_vars); |
@@ -1540,9 +1467,9 @@ static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf) | |||
1540 | static void devinet_sysctl_register(struct in_device *idev) | 1467 | static void devinet_sysctl_register(struct in_device *idev) |
1541 | { | 1468 | { |
1542 | neigh_sysctl_register(idev->dev, idev->arp_parms, NET_IPV4, | 1469 | neigh_sysctl_register(idev->dev, idev->arp_parms, NET_IPV4, |
1543 | NET_IPV4_NEIGH, "ipv4", NULL, NULL); | 1470 | NET_IPV4_NEIGH, "ipv4", NULL); |
1544 | __devinet_sysctl_register(dev_net(idev->dev), idev->dev->name, | 1471 | __devinet_sysctl_register(dev_net(idev->dev), idev->dev->name, |
1545 | idev->dev->ifindex, &idev->cnf); | 1472 | &idev->cnf); |
1546 | } | 1473 | } |
1547 | 1474 | ||
1548 | static void devinet_sysctl_unregister(struct in_device *idev) | 1475 | static void devinet_sysctl_unregister(struct in_device *idev) |
@@ -1553,14 +1480,12 @@ static void devinet_sysctl_unregister(struct in_device *idev) | |||
1553 | 1480 | ||
1554 | static struct ctl_table ctl_forward_entry[] = { | 1481 | static struct ctl_table ctl_forward_entry[] = { |
1555 | { | 1482 | { |
1556 | .ctl_name = NET_IPV4_FORWARD, | ||
1557 | .procname = "ip_forward", | 1483 | .procname = "ip_forward", |
1558 | .data = &ipv4_devconf.data[ | 1484 | .data = &ipv4_devconf.data[ |
1559 | NET_IPV4_CONF_FORWARDING - 1], | 1485 | NET_IPV4_CONF_FORWARDING - 1], |
1560 | .maxlen = sizeof(int), | 1486 | .maxlen = sizeof(int), |
1561 | .mode = 0644, | 1487 | .mode = 0644, |
1562 | .proc_handler = devinet_sysctl_forward, | 1488 | .proc_handler = devinet_sysctl_forward, |
1563 | .strategy = devinet_conf_sysctl, | ||
1564 | .extra1 = &ipv4_devconf, | 1489 | .extra1 = &ipv4_devconf, |
1565 | .extra2 = &init_net, | 1490 | .extra2 = &init_net, |
1566 | }, | 1491 | }, |
@@ -1568,8 +1493,8 @@ static struct ctl_table ctl_forward_entry[] = { | |||
1568 | }; | 1493 | }; |
1569 | 1494 | ||
1570 | static __net_initdata struct ctl_path net_ipv4_path[] = { | 1495 | static __net_initdata struct ctl_path net_ipv4_path[] = { |
1571 | { .procname = "net", .ctl_name = CTL_NET, }, | 1496 | { .procname = "net", }, |
1572 | { .procname = "ipv4", .ctl_name = NET_IPV4, }, | 1497 | { .procname = "ipv4", }, |
1573 | { }, | 1498 | { }, |
1574 | }; | 1499 | }; |
1575 | #endif | 1500 | #endif |
@@ -1608,13 +1533,11 @@ static __net_init int devinet_init_net(struct net *net) | |||
1608 | } | 1533 | } |
1609 | 1534 | ||
1610 | #ifdef CONFIG_SYSCTL | 1535 | #ifdef CONFIG_SYSCTL |
1611 | err = __devinet_sysctl_register(net, "all", | 1536 | err = __devinet_sysctl_register(net, "all", all); |
1612 | NET_PROTO_CONF_ALL, all); | ||
1613 | if (err < 0) | 1537 | if (err < 0) |
1614 | goto err_reg_all; | 1538 | goto err_reg_all; |
1615 | 1539 | ||
1616 | err = __devinet_sysctl_register(net, "default", | 1540 | err = __devinet_sysctl_register(net, "default", dflt); |
1617 | NET_PROTO_CONF_DEFAULT, dflt); | ||
1618 | if (err < 0) | 1541 | if (err < 0) |
1619 | goto err_reg_dflt; | 1542 | goto err_reg_dflt; |
1620 | 1543 | ||