diff options
Diffstat (limited to 'net/ipv4/ipconfig.c')
| -rw-r--r-- | net/ipv4/ipconfig.c | 327 | 
1 files changed, 198 insertions, 129 deletions
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index 2b097752426..b3e86ea7b71 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c @@ -54,6 +54,7 @@  #include <linux/delay.h>  #include <linux/nfs_fs.h>  #include <linux/slab.h> +#include <linux/export.h>  #include <net/net_namespace.h>  #include <net/arp.h>  #include <net/ip.h> @@ -87,8 +88,8 @@  #endif  /* Define the friendly delay before and after opening net devices */ -#define CONF_PRE_OPEN		500	/* Before opening: 1/2 second */ -#define CONF_POST_OPEN		1	/* After opening: 1 second */ +#define CONF_POST_OPEN		10	/* After opening: 10 msecs */ +#define CONF_CARRIER_TIMEOUT	120000	/* Wait for carrier timeout */  /* Define the timeout for waiting for a DHCP/BOOTP/RARP reply */  #define CONF_OPEN_RETRIES 	2	/* (Re)open devices twice */ @@ -135,12 +136,14 @@ __be32 ic_myaddr = NONE;		/* My IP address */  static __be32 ic_netmask = NONE;	/* Netmask for local subnet */  __be32 ic_gateway = NONE;	/* Gateway IP address */ +__be32 ic_addrservaddr = NONE;	/* IP Address of the IP addresses'server */ +  __be32 ic_servaddr = NONE;	/* Boot server IP address */  __be32 root_server_addr = NONE;	/* Address of NFS server */  u8 root_server_path[256] = { 0, };	/* Path to mount as root */ -u32 ic_dev_xid;		/* Device under configuration */ +__be32 ic_dev_xid;		/* Device under configuration */  /* vendor class identifier */  static char vendor_class_identifier[253] __initdata; @@ -188,14 +191,14 @@ struct ic_device {  static struct ic_device *ic_first_dev __initdata = NULL;/* List of open device */  static struct net_device *ic_dev __initdata = NULL;	/* Selected device */ -static bool __init ic_device_match(struct net_device *dev) +static bool __init ic_is_init_dev(struct net_device *dev)  { -	if (user_dev_name[0] ? !strcmp(dev->name, user_dev_name) : +	if (dev->flags & IFF_LOOPBACK) +		return false; +	return user_dev_name[0] ? !strcmp(dev->name, user_dev_name) :  	    (!(dev->flags & IFF_LOOPBACK) &&  	     (dev->flags & (IFF_POINTOPOINT|IFF_BROADCAST)) && -	     strncmp(dev->name, "dummy", 5))) -		return true; -	return false; +	     strncmp(dev->name, "dummy", 5));  }  static int __init ic_open_devs(void) @@ -203,6 +206,7 @@ static int __init ic_open_devs(void)  	struct ic_device *d, **last;  	struct net_device *dev;  	unsigned short oflags; +	unsigned long start, next_msg;  	last = &ic_first_dev;  	rtnl_lock(); @@ -212,18 +216,17 @@ static int __init ic_open_devs(void)  		if (!(dev->flags & IFF_LOOPBACK))  			continue;  		if (dev_change_flags(dev, dev->flags | IFF_UP) < 0) -			printk(KERN_ERR "IP-Config: Failed to open %s\n", dev->name); +			pr_err("IP-Config: Failed to open %s\n", dev->name);  	}  	for_each_netdev(&init_net, dev) { -		if (dev->flags & IFF_LOOPBACK) -			continue; -		if (ic_device_match(dev)) { +		if (ic_is_init_dev(dev)) {  			int able = 0;  			if (dev->mtu >= 364)  				able |= IC_BOOTP;  			else -				printk(KERN_WARNING "DHCP/BOOTP: Ignoring device %s, MTU %d too small", dev->name, dev->mtu); +				pr_warn("DHCP/BOOTP: Ignoring device %s, MTU %d too small", +					dev->name, dev->mtu);  			if (!(dev->flags & IFF_NOARP))  				able |= IC_RARP;  			able &= ic_proto_enabled; @@ -231,7 +234,8 @@ static int __init ic_open_devs(void)  				continue;  			oflags = dev->flags;  			if (dev_change_flags(dev, oflags | IFF_UP) < 0) { -				printk(KERN_ERR "IP-Config: Failed to open %s\n", dev->name); +				pr_err("IP-Config: Failed to open %s\n", +				       dev->name);  				continue;  			}  			if (!(d = kmalloc(sizeof(struct ic_device), GFP_KERNEL))) { @@ -252,15 +256,42 @@ static int __init ic_open_devs(void)  				dev->name, able, d->xid));  		}  	} + +	/* no point in waiting if we could not bring up at least one device */ +	if (!ic_first_dev) +		goto have_carrier; + +	/* wait for a carrier on at least one device */ +	start = jiffies; +	next_msg = start + msecs_to_jiffies(CONF_CARRIER_TIMEOUT/12); +	while (jiffies - start < msecs_to_jiffies(CONF_CARRIER_TIMEOUT)) { +		int wait, elapsed; + +		for_each_netdev(&init_net, dev) +			if (ic_is_init_dev(dev) && netif_carrier_ok(dev)) +				goto have_carrier; + +		msleep(1); + +		if (time_before(jiffies, next_msg)) +			continue; + +		elapsed = jiffies_to_msecs(jiffies - start); +		wait = (CONF_CARRIER_TIMEOUT - elapsed + 500)/1000; +		pr_info("Waiting up to %d more seconds for network.\n", wait); +		next_msg = jiffies + msecs_to_jiffies(CONF_CARRIER_TIMEOUT/12); +	} +have_carrier:  	rtnl_unlock();  	*last = NULL;  	if (!ic_first_dev) {  		if (user_dev_name[0]) -			printk(KERN_ERR "IP-Config: Device `%s' not found.\n", user_dev_name); +			pr_err("IP-Config: Device `%s' not found\n", +			       user_dev_name);  		else -			printk(KERN_ERR "IP-Config: No network devices available.\n"); +			pr_err("IP-Config: No network devices available\n");  		return -ENODEV;  	}  	return 0; @@ -344,17 +375,20 @@ static int __init ic_setup_if(void)  	strcpy(ir.ifr_ifrn.ifrn_name, ic_dev->name);  	set_sockaddr(sin, ic_myaddr, 0);  	if ((err = ic_devinet_ioctl(SIOCSIFADDR, &ir)) < 0) { -		printk(KERN_ERR "IP-Config: Unable to set interface address (%d).\n", err); +		pr_err("IP-Config: Unable to set interface address (%d)\n", +		       err);  		return -1;  	}  	set_sockaddr(sin, ic_netmask, 0);  	if ((err = ic_devinet_ioctl(SIOCSIFNETMASK, &ir)) < 0) { -		printk(KERN_ERR "IP-Config: Unable to set interface netmask (%d).\n", err); +		pr_err("IP-Config: Unable to set interface netmask (%d)\n", +		       err);  		return -1;  	}  	set_sockaddr(sin, ic_myaddr | ~ic_netmask, 0);  	if ((err = ic_devinet_ioctl(SIOCSIFBRDADDR, &ir)) < 0) { -		printk(KERN_ERR "IP-Config: Unable to set interface broadcast address (%d).\n", err); +		pr_err("IP-Config: Unable to set interface broadcast address (%d)\n", +		       err);  		return -1;  	}  	/* Handle the case where we need non-standard MTU on the boot link (a network @@ -365,8 +399,8 @@ static int __init ic_setup_if(void)  		strcpy(ir.ifr_name, ic_dev->name);  		ir.ifr_mtu = ic_dev_mtu;  		if ((err = ic_dev_ioctl(SIOCSIFMTU, &ir)) < 0) -			printk(KERN_ERR "IP-Config: Unable to set interface mtu to %d (%d).\n", -			                 ic_dev_mtu, err); +			pr_err("IP-Config: Unable to set interface mtu to %d (%d)\n", +			       ic_dev_mtu, err);  	}  	return 0;  } @@ -381,7 +415,7 @@ static int __init ic_setup_routes(void)  		memset(&rm, 0, sizeof(rm));  		if ((ic_gateway ^ ic_myaddr) & ic_netmask) { -			printk(KERN_ERR "IP-Config: Gateway not on directly connected network.\n"); +			pr_err("IP-Config: Gateway not on directly connected network\n");  			return -1;  		}  		set_sockaddr((struct sockaddr_in *) &rm.rt_dst, 0, 0); @@ -389,7 +423,8 @@ static int __init ic_setup_routes(void)  		set_sockaddr((struct sockaddr_in *) &rm.rt_gateway, ic_gateway, 0);  		rm.rt_flags = RTF_UP | RTF_GATEWAY;  		if ((err = ic_route_ioctl(SIOCADDRT, &rm)) < 0) { -			printk(KERN_ERR "IP-Config: Cannot add default route (%d).\n", err); +			pr_err("IP-Config: Cannot add default route (%d)\n", +			       err);  			return -1;  		}  	} @@ -422,8 +457,8 @@ static int __init ic_defaults(void)  		else if (IN_CLASSC(ntohl(ic_myaddr)))  			ic_netmask = htonl(IN_CLASSC_NET);  		else { -			printk(KERN_ERR "IP-Config: Unable to guess netmask for address %pI4\n", -				&ic_myaddr); +			pr_err("IP-Config: Unable to guess netmask for address %pI4\n", +			       &ic_myaddr);  			return -1;  		}  		printk("IP-Config: Guessing netmask %pI4\n", &ic_netmask); @@ -536,6 +571,7 @@ ic_rarp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt  	if (ic_myaddr == NONE)  		ic_myaddr = tip;  	ic_servaddr = sip; +	ic_addrservaddr = sip;  	ic_got_reply = IC_RARP;  drop_unlock: @@ -561,6 +597,17 @@ static void __init ic_rarp_send_if(struct ic_device *d)  #endif  /* + *  Predefine Nameservers + */ +static inline void __init ic_nameservers_predef(void) +{ +	int i; + +	for (i = 0; i < CONF_NAMESERVERS_MAX; i++) +		ic_nameservers[i] = NONE; +} + +/*   *	DHCP/BOOTP support.   */ @@ -673,8 +720,8 @@ ic_dhcp_init_options(u8 *options)  			e += len;  		}  		if (*vendor_class_identifier) { -			printk(KERN_INFO "DHCP: sending class identifier \"%s\"\n", -			       vendor_class_identifier); +			pr_info("DHCP: sending class identifier \"%s\"\n", +				vendor_class_identifier);  			*e++ = 60;	/* Class-identifier */  			len = strlen(vendor_class_identifier);  			*e++ = len; @@ -725,10 +772,7 @@ static void __init ic_bootp_init_ext(u8 *e)   */  static inline void __init ic_bootp_init(void)  { -	int i; - -	for (i = 0; i < CONF_NAMESERVERS_MAX; i++) -		ic_nameservers[i] = NONE; +	ic_nameservers_predef();  	dev_add_pack(&bootp_packet_type);  } @@ -752,13 +796,15 @@ static void __init ic_bootp_send_if(struct ic_device *d, unsigned long jiffies_d  	struct sk_buff *skb;  	struct bootp_pkt *b;  	struct iphdr *h; +	int hlen = LL_RESERVED_SPACE(dev); +	int tlen = dev->needed_tailroom;  	/* Allocate packet */ -	skb = alloc_skb(sizeof(struct bootp_pkt) + LL_ALLOCATED_SPACE(dev) + 15, +	skb = alloc_skb(sizeof(struct bootp_pkt) + hlen + tlen + 15,  			GFP_KERNEL);  	if (!skb)  		return; -	skb_reserve(skb, LL_RESERVED_SPACE(dev)); +	skb_reserve(skb, hlen);  	b = (struct bootp_pkt *) skb_put(skb, sizeof(struct bootp_pkt));  	memset(b, 0, sizeof(struct bootp_pkt)); @@ -784,8 +830,6 @@ static void __init ic_bootp_send_if(struct ic_device *d, unsigned long jiffies_d  	b->op = BOOTP_REQUEST;  	if (dev->type < 256) /* check for false types */  		b->htype = dev->type; -	else if (dev->type == ARPHRD_IEEE802_TR) /* fix for token ring */ -		b->htype = ARPHRD_IEEE802;  	else if (dev->type == ARPHRD_FDDI)  		b->htype = ARPHRD_ETHER;  	else { @@ -811,8 +855,13 @@ static void __init ic_bootp_send_if(struct ic_device *d, unsigned long jiffies_d  	skb->dev = dev;  	skb->protocol = htons(ETH_P_IP);  	if (dev_hard_header(skb, dev, ntohs(skb->protocol), -			    dev->broadcast, dev->dev_addr, skb->len) < 0 || -	    dev_queue_xmit(skb) < 0) +			    dev->broadcast, dev->dev_addr, skb->len) < 0) { +		kfree_skb(skb); +		printk("E"); +		return; +	} + +	if (dev_queue_xmit(skb) < 0)  		printk("E");  } @@ -837,9 +886,9 @@ static int __init ic_bootp_string(char *dest, char *src, int len, int max)   */  static void __init ic_do_bootp_ext(u8 *ext)  { -       u8 servers; -       int i; -	u16 mtu; +	u8 servers; +	int i; +	__be16 mtu;  #ifdef IPCONFIG_DEBUG  	u8 *c; @@ -851,41 +900,44 @@ static void __init ic_do_bootp_ext(u8 *ext)  #endif  	switch (*ext++) { -		case 1:		/* Subnet mask */ -			if (ic_netmask == NONE) -				memcpy(&ic_netmask, ext+1, 4); -			break; -		case 3:		/* Default gateway */ -			if (ic_gateway == NONE) -				memcpy(&ic_gateway, ext+1, 4); -			break; -		case 6:		/* DNS server */ -			servers= *ext/4; -			if (servers > CONF_NAMESERVERS_MAX) -				servers = CONF_NAMESERVERS_MAX; -			for (i = 0; i < servers; i++) { -				if (ic_nameservers[i] == NONE) -					memcpy(&ic_nameservers[i], ext+1+4*i, 4); -			} -			break; -		case 12:	/* Host name */ -			ic_bootp_string(utsname()->nodename, ext+1, *ext, __NEW_UTS_LEN); -			ic_host_name_set = 1; -			break; -		case 15:	/* Domain name (DNS) */ -			ic_bootp_string(ic_domain, ext+1, *ext, sizeof(ic_domain)); -			break; -		case 17:	/* Root path */ -			if (!root_server_path[0]) -				ic_bootp_string(root_server_path, ext+1, *ext, sizeof(root_server_path)); -			break; -		case 26:	/* Interface MTU */ -			memcpy(&mtu, ext+1, sizeof(mtu)); -			ic_dev_mtu = ntohs(mtu); -			break; -		case 40:	/* NIS Domain name (_not_ DNS) */ -			ic_bootp_string(utsname()->domainname, ext+1, *ext, __NEW_UTS_LEN); -			break; +	case 1:		/* Subnet mask */ +		if (ic_netmask == NONE) +			memcpy(&ic_netmask, ext+1, 4); +		break; +	case 3:		/* Default gateway */ +		if (ic_gateway == NONE) +			memcpy(&ic_gateway, ext+1, 4); +		break; +	case 6:		/* DNS server */ +		servers= *ext/4; +		if (servers > CONF_NAMESERVERS_MAX) +			servers = CONF_NAMESERVERS_MAX; +		for (i = 0; i < servers; i++) { +			if (ic_nameservers[i] == NONE) +				memcpy(&ic_nameservers[i], ext+1+4*i, 4); +		} +		break; +	case 12:	/* Host name */ +		ic_bootp_string(utsname()->nodename, ext+1, *ext, +				__NEW_UTS_LEN); +		ic_host_name_set = 1; +		break; +	case 15:	/* Domain name (DNS) */ +		ic_bootp_string(ic_domain, ext+1, *ext, sizeof(ic_domain)); +		break; +	case 17:	/* Root path */ +		if (!root_server_path[0]) +			ic_bootp_string(root_server_path, ext+1, *ext, +					sizeof(root_server_path)); +		break; +	case 26:	/* Interface MTU */ +		memcpy(&mtu, ext+1, sizeof(mtu)); +		ic_dev_mtu = ntohs(mtu); +		break; +	case 40:	/* NIS Domain name (_not_ DNS) */ +		ic_bootp_string(utsname()->domainname, ext+1, *ext, +				__NEW_UTS_LEN); +		break;  	}  } @@ -922,10 +974,8 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str  		goto drop;  	/* Fragments are not supported */ -	if (h->frag_off & htons(IP_OFFSET | IP_MF)) { -		if (net_ratelimit()) -			printk(KERN_ERR "DHCP/BOOTP: Ignoring fragmented " -			       "reply.\n"); +	if (ip_is_fragment(h)) { +		net_err_ratelimited("DHCP/BOOTP: Ignoring fragmented reply\n");  		goto drop;  	} @@ -973,17 +1023,14 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str  	/* Is it a reply to our BOOTP request? */  	if (b->op != BOOTP_REPLY ||  	    b->xid != d->xid) { -		if (net_ratelimit()) -			printk(KERN_ERR "DHCP/BOOTP: Reply not for us, " -			       "op[%x] xid[%x]\n", -			       b->op, b->xid); +		net_err_ratelimited("DHCP/BOOTP: Reply not for us, op[%x] xid[%x]\n", +				    b->op, b->xid);  		goto drop_unlock;  	}  	/* Is it a reply for the device we are configuring? */  	if (b->xid != ic_dev_xid) { -		if (net_ratelimit()) -			printk(KERN_ERR "DHCP/BOOTP: Ignoring delayed packet\n"); +		net_err_ratelimited("DHCP/BOOTP: Ignoring delayed packet\n");  		goto drop_unlock;  	} @@ -1035,7 +1082,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str  				ic_servaddr = server_id;  #ifdef IPCONFIG_DEBUG  				printk("DHCP: Offered address %pI4 by server %pI4\n", -				       &ic_myaddr, &ic_servaddr); +				       &ic_myaddr, &b->iph.saddr);  #endif  				/* The DHCP indicated server address takes  				 * precedence over the bootp header one if @@ -1080,6 +1127,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str  	ic_dev = dev;  	ic_myaddr = b->your_ip;  	ic_servaddr = b->server_ip; +	ic_addrservaddr = b->iph.saddr;  	if (ic_gateway == NONE && b->relay_ip)  		ic_gateway = b->relay_ip;  	if (ic_nameservers[0] == NONE) @@ -1121,17 +1169,17 @@ static int __init ic_dynamic(void)  	 * are missing, and without DHCP/BOOTP/RARP we are unable to get it.  	 */  	if (!ic_proto_enabled) { -		printk(KERN_ERR "IP-Config: Incomplete network configuration information.\n"); +		pr_err("IP-Config: Incomplete network configuration information\n");  		return -1;  	}  #ifdef IPCONFIG_BOOTP  	if ((ic_proto_enabled ^ ic_proto_have_if) & IC_BOOTP) -		printk(KERN_ERR "DHCP/BOOTP: No suitable device found.\n"); +		pr_err("DHCP/BOOTP: No suitable device found\n");  #endif  #ifdef IPCONFIG_RARP  	if ((ic_proto_enabled ^ ic_proto_have_if) & IC_RARP) -		printk(KERN_ERR "RARP: No suitable device found.\n"); +		pr_err("RARP: No suitable device found\n");  #endif  	if (!ic_proto_have_if) @@ -1158,17 +1206,17 @@ static int __init ic_dynamic(void)  	 * [Actually we could now, but the nothing else running note still  	 *  applies.. - AC]  	 */ -	printk(KERN_NOTICE "Sending %s%s%s requests .", -	       do_bootp -		? ((ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP") : "", -	       (do_bootp && do_rarp) ? " and " : "", -	       do_rarp ? "RARP" : ""); +	pr_notice("Sending %s%s%s requests .", +		  do_bootp +		  ? ((ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP") : "", +		  (do_bootp && do_rarp) ? " and " : "", +		  do_rarp ? "RARP" : "");  	start_jiffies = jiffies;  	d = ic_first_dev;  	retries = CONF_SEND_RETRIES;  	get_random_bytes(&timeout, sizeof(timeout)); -	timeout = CONF_BASE_TIMEOUT + (timeout % (unsigned) CONF_TIMEOUT_RANDOM); +	timeout = CONF_BASE_TIMEOUT + (timeout % (unsigned int) CONF_TIMEOUT_RANDOM);  	for (;;) {  		/* Track the device we are configuring */  		ic_dev_xid = d->xid; @@ -1191,13 +1239,13 @@ static int __init ic_dynamic(void)  		    (ic_proto_enabled & IC_USE_DHCP) &&  		    ic_dhcp_msgtype != DHCPACK) {  			ic_got_reply = 0; -			printk(KERN_CONT ","); +			pr_cont(",");  			continue;  		}  #endif /* IPCONFIG_DHCP */  		if (ic_got_reply) { -			printk(KERN_CONT " OK\n"); +			pr_cont(" OK\n");  			break;  		} @@ -1205,7 +1253,7 @@ static int __init ic_dynamic(void)  			continue;  		if (! --retries) { -			printk(KERN_CONT " timed out!\n"); +			pr_cont(" timed out!\n");  			break;  		} @@ -1215,7 +1263,7 @@ static int __init ic_dynamic(void)  		if (timeout > CONF_TIMEOUT_MAX)  			timeout = CONF_TIMEOUT_MAX; -		printk(KERN_CONT "."); +		pr_cont(".");  	}  #ifdef IPCONFIG_BOOTP @@ -1235,8 +1283,8 @@ static int __init ic_dynamic(void)  	printk("IP-Config: Got %s answer from %pI4, ",  		((ic_got_reply & IC_RARP) ? "RARP"  		 : (ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP"), -		&ic_servaddr); -	printk(KERN_CONT "my address is %pI4\n", &ic_myaddr); +	       &ic_addrservaddr); +	pr_cont("my address is %pI4\n", &ic_myaddr);  	return 0;  } @@ -1324,14 +1372,13 @@ static int __init wait_for_devices(void)  {  	int i; -	msleep(CONF_PRE_OPEN);  	for (i = 0; i < DEVICE_WAIT_MAX; i++) {  		struct net_device *dev;  		int found = 0;  		rtnl_lock();  		for_each_netdev(&init_net, dev) { -			if (ic_device_match(dev)) { +			if (ic_is_init_dev(dev)) {  				found = 1;  				break;  			} @@ -1355,9 +1402,10 @@ 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); +	proc_create("pnp", S_IRUGO, init_net.proc_net, &pnp_seq_fops);  #endif /* CONFIG_PROC_FS */  	if (!ic_enable) @@ -1378,7 +1426,7 @@ static int __init ip_auto_config(void)  		return err;  	/* Give drivers a chance to settle */ -	ssleep(CONF_POST_OPEN); +	msleep(CONF_POST_OPEN);  	/*  	 * If the config information is insufficient (e.g., our IP address or @@ -1413,24 +1461,22 @@ static int __init ip_auto_config(void)  			 */  #ifdef CONFIG_ROOT_NFS  			if (ROOT_DEV ==  Root_NFS) { -				printk(KERN_ERR -					"IP-Config: Retrying forever (NFS root)...\n"); +				pr_err("IP-Config: Retrying forever (NFS root)...\n");  				goto try_try_again;  			}  #endif  			if (--retries) { -				printk(KERN_ERR -				       "IP-Config: Reopening network devices...\n"); +				pr_err("IP-Config: Reopening network devices...\n");  				goto try_try_again;  			}  			/* Oh, well.  At least we tried. */ -			printk(KERN_ERR "IP-Config: Auto-configuration of network failed.\n"); +			pr_err("IP-Config: Auto-configuration of network failed\n");  			return -1;  		}  #else /* !DYNAMIC */ -		printk(KERN_ERR "IP-Config: Incomplete network configuration information.\n"); +		pr_err("IP-Config: Incomplete network configuration information\n");  		ic_close_devs();  		return -1;  #endif /* IPCONFIG_DYNAMIC */ @@ -1444,7 +1490,7 @@ static int __init ip_auto_config(void)  		root_server_addr = addr;  	/* -	 * Use defaults whereever applicable. +	 * Use defaults wherever applicable.  	 */  	if (ic_defaults() < 0)  		return -1; @@ -1468,19 +1514,27 @@ static int __init ip_auto_config(void)  	/*  	 * Clue in the operator.  	 */ -	printk("IP-Config: Complete:\n"); -	printk("     device=%s", ic_dev->name); -	printk(KERN_CONT ", addr=%pI4", &ic_myaddr); -	printk(KERN_CONT ", mask=%pI4", &ic_netmask); -	printk(KERN_CONT ", gw=%pI4", &ic_gateway); -	printk(KERN_CONT ",\n     host=%s, domain=%s, nis-domain=%s", -	       utsname()->nodename, ic_domain, utsname()->domainname); -	printk(KERN_CONT ",\n     bootserver=%pI4", &ic_servaddr); -	printk(KERN_CONT ", rootserver=%pI4", &root_server_addr); -	printk(KERN_CONT ", rootpath=%s", root_server_path); +	pr_info("IP-Config: Complete:\n"); + +	pr_info("     device=%s, hwaddr=%*phC, ipaddr=%pI4, mask=%pI4, gw=%pI4\n", +		ic_dev->name, ic_dev->addr_len, ic_dev->dev_addr, +		&ic_myaddr, &ic_netmask, &ic_gateway); +	pr_info("     host=%s, domain=%s, nis-domain=%s\n", +		utsname()->nodename, ic_domain, utsname()->domainname); +	pr_info("     bootserver=%pI4, rootserver=%pI4, rootpath=%s", +		&ic_servaddr, &root_server_addr, root_server_path);  	if (ic_dev_mtu) -		printk(KERN_CONT ", mtu=%d", ic_dev_mtu); -	printk(KERN_CONT "\n"); +		pr_cont(", mtu=%d", ic_dev_mtu); +	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", i, &ic_nameservers[i]); +	pr_cont("\n");  #endif /* !SILENT */  	return 0; @@ -1551,6 +1605,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) { @@ -1594,6 +1650,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; @@ -1602,22 +1672,21 @@ static int __init ip_auto_config_setup(char *addrs)  	return 1;  } +__setup("ip=", ip_auto_config_setup);  static int __init nfsaddrs_config_setup(char *addrs)  {  	return ip_auto_config_setup(addrs);  } +__setup("nfsaddrs=", nfsaddrs_config_setup);  static int __init vendor_class_identifier_setup(char *addrs)  {  	if (strlcpy(vendor_class_identifier, addrs,  		    sizeof(vendor_class_identifier))  	    >= sizeof(vendor_class_identifier)) -		printk(KERN_WARNING "DHCP: vendorclass too long, truncated to \"%s\"", -		       vendor_class_identifier); +		pr_warn("DHCP: vendorclass too long, truncated to \"%s\"", +			vendor_class_identifier);  	return 1;  } - -__setup("ip=", ip_auto_config_setup); -__setup("nfsaddrs=", nfsaddrs_config_setup);  __setup("dhcpclass=", vendor_class_identifier_setup);  | 
