diff options
author | Amos Waterland <apw@us.ibm.com> | 2008-01-06 02:23:06 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-09 02:29:58 -0500 |
commit | 92ffb85dd33d62ac1dad8b44da62365f2aad413d (patch) | |
tree | 248504c621af6bb50c9a399b9540c2e6500a1e30 | |
parent | f844c74fe07321953e2dd227fe35280075f18f60 (diff) |
[IPV4] ipconfig: Fix regression in ip command line processing
The recent changes for ip command line processing fixed some problems
but unfortunately broke some common usage scenarios. In current
2.6.24-rc6 the following command line results in no IP address
assignment, which is surely a regression:
ip=10.0.2.15::10.0.2.2:255.255.255.0::eth0:off
Please find below a patch that works for all cases I can find.
Signed-off-by: Amos Waterland <apw@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | Documentation/nfsroot.txt | 1 | ||||
-rw-r--r-- | net/ipv4/ipconfig.c | 22 |
2 files changed, 19 insertions, 4 deletions
diff --git a/Documentation/nfsroot.txt b/Documentation/nfsroot.txt index c86dd38e2281..31b329172343 100644 --- a/Documentation/nfsroot.txt +++ b/Documentation/nfsroot.txt | |||
@@ -145,6 +145,7 @@ ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf> | |||
145 | this option. | 145 | this option. |
146 | 146 | ||
147 | off or none: don't use autoconfiguration | 147 | off or none: don't use autoconfiguration |
148 | (do static IP assignment instead) | ||
148 | on or any: use any protocol available in the kernel | 149 | on or any: use any protocol available in the kernel |
149 | (default) | 150 | (default) |
150 | dhcp: use DHCP | 151 | dhcp: use DHCP |
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index 56a675734ea5..b8f7763b2261 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c | |||
@@ -1404,8 +1404,7 @@ static int __init ic_proto_name(char *name) | |||
1404 | return 1; | 1404 | return 1; |
1405 | } | 1405 | } |
1406 | if (!strcmp(name, "off") || !strcmp(name, "none")) { | 1406 | if (!strcmp(name, "off") || !strcmp(name, "none")) { |
1407 | ic_enable = 0; | 1407 | return 0; |
1408 | return 1; | ||
1409 | } | 1408 | } |
1410 | #ifdef CONFIG_IP_PNP_DHCP | 1409 | #ifdef CONFIG_IP_PNP_DHCP |
1411 | else if (!strcmp(name, "dhcp")) { | 1410 | else if (!strcmp(name, "dhcp")) { |
@@ -1442,10 +1441,22 @@ static int __init ip_auto_config_setup(char *addrs) | |||
1442 | ic_set_manually = 1; | 1441 | ic_set_manually = 1; |
1443 | ic_enable = 1; | 1442 | ic_enable = 1; |
1444 | 1443 | ||
1444 | /* | ||
1445 | * If any dhcp, bootp etc options are set, leave autoconfig on | ||
1446 | * and skip the below static IP processing. | ||
1447 | */ | ||
1445 | if (ic_proto_name(addrs)) | 1448 | if (ic_proto_name(addrs)) |
1446 | return 1; | 1449 | return 1; |
1447 | 1450 | ||
1448 | /* Parse the whole string */ | 1451 | /* If no static IP is given, turn off autoconfig and bail. */ |
1452 | if (*addrs == 0 || | ||
1453 | strcmp(addrs, "off") == 0 || | ||
1454 | strcmp(addrs, "none") == 0) { | ||
1455 | ic_enable = 0; | ||
1456 | return 1; | ||
1457 | } | ||
1458 | |||
1459 | /* Parse string for static IP assignment. */ | ||
1449 | ip = addrs; | 1460 | ip = addrs; |
1450 | while (ip && *ip) { | 1461 | while (ip && *ip) { |
1451 | if ((cp = strchr(ip, ':'))) | 1462 | if ((cp = strchr(ip, ':'))) |
@@ -1483,7 +1494,10 @@ static int __init ip_auto_config_setup(char *addrs) | |||
1483 | strlcpy(user_dev_name, ip, sizeof(user_dev_name)); | 1494 | strlcpy(user_dev_name, ip, sizeof(user_dev_name)); |
1484 | break; | 1495 | break; |
1485 | case 6: | 1496 | case 6: |
1486 | ic_proto_name(ip); | 1497 | if (ic_proto_name(ip) == 0 && |
1498 | ic_myaddr == NONE) { | ||
1499 | ic_enable = 0; | ||
1500 | } | ||
1487 | break; | 1501 | break; |
1488 | } | 1502 | } |
1489 | } | 1503 | } |