ipconfig: add nameserver IPs to kernel-parameter ip=
authorChristoph Fritz <chf.fritz@googlemail.com>
Fri, 21 Sep 2012 08:31:19 +0000 (08:31 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 21 Sep 2012 18:51:21 +0000 (14:51 -0400)
On small systems (e.g. embedded ones) IP addresses are often configured
by bootloaders and get assigned to kernel via parameter "ip=".  If set to
"ip=dhcp", even nameserver entries from DHCP daemons are handled. These
entries exported in /proc/net/pnp are commonly linked by /etc/resolv.conf.

To configure nameservers for networks without DHCP, this patch adds option
<dns0-ip> and <dns1-ip> to kernel-parameter 'ip='.

Signed-off-by: Christoph Fritz <chf.fritz@googlemail.com>
Tested-by: Jan Weitzel <j.weitzel@phytec.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/filesystems/nfs/nfsroot.txt
net/ipv4/ipconfig.c

index ffdd9d8..2d66ed6 100644 (file)
@@ -78,7 +78,8 @@ nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
                        flags           = hard, nointr, noposix, cto, ac
 
 
-ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
+ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:
+   <dns0-ip>:<dns1-ip>
 
   This parameter tells the kernel how to configure IP addresses of devices
   and also how to set up the IP routing table. It was originally called
@@ -158,6 +159,13 @@ ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
 
                 Default: any
 
+  <dns0-ip>    IP address of first nameserver.
+               Value gets exported by /proc/net/pnp which is often linked
+               on embedded systems by /etc/resolv.conf.
+
+  <dns1-ip>    IP address of secound nameserver.
+               Same as above.
+
 
 nfsrootdebug
 
index 67e8a6b..1c0e7e0 100644 (file)
@@ -743,14 +743,22 @@ static void __init ic_bootp_init_ext(u8 *e)
 
 
 /*
- *  Initialize the DHCP/BOOTP mechanism.
+ *  Predefine Nameservers
  */
-static inline void __init ic_bootp_init(void)
+static inline void __init ic_nameservers_predef(void)
 {
        int i;
 
        for (i = 0; i < CONF_NAMESERVERS_MAX; i++)
                ic_nameservers[i] = NONE;
+}
+
+/*
+ *  Initialize the DHCP/BOOTP mechanism.
+ */
+static inline void __init ic_bootp_init(void)
+{
+       ic_nameservers_predef();
 
        dev_add_pack(&bootp_packet_type);
 }
@@ -1379,6 +1387,7 @@ static int __init ip_auto_config(void)
        int retries = CONF_OPEN_RETRIES;
 #endif
        int err;
+       unsigned int i;
 
 #ifdef CONFIG_PROC_FS
        proc_net_fops_create(&init_net, "pnp", S_IRUGO, &pnp_seq_fops);
@@ -1499,7 +1508,15 @@ static int __init ip_auto_config(void)
                &ic_servaddr, &root_server_addr, root_server_path);
        if (ic_dev_mtu)
                pr_cont(", mtu=%d", ic_dev_mtu);
-       pr_cont("\n");
+       for (i = 0; i < CONF_NAMESERVERS_MAX; i++)
+               if (ic_nameservers[i] != NONE) {
+                       pr_info("     nameserver%u=%pI4",
+                               i, &ic_nameservers[i]);
+                       break;
+               }
+       for (i++; i < CONF_NAMESERVERS_MAX; i++)
+               if (ic_nameservers[i] != NONE)
+                       pr_cont(", nameserver%u=%pI4\n", i, &ic_nameservers[i]);
 #endif /* !SILENT */
 
        return 0;
@@ -1570,6 +1587,8 @@ static int __init ip_auto_config_setup(char *addrs)
                return 1;
        }
 
+       ic_nameservers_predef();
+
        /* Parse string for static IP assignment.  */
        ip = addrs;
        while (ip && *ip) {
@@ -1613,6 +1632,20 @@ static int __init ip_auto_config_setup(char *addrs)
                                        ic_enable = 0;
                                }
                                break;
+                       case 7:
+                               if (CONF_NAMESERVERS_MAX >= 1) {
+                                       ic_nameservers[0] = in_aton(ip);
+                                       if (ic_nameservers[0] == ANY)
+                                               ic_nameservers[0] = NONE;
+                               }
+                               break;
+                       case 8:
+                               if (CONF_NAMESERVERS_MAX >= 2) {
+                                       ic_nameservers[1] = in_aton(ip);
+                                       if (ic_nameservers[1] == ANY)
+                                               ic_nameservers[1] = NONE;
+                               }
+                               break;
                        }
                }
                ip = cp;