Skip to contentSkip to conversation

Ensure IF_READY is unset when link is not ready

PATCH In review Mitsuru Chinen 3 participants 4 messages Mar 5, 2007 – Mar 8, 2007

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Ensure IF_READY is unset when link is not ready

Hi there,

On linux-2.6.21-rc2 or later, IPv6 link-local address is not assigned to some kind of interfaces during system start-up. (I found this issue occures with e100, e1000 and tg3.)

This issue comes from the change that inet6_dev is allocated when NETDEV_REGISTER event occurs. The allocation code is at ipv6_add_dev() in net/ipv6/addrinfo.c. At the code, IF_READY bit would be set when the link is ready. The link readyness is verified by netif_caeeir_ok(). However as the drivers don't call netif_carrier_off() prior to calling register_netdev(), netif_caeeir_ok() returns true in spite of the actual link state.

Here's a work around patch. This make IF_READY unset when NETDEV_UP event occurs and the link is not ready. This patch may not be an fundamental fix. But I don't have any other idea now.

---
 net/ipv6/addrconf.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
net/ipv6/addrconf.c +1 -0
index e16f1bb..1593cd1 100644
@@ -2196,6 +2196,7 @@ static int addrconf_notify(struct notifi
 					"ADDRCONF(NETDEV_UP): %s: "
 					"link is not ready\n",
 					dev->name);
+				idev->if_flags &= ~IF_READY;
 				break;
 			}
 
Signature · 1 line
1.4.3.4
#1 lore raw
Quoted 4 lines · Mitsuru Chinen

On linux-2.6.21-rc2 or later, IPv6 link-local address is not assigned to some kind of interfaces during system start-up. (I found this issue occures with e100, e1000 and tg3.)

Here is an alternative fix.

[IPV6]: Do not set IF_READY if device is down

Now that we add the IPv6 device at registration time we don't need to set IF_READY in ipv6_add_dev anymore because we will always get a NETDEV_UP event later on should the device ever become ready.

Cheers,

Signature · 5 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
net/ipv6/addrconf.c +0 -4
index e16f1bb..a7fee6b 100644
@@ -342,10 +342,6 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
 	}
 #endif
 
-	if (netif_carrier_ok(dev))
-		ndev->if_flags |= IF_READY;
-
-
 	ipv6_mc_init_dev(ndev);
 	ndev->tstamp = jiffies;
 #ifdef CONFIG_SYSCTL
maintainer
#2 lore raw

From: Herbert Xu <[email protected]>
Date: Thu, 08 Mar 2007 10:47:56 +1100

Quoted 8 lines
Quoted 4 lines · Mitsuru Chinen

On linux-2.6.21-rc2 or later, IPv6 link-local address is not assigned to some kind of interfaces during system start-up. (I found this issue occures with e100, e1000 and tg3.)

Here is an alternative fix.

Quoted 7 lines

[IPV6]: Do not set IF_READY if device is down

Now that we add the IPv6 device at registration time we don't need to set IF_READY in ipv6_add_dev anymore because we will always get a NETDEV_UP event later on should the device ever become ready.

Indeed, this looks like it will do the right thing.

And if you look into the history of the code in this area I think you'll find that this snippet being removed existed exactly because inet6_dev creation happened long after the device was registered.

#3 lore raw
Quoted 17 lines · On Wed, 07 Mar 2007 15:54:38 -0800 (PST) David Miller <[email protected]>…

From: Herbert Xu <[email protected]>
Date: Thu, 08 Mar 2007 10:47:56 +1100

Quoted 14 lines
Quoted 4 lines · Mitsuru Chinen

On linux-2.6.21-rc2 or later, IPv6 link-local address is not assigned to some kind of interfaces during system start-up. (I found this issue occures with e100, e1000 and tg3.)

Here is an alternative fix.

[IPV6]: Do not set IF_READY if device is down

Now that we add the IPv6 device at registration time we don't need to set IF_READY in ipv6_add_dev anymore because we will always get a NETDEV_UP event later on should the device ever become ready.

Quoted 8 lines
Quoted 1 line

Indeed, this looks like it will do the right thing.

And if you look into the history of the code in this area I think you'll find that this snippet being removed existed exactly because inet6_dev creation happened long after the device was registered.

I understand. Thanks.
And I thank Herbert to provide suitable fix.

Best Regards,
----
Mitsuru Chinen <[email protected]>