linux/net/sched
Michael Marineau 22604c8668 net: Fix for initial link state in 2.6.28
From: Michael Marineau <mike@marineau.org>

Commit b47300168e "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: David S. Miller <davem@davemloft.net>
2009-01-04 17:18:51 -08:00
..
act_api.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_gact.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_ipt.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_mirred.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_nat.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_pedit.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_police.c pkt_sched: gen_estimator: Optimize gen_estimator_active() 2008-11-26 15:24:32 -08:00
act_simple.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
act_skbedit.c tc: propogate errors from tcf_hash_create 2008-11-25 21:13:25 -08:00
cls_api.c pkt_sched: remove unnecessary xchg() in packet classifiers 2008-11-20 04:14:28 -08:00
cls_basic.c pkt_sched: remove unnecessary xchg() in packet classifiers 2008-11-20 04:14:28 -08:00
cls_cgroup.c cls_cgroup: clean up for cgroup part 2008-12-29 19:40:45 -08:00
cls_flow.c CRED: Use creds in file structs 2008-11-14 10:39:25 +11:00
cls_fw.c pkt_sched: remove unnecessary xchg() in packet classifiers 2008-11-20 04:14:28 -08:00
cls_route.c pkt_sched: remove unnecessary xchg() in packet classifiers 2008-11-20 04:14:28 -08:00
cls_rsvp.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
cls_rsvp.h [NET_SCHED]: Use nla_policy for attribute validation in classifiers 2008-01-28 15:11:23 -08:00
cls_rsvp6.c [NET_SCHED]: Remove unnecessary includes 2007-07-10 22:16:41 -07:00
cls_tcindex.c pkt_sched: remove unnecessary xchg() in packet classifiers 2008-11-20 04:14:28 -08:00
cls_u32.c pkt_sched: remove unnecessary xchg() in packet classifiers 2008-11-20 04:14:28 -08:00
em_cmp.c net: em_cmp.c use unaligned access helpers 2008-09-22 19:20:51 -07:00
em_meta.c [IPV4]: Add 'rtable' field in struct sk_buff to alias 'dst' and avoid casts 2008-03-05 18:30:47 -08:00
em_nbyte.c [NET_SCHED]: ematch: module autoloading 2007-07-11 19:46:26 -07:00
em_text.c [NET_SCHED]: Convert classifiers from rtnetlink to new netlink API 2008-01-28 15:11:11 -08:00
em_u32.c [PKT_SCHED]: annotate cls_u32 2008-03-17 22:46:46 -07:00
ematch.c ematch: simpler tcf_em_unregister() 2008-11-16 23:01:49 -08:00
Kconfig cls_cgroup: clean up Kconfig 2008-12-29 19:40:46 -08:00
Makefile pkt_sched: add DRR scheduler 2008-11-20 04:10:00 -08:00
sch_api.c pkt_sched: Remove smp_wmb() in qdisc_watchdog() 2008-12-22 19:44:13 -08:00
sch_atm.c pkt_sched: remove unnecessary xchg() in packet schedulers 2008-11-20 04:11:36 -08:00
sch_blackhole.c pkt_sched: Add qdisc->ops->peek() implementation. 2008-10-31 00:45:55 -07:00
sch_cbq.c tc: check for errors in gen_rate_estimator creation 2008-11-25 21:13:31 -08:00
sch_drr.c tc: check for errors in gen_rate_estimator creation 2008-11-25 21:13:31 -08:00
sch_dsmark.c pkt_sched: remove unnecessary xchg() in packet schedulers 2008-11-20 04:11:36 -08:00
sch_fifo.c pkt_sched: Remove qdisc->ops->requeue() etc. 2008-11-13 22:56:30 -08:00
sch_generic.c net: Fix for initial link state in 2.6.28 2009-01-04 17:18:51 -08:00
sch_gred.c pkt_sched: Remove qdisc->ops->requeue() etc. 2008-11-13 22:56:30 -08:00
sch_hfsc.c tc: check for errors in gen_rate_estimator creation 2008-11-25 21:13:31 -08:00
sch_htb.c pkt_sched: sch_htb: Optimize WARN_ONs in htb_dequeue_tree() etc. 2008-12-09 22:35:02 -08:00
sch_ingress.c net_sched: Add accessor function for packet length for qdiscs 2008-07-20 00:08:27 -07:00
sch_multiq.c pkt_sched: remove unnecessary xchg() in packet schedulers 2008-11-20 04:11:36 -08:00
sch_netem.c pkt_sched: Remove smp_wmb() in qdisc_watchdog() 2008-12-22 19:44:13 -08:00
sch_prio.c pkt_sched: remove unnecessary xchg() in packet schedulers 2008-11-20 04:11:36 -08:00
sch_red.c pkt_sched: remove unnecessary xchg() in packet schedulers 2008-11-20 04:11:36 -08:00
sch_sfq.c pkt_sched: Annotate uninitialized var in sfq_enqueue() 2008-12-21 20:14:48 -08:00
sch_tbf.c pkt_sched: remove unnecessary xchg() in packet schedulers 2008-11-20 04:11:36 -08:00
sch_teql.c pkt_sched: Remove qdisc->ops->requeue() etc. 2008-11-13 22:56:30 -08:00