netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* "ADDRCONF(NETDEV_UP): eth0: link is not ready" with IPv6
@ 2012-06-29  2:36 Arvid Brodin
  2012-06-29 15:24 ` Ben Hutchings
  0 siblings, 1 reply; 8+ messages in thread
From: Arvid Brodin @ 2012-06-29  2:36 UTC (permalink / raw)
  To: netdev@vger.kernel.org; +Cc: Alexey Kuznetsov, Stephen Hemminger

Hi,

After 'ip link set eth0 up' on an avr32 board (network driver macb), the device ends up in
operational mode "UNKNOWN":

# ip link
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:24:74:00:17:9d brd ff:ff:ff:ff:ff:ff

Unplugging and plugging in the network cable gets the device to mode "UP".

This is a problem for me because I'm trying to use this device as a "slave" device (for a
virtual HSR device*) and I need to be able to decide if the slave device is operational or
not.

Following Stephen's advice here:
http://kerneltrap.org/mailarchive/linux-netdev/2008/9/24/3398834 I checked the macb.c code
and noticed they do not call netif_carrier_off() neither before register_netdev() nor in
dev_open().

I added the call before register_netdev(), which fixed the problem. However, if I then
enable IPv6:

# ip link set eth0 up
ADDRCONF(NETDEV_UP): eth0: link is not ready
eth0: link up (100/Full)
ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

Any idea what is happening / what I'm doing wrong? (This is not just cosmetic; is some
situations this seems to kill the interface - e.g. ping does not work, down/up does not
help...) Things work fine without IPv6 configured.


*N.B. I'm writing a driver for a network protocol called "High-availability Seamless
Redundancy".


-- 
Arvid Brodin | Consultant (Linux)
XDIN AB | Jan Stenbecks Torg 17 | SE-164 40 Kista | Sweden | xdin.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: "ADDRCONF(NETDEV_UP): eth0: link is not ready" with IPv6
  2012-06-29  2:36 "ADDRCONF(NETDEV_UP): eth0: link is not ready" with IPv6 Arvid Brodin
@ 2012-06-29 15:24 ` Ben Hutchings
  2012-07-03 15:47   ` Arvid Brodin
  0 siblings, 1 reply; 8+ messages in thread
From: Ben Hutchings @ 2012-06-29 15:24 UTC (permalink / raw)
  To: Arvid Brodin; +Cc: netdev@vger.kernel.org, Alexey Kuznetsov, Stephen Hemminger

On Fri, 2012-06-29 at 02:36 +0000, Arvid Brodin wrote:
> Hi,
> 
> After 'ip link set eth0 up' on an avr32 board (network driver macb), the device ends up in
> operational mode "UNKNOWN":
> 
> # ip link
> 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
>     link/ether 00:24:74:00:17:9d brd ff:ff:ff:ff:ff:ff
> 
> Unplugging and plugging in the network cable gets the device to mode "UP".
> 
> This is a problem for me because I'm trying to use this device as a "slave" device (for a
> virtual HSR device*) and I need to be able to decide if the slave device is operational or
> not.
> 
> Following Stephen's advice here:
> http://kerneltrap.org/mailarchive/linux-netdev/2008/9/24/3398834 I checked the macb.c code
> and noticed they do not call netif_carrier_off() neither before register_netdev() nor in
> dev_open().

It should be called after register_netdev() and before the driver's
ndo_open implementation returns.

> I added the call before register_netdev(), which fixed the problem. However, if I then
> enable IPv6:
>
> # ip link set eth0 up
> ADDRCONF(NETDEV_UP): eth0: link is not ready
> eth0: link up (100/Full)
> ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

This looks normal.

> Any idea what is happening / what I'm doing wrong? (This is not just cosmetic; is some
> situations this seems to kill the interface - e.g. ping does not work, down/up does not
> help...) Things work fine without IPv6 configured.

Perhaps some packets sent automatically by IPv6 are triggering a driver
bug?  Or there is a bug in multicast support, which IPv6 always uses.

Ben.

> *N.B. I'm writing a driver for a network protocol called "High-availability Seamless
> Redundancy".

-- 
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: "ADDRCONF(NETDEV_UP): eth0: link is not ready" with IPv6
  2012-06-29 15:24 ` Ben Hutchings
@ 2012-07-03 15:47   ` Arvid Brodin
  2012-07-03 15:55     ` Ben Hutchings
  2012-07-03 16:15     ` Nicolas Ferre
  0 siblings, 2 replies; 8+ messages in thread
From: Arvid Brodin @ 2012-07-03 15:47 UTC (permalink / raw)
  To: Ben Hutchings
  Cc: netdev@vger.kernel.org, Alexey Kuznetsov, Stephen Hemminger,
	Nicolas Ferre

(Added MACB "patch" contact Nicolas Ferre to CC list.)

On 2012-06-29 17:24, Ben Hutchings wrote:
> On Fri, 2012-06-29 at 02:36 +0000, Arvid Brodin wrote:
>> Hi,
>>
>> After 'ip link set eth0 up' on an avr32 board (network driver macb), the device ends up in
>> operational mode "UNKNOWN":
>>
>> # ip link
>> 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
>>     link/ether 00:24:74:00:17:9d brd ff:ff:ff:ff:ff:ff
>>
>> Unplugging and plugging in the network cable gets the device to mode "UP".
>>
>> This is a problem for me because I'm trying to use this device as a "slave" device (for a
>> virtual HSR device*) and I need to be able to decide if the slave device is operational or
>> not.
>>
>> Following Stephen's advice here:
>> http://kerneltrap.org/mailarchive/linux-netdev/2008/9/24/3398834 I checked the macb.c code
>> and noticed they do not call netif_carrier_off() neither before register_netdev() nor in
>> dev_open().
> 
> It should be called after register_netdev() and before the driver's
> ndo_open implementation returns.

I'm guessing this allows linkwatch to do netif_carrier_on() some time after the dev_open()?

Besides not calling netif_carrier_off() in dev_open(), the Cadence/MACB driver calls
netif_carrier_off() in dev_close(). Is this correct?


How should I handle carrier state for a virtual device? The device should have "carrier"
as long as at least one of the underlying physical interfaces is operational (which I
guess means operational state UP). Would it be correct to watch NETDEV_CHANGE and DOWN/UP
events of the slaves and call netif_carrier_on()/off() on the virtual device depending on
the slaves' states?


> 
>> I added the call before register_netdev(), which fixed the problem. However, if I then
>> enable IPv6:
>>
>> # ip link set eth0 up
>> ADDRCONF(NETDEV_UP): eth0: link is not ready
>> eth0: link up (100/Full)
>> ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
> 
> This looks normal.

Good, that narrows it down a bit.

> 
>> Any idea what is happening / what I'm doing wrong? (This is not just cosmetic; is some
>> situations this seems to kill the interface - e.g. ping does not work, down/up does not
>> help...) Things work fine without IPv6 configured.
> 
> Perhaps some packets sent automatically by IPv6 are triggering a driver
> bug?  Or there is a bug in multicast support, which IPv6 always uses.
> 
> Ben.
> 
>> *N.B. I'm writing a driver for a network protocol called "High-availability Seamless
>> Redundancy".
> 


-- 
Arvid Brodin | Consultant (Linux)
XDIN AB | Jan Stenbecks Torg 17 | SE-164 40 Kista | Sweden | xdin.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: "ADDRCONF(NETDEV_UP): eth0: link is not ready" with IPv6
  2012-07-03 15:47   ` Arvid Brodin
@ 2012-07-03 15:55     ` Ben Hutchings
  2012-07-03 16:15     ` Nicolas Ferre
  1 sibling, 0 replies; 8+ messages in thread
From: Ben Hutchings @ 2012-07-03 15:55 UTC (permalink / raw)
  To: Arvid Brodin
  Cc: netdev@vger.kernel.org, Alexey Kuznetsov, Stephen Hemminger,
	Nicolas Ferre

On Tue, 2012-07-03 at 15:47 +0000, Arvid Brodin wrote:
> (Added MACB "patch" contact Nicolas Ferre to CC list.)
> 
> On 2012-06-29 17:24, Ben Hutchings wrote:
> > On Fri, 2012-06-29 at 02:36 +0000, Arvid Brodin wrote:
> >> Hi,
> >>
> >> After 'ip link set eth0 up' on an avr32 board (network driver macb), the device ends up in
> >> operational mode "UNKNOWN":
> >>
> >> # ip link
> >> 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
> >>     link/ether 00:24:74:00:17:9d brd ff:ff:ff:ff:ff:ff
> >>
> >> Unplugging and plugging in the network cable gets the device to mode "UP".
> >>
> >> This is a problem for me because I'm trying to use this device as a "slave" device (for a
> >> virtual HSR device*) and I need to be able to decide if the slave device is operational or
> >> not.
> >>
> >> Following Stephen's advice here:
> >> http://kerneltrap.org/mailarchive/linux-netdev/2008/9/24/3398834 I checked the macb.c code
> >> and noticed they do not call netif_carrier_off() neither before register_netdev() nor in
> >> dev_open().
> > 
> > It should be called after register_netdev() and before the driver's
> > ndo_open implementation returns.
> 
> I'm guessing this allows linkwatch to do netif_carrier_on() some time after the dev_open()?

No, the driver is always responsible for calling
netif_carrier_{on,off}() in a timely manner.  link_watch takes care of
stopping the software TX queues if the link goes down.

> Besides not calling netif_carrier_off() in dev_open(), the Cadence/MACB driver calls
> netif_carrier_off() in dev_close(). Is this correct?

Unnecessary but harmless.

> How should I handle carrier state for a virtual device? The device should have "carrier"
> as long as at least one of the underlying physical interfaces is operational (which I
> guess means operational state UP). Would it be correct to watch NETDEV_CHANGE and DOWN/UP
> events of the slaves and call netif_carrier_on()/off() on the virtual device depending on
> the slaves' states?
[...]

That sounds about right.

Ben.

-- 
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: "ADDRCONF(NETDEV_UP): eth0: link is not ready" with IPv6
  2012-07-03 15:47   ` Arvid Brodin
  2012-07-03 15:55     ` Ben Hutchings
@ 2012-07-03 16:15     ` Nicolas Ferre
  2012-07-04  0:30       ` Ben Hutchings
  1 sibling, 1 reply; 8+ messages in thread
From: Nicolas Ferre @ 2012-07-03 16:15 UTC (permalink / raw)
  To: Arvid Brodin, Ben Hutchings
  Cc: netdev@vger.kernel.org, Alexey Kuznetsov, Stephen Hemminger,
	linux-arm-kernel

On 07/03/2012 05:47 PM, Arvid Brodin :
> (Added MACB "patch" contact Nicolas Ferre to CC list.)

Hi,

(adding linux-arm-kernel)

> On 2012-06-29 17:24, Ben Hutchings wrote:
>> On Fri, 2012-06-29 at 02:36 +0000, Arvid Brodin wrote:
>>> Hi,
>>>
>>> After 'ip link set eth0 up' on an avr32 board (network driver macb), the device ends up in
>>> operational mode "UNKNOWN":
>>>
>>> # ip link
>>> 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
>>>     link/ether 00:24:74:00:17:9d brd ff:ff:ff:ff:ff:ff
>>>
>>> Unplugging and plugging in the network cable gets the device to mode "UP".
>>>
>>> This is a problem for me because I'm trying to use this device as a "slave" device (for a
>>> virtual HSR device*) and I need to be able to decide if the slave device is operational or
>>> not.
>>>
>>> Following Stephen's advice here:
>>> http://kerneltrap.org/mailarchive/linux-netdev/2008/9/24/3398834 I checked the macb.c code
>>> and noticed they do not call netif_carrier_off() neither before register_netdev() nor in
>>> dev_open().
>
>> It should be called after register_netdev() and before the driver's
>> ndo_open implementation returns.

After having read several drivers, it seems that some are calling
netif_carrier_off() *before* register_netdev() and some *after*... What
is the proper way?


> I'm guessing this allows linkwatch to do netif_carrier_on() some time after the dev_open()?
> 
> Besides not calling netif_carrier_off() in dev_open(), the Cadence/MACB driver calls
> netif_carrier_off() in dev_close(). Is this correct?
> 
> 
> How should I handle carrier state for a virtual device? The device should have "carrier"
> as long as at least one of the underlying physical interfaces is operational (which I
> guess means operational state UP). Would it be correct to watch NETDEV_CHANGE and DOWN/UP
> events of the slaves and call netif_carrier_on()/off() on the virtual device depending on
> the slaves' states? 
>>
>>> I added the call before register_netdev(), which fixed the problem. However, if I then
>>> enable IPv6:
>>>
>>> # ip link set eth0 up
>>> ADDRCONF(NETDEV_UP): eth0: link is not ready
>>> eth0: link up (100/Full)
>>> ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
>>
>> This looks normal.
> 
> Good, that narrows it down a bit.
> 
>>
>>> Any idea what is happening / what I'm doing wrong? (This is not just cosmetic; is some
>>> situations this seems to kill the interface - e.g. ping does not work, down/up does not
>>> help...) Things work fine without IPv6 configured.
>>
>> Perhaps some packets sent automatically by IPv6 are triggering a driver
>> bug?  Or there is a bug in multicast support, which IPv6 always uses.

Sorry, I have no clue on this topic. But I am eager to know if you find
something. I can queue your patch for netif_carrier_off() at least...

Best regards,
-- 
Nicolas Ferre

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: "ADDRCONF(NETDEV_UP): eth0: link is not ready" with IPv6
  2012-07-03 16:15     ` Nicolas Ferre
@ 2012-07-04  0:30       ` Ben Hutchings
  2012-07-04  9:14         ` [PATCH] net/macb: manage carrier state with call to netif_carrier_{on|off}() Nicolas Ferre
  0 siblings, 1 reply; 8+ messages in thread
From: Ben Hutchings @ 2012-07-04  0:30 UTC (permalink / raw)
  To: Nicolas Ferre
  Cc: Arvid Brodin, netdev@vger.kernel.org, Alexey Kuznetsov,
	Stephen Hemminger, linux-arm-kernel

On Tue, 2012-07-03 at 18:15 +0200, Nicolas Ferre wrote:
> On 07/03/2012 05:47 PM, Arvid Brodin :
> > (Added MACB "patch" contact Nicolas Ferre to CC list.)
> 
> Hi,
> 
> (adding linux-arm-kernel)
> 
> > On 2012-06-29 17:24, Ben Hutchings wrote:
> >> On Fri, 2012-06-29 at 02:36 +0000, Arvid Brodin wrote:
> >>> Hi,
> >>>
> >>> After 'ip link set eth0 up' on an avr32 board (network driver macb), the device ends up in
> >>> operational mode "UNKNOWN":
> >>>
> >>> # ip link
> >>> 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
> >>>     link/ether 00:24:74:00:17:9d brd ff:ff:ff:ff:ff:ff
> >>>
> >>> Unplugging and plugging in the network cable gets the device to mode "UP".
> >>>
> >>> This is a problem for me because I'm trying to use this device as a "slave" device (for a
> >>> virtual HSR device*) and I need to be able to decide if the slave device is operational or
> >>> not.
> >>>
> >>> Following Stephen's advice here:
> >>> http://kerneltrap.org/mailarchive/linux-netdev/2008/9/24/3398834 I checked the macb.c code
> >>> and noticed they do not call netif_carrier_off() neither before register_netdev() nor in
> >>> dev_open().
> >
> >> It should be called after register_netdev() and before the driver's
> >> ndo_open implementation returns.
> 
> After having read several drivers, it seems that some are calling
> netif_carrier_off() *before* register_netdev() and some *after*... What
> is the proper way?
[...]

The latter is correct; the former is a bug that is tolerated for now:

http://article.gmane.org/gmane.linux.network/111355/

Ben.

-- 
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH] net/macb: manage carrier state with call to netif_carrier_{on|off}()
  2012-07-04  0:30       ` Ben Hutchings
@ 2012-07-04  9:14         ` Nicolas Ferre
  2012-07-09  7:03           ` David Miller
  0 siblings, 1 reply; 8+ messages in thread
From: Nicolas Ferre @ 2012-07-04  9:14 UTC (permalink / raw)
  To: netdev, bhutchings, Arvid.Brodin
  Cc: kuznet, shemminger, linux-arm-kernel, davem, Nicolas Ferre

OFF carrier state is setup in probe() open() and suspend() functions.
The carrier ON state is managed in macb_handle_link_change().

Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
---
Hi,

This patch follows the discussion about IPv6 and macb interface
("ADDRCONF(NETDEV_UP): eth0: link is not ready" with IPv6)
It may not address all aspects of the discussion, so please do comments...

I am still wondering if netif_carrier_off() is needed in macb_probe() *after*
the call to register_netdev() in addition to its inclusion in the open()
function. As I saw it in sevral drivers, I kept it.

I have tested several suspend/resume loops, and I think that just calling
netif_carrier_off() in suspend() function is sufficient: am I right?

Thanks for your help,
Best regards,

 drivers/net/ethernet/cadence/macb.c |   13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c
index 1466bc4..033064b 100644
--- a/drivers/net/ethernet/cadence/macb.c
+++ b/drivers/net/ethernet/cadence/macb.c
@@ -179,13 +179,16 @@ static void macb_handle_link_change(struct net_device *dev)
 	spin_unlock_irqrestore(&bp->lock, flags);
 
 	if (status_change) {
-		if (phydev->link)
+		if (phydev->link) {
+			netif_carrier_on(dev);
 			netdev_info(dev, "link up (%d/%s)\n",
 				    phydev->speed,
 				    phydev->duplex == DUPLEX_FULL ?
 				    "Full" : "Half");
-		else
+		} else {
+			netif_carrier_off(dev);
 			netdev_info(dev, "link down\n");
+		}
 	}
 }
 
@@ -1033,6 +1036,9 @@ static int macb_open(struct net_device *dev)
 
 	netdev_dbg(bp->dev, "open\n");
 
+	/* carrier starts down */
+	netif_carrier_off(dev);
+
 	/* if the phy is not yet register, retry later*/
 	if (!bp->phy_dev)
 		return -EAGAIN;
@@ -1406,6 +1412,8 @@ static int __init macb_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, dev);
 
+	netif_carrier_off(dev);
+
 	netdev_info(dev, "Cadence %s at 0x%08lx irq %d (%pM)\n",
 		    macb_is_gem(bp) ? "GEM" : "MACB", dev->base_addr,
 		    dev->irq, dev->dev_addr);
@@ -1469,6 +1477,7 @@ static int macb_suspend(struct platform_device *pdev, pm_message_t state)
 	struct net_device *netdev = platform_get_drvdata(pdev);
 	struct macb *bp = netdev_priv(netdev);
 
+	netif_carrier_off(netdev);
 	netif_device_detach(netdev);
 
 	clk_disable(bp->hclk);
-- 
1.7.10

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] net/macb: manage carrier state with call to netif_carrier_{on|off}()
  2012-07-04  9:14         ` [PATCH] net/macb: manage carrier state with call to netif_carrier_{on|off}() Nicolas Ferre
@ 2012-07-09  7:03           ` David Miller
  0 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2012-07-09  7:03 UTC (permalink / raw)
  To: nicolas.ferre
  Cc: netdev, bhutchings, Arvid.Brodin, kuznet, shemminger,
	linux-arm-kernel

From: Nicolas Ferre <nicolas.ferre@atmel.com>
Date: Wed, 4 Jul 2012 11:14:13 +0200

> OFF carrier state is setup in probe() open() and suspend() functions.
> The carrier ON state is managed in macb_handle_link_change().
> 
> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>

Applied to net-next, thanks.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2012-07-09  7:03 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-29  2:36 "ADDRCONF(NETDEV_UP): eth0: link is not ready" with IPv6 Arvid Brodin
2012-06-29 15:24 ` Ben Hutchings
2012-07-03 15:47   ` Arvid Brodin
2012-07-03 15:55     ` Ben Hutchings
2012-07-03 16:15     ` Nicolas Ferre
2012-07-04  0:30       ` Ben Hutchings
2012-07-04  9:14         ` [PATCH] net/macb: manage carrier state with call to netif_carrier_{on|off}() Nicolas Ferre
2012-07-09  7:03           ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).