• Michael Marineau's avatar
    net: Fix for initial link state in 2.6.28 · 22604c86
    Michael Marineau authored
    From: Michael Marineau <mike@marineau.org>
    
    Commit b4730016 "Do not fire linkwatch
    events until the device is registered." was made as a workaround for
    drivers that call netif_carrier_off before registering the device.
    Unfortunately this causes these drivers to incorrectly report their
    link status as IF_OPER_UNKNOWN which can falsely set the IFF_RUNNING
    flag when the interface is first brought up. This issues was
    previously pointed out[1] but was dismissed saying that IFF_RUNNING is
    not related to the link status. From my digging IFF_RUNNING, as
    reported to userspace, is based on the link state. It is set based on
    __LINK_STATE_START and IF_OPER_UP or IF_OPER_UNKNOWN. See [2], [3],
    and [4]. (Whether or not the kernel has IFF_RUNNING set in flags is
    not reported to user space so it may well be independent of the link,
    I don't know if and when it may get set.)
    
    The end result depends slightly depending on the driver. The the two I
    tested were e1000e and b44. With e1000e if the system is booted
    without a network cable attached the interface will falsely report
    RUNNING when it is brought up causing NetworkManager to attempt to
    start it and eventually time out. With b44 when the system is booted
    with a network cable attached and brought up with dhcpcd it will time
    out the first time.
    
    The attached patch that will still set the operstate variable
    correctly to IF_OPER_UP/DOWN/etc when linkwatch_fire_event is called
    but then return rather than skipping the linkwatch_fire_event call
    entirely as the previous fix did. (sorry it isn't inline, I don't have
    a patch friendly email client at the moment)
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    22604c86
link_watch.c 4.95 KB