aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmos Waterland <apw@us.ibm.com>2008-01-06 02:23:06 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-09 02:29:58 -0500
commit92ffb85dd33d62ac1dad8b44da62365f2aad413d (patch)
tree248504c621af6bb50c9a399b9540c2e6500a1e30
parentf844c74fe07321953e2dd227fe35280075f18f60 (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.txt1
-rw-r--r--net/ipv4/ipconfig.c22
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 }