Ensure IF_READY is unset when link is not ready
Subsystems (3)
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
@@ -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
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
@@ -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
David Miller
maintainerFrom: 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_READYif device is downNow that we add the IPv6 device at registration time we don't need to set
IF_READYinipv6_add_devanymore because we will always get aNETDEV_UPevent later on should the device ever become ready.Signed-off-by Herbert Xu <[email protected]>
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.
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 +1100Quoted 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_READYif device is downNow that we add the IPv6 device at registration time we don't need to set
IF_READYinipv6_add_devanymore because we will always get aNETDEV_UPevent later on should the device ever become ready.
Quoted 8 lines
Quoted 1 line
Signed-off-by Herbert Xu <[email protected]>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_devcreation happened long after the device was registered.
I understand. Thanks.
And I thank Herbert to provide suitable fix.
Best Regards,
----
Mitsuru Chinen <[email protected]>