diff options
Diffstat (limited to 'net/ipv4/ipconfig.c')
| -rw-r--r-- | net/ipv4/ipconfig.c | 19 | 
1 files changed, 15 insertions, 4 deletions
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index 0da2afc97f3..7e4ec9fc2ce 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c @@ -253,6 +253,10 @@ static int __init ic_open_devs(void)  		}  	} +	/* 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;  	while (jiffies - start < msecs_to_jiffies(CONF_CARRIER_TIMEOUT)) { @@ -763,13 +767,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)); @@ -822,8 +828,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");  }  |