1
0
Fork 0
alistair23-linux/net/mac80211
Emmanuel Grumbach 2a1e0fd175 mac80211: fix race between the AGG SM and the Tx data path
When a packet is supposed to sent be as an a-MPDU, mac80211 sets
IEEE80211_TX_CTL_AMPDU to let the driver know. On the other
hand, mac80211 configures the driver for aggregration with the
ampdu_action callback.
There is race between these two mechanisms since the following
scenario can occur when the BA agreement is torn down:

Tx softIRQ	 			drv configuration
==========				=================

check OPERATIONAL bit
Set the TX_CTL_AMPDU bit in the packet

					clear OPERATIONAL bit
					stop Tx AGG
Pass Tx packet to the driver.

In that case the driver would get a packet with TX_CTL_AMPDU set
although it has already been notified that the BA session has been
torn down.

To fix this, we need to synchronize all the Qdisc activity after we
cleared the OPERATIONAL bit. After that step, all the following
packets will be buffered until the driver reports it is ready to get
new packets for this RA / TID. This buffering allows not to run into
another race that would send packets with TX_CTL_AMPDU unset while
the driver hasn't been requested to tear down the BA session yet.

This race occurs in practice and iwlwifi complains with a WARN_ON
when it happens.

Cc: stable@kernel.org
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Reviewed-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2011-11-28 13:46:41 -05:00
..
Kconfig mac80211: handle TDLS high-level commands and frames 2011-09-30 15:57:07 -04:00
Makefile mac80211: add the minstrel_ht rate control algorithm 2010-06-02 16:12:59 -04:00
aes_ccm.c mac80211: use AES_BLOCK_SIZE 2011-07-08 11:11:24 -04:00
aes_ccm.h mac80211: use AES_BLOCK_SIZE 2011-07-08 11:11:24 -04:00
aes_cmac.c mac80211: use AES_BLOCK_SIZE 2011-07-08 11:11:24 -04:00
aes_cmac.h mac80211: fix CMAC races 2011-07-08 11:11:20 -04:00
agg-rx.c Merge branch 'master' of git://git.infradead.org/users/linville/wireless-next into for-davem 2011-10-11 15:35:42 -04:00
agg-tx.c mac80211: fix race between the AGG SM and the Tx data path 2011-11-28 13:46:41 -05:00
cfg.c mac80211: Fix TDLS support validation in add_station handler 2011-11-02 15:23:12 -04:00
cfg.h [MAC80211]: rename ieee80211_cfg.h to cfg.h 2007-10-10 16:52:34 -07:00
chan.c mac80211: fix channel type recalculation with HT and non-HT interfaces 2011-03-14 14:46:58 -04:00
debugfs.c mac80211: add ieee80211_vif param to tsf functions 2011-09-27 14:27:48 -04:00
debugfs.h mac80211: refactor debugfs function generation code 2010-11-15 13:24:48 -05:00
debugfs_key.c mac80211: fix CMAC races 2011-07-08 11:11:20 -04:00
debugfs_key.h mac80211: support separate default keys 2010-12-13 15:23:29 -05:00
debugfs_netdev.c mac80211: add ieee80211_vif param to tsf functions 2011-09-27 14:27:48 -04:00
debugfs_netdev.h mac80211: reduce reliance on netdev 2009-12-21 18:38:52 -05:00
debugfs_sta.c mac80211: Fix AMSDU rate printout in debugfs. 2011-11-21 14:45:19 -05:00
debugfs_sta.h mac80211: RCU-ify STA info structure access 2008-03-06 15:30:46 -05:00
driver-ops.h mac80211: pass vif param to conf_tx() callback 2011-10-03 15:22:41 -04:00
driver-trace.c mac80211: fix sparse warnings/errors 2009-08-04 16:43:25 -04:00
driver-trace.h mac80211: allow out-of-band EOSP notification 2011-09-30 15:57:23 -04:00
event.c cfg80211: use proper allocation flags 2009-07-10 15:01:49 -04:00
ht.c mac80211: optimise station flags 2011-09-30 15:57:19 -04:00
ibss.c Merge branch 'master' of git://git.infradead.org/users/linville/wireless-next into for-davem 2011-10-11 15:35:42 -04:00
ieee80211_i.h mac80211: disable powersave for broken APs 2011-11-02 15:23:13 -04:00
iface.c Merge branch 'master' of git://git.infradead.org/users/linville/wireless-next into for-davem 2011-10-11 15:35:42 -04:00
key.c mac80211: optimise station flags 2011-09-30 15:57:19 -04:00
key.h mac80211: allow driver to disconnect after resume 2011-07-13 14:49:43 -04:00
led.c mac80211: remove stray extern 2011-01-05 16:07:12 -05:00
led.h mac80211: selective throughput LED trigger active 2010-12-22 14:33:37 -05:00
main.c Merge branch 'pm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm 2011-10-25 15:18:39 +02:00
mesh.c mac80211: standardize adding supported rates IEs 2011-09-30 15:57:06 -04:00
mesh.h mac80211: standardize adding supported rates IEs 2011-09-30 15:57:06 -04:00
mesh_hwmp.c mac80211: Fix regression that allowed mpaths between non-peers. 2011-10-11 16:41:12 -04:00
mesh_pathtbl.c Merge branch 'master' of ssh://infradead/~/public_git/wireless-next into for-davem 2011-09-19 15:00:16 -04:00
mesh_plink.c mac80211: optimise station flags 2011-09-30 15:57:19 -04:00
michael.c mac80211: remove ieee80211_get_hdr_info 2008-07-08 14:16:01 -04:00
michael.h mac80211: remove ieee80211_get_hdr_info 2008-07-08 14:16:01 -04:00
mlme.c mac80211: fix race between connection monitor & suspend 2011-11-09 14:35:56 -05:00
offchannel.c mac80211: Optimize scans on current operating channel. 2011-02-04 16:30:32 -05:00
pm.c mac80211: optimise station flags 2011-09-30 15:57:19 -04:00
rate.c mac80211: Send nullfunc frames at lower rate during connection monitor 2011-10-03 15:22:32 -04:00
rate.h mac80211: add the minstrel_ht rate control algorithm 2010-06-02 16:12:59 -04:00
rc80211_minstrel.c minstrel_ht: fixed rate mode through debugfs 2011-06-01 15:12:29 -04:00
rc80211_minstrel.h minstrel_ht: fixed rate mode through debugfs 2011-06-01 15:12:29 -04:00
rc80211_minstrel_debugfs.c llseek: automatically add .llseek fop 2010-10-15 15:53:27 +02:00
rc80211_minstrel_ht.c mac80211: max_tp_rate2 management of minstrel_ht 2011-09-30 15:16:25 -04:00
rc80211_minstrel_ht.h minstrel_ht: move minstrel_mcs_groups declaration to header file 2010-06-24 15:42:18 -04:00
rc80211_minstrel_ht_debugfs.c mac80211: disallow seeks in minstrel debug code 2010-09-16 10:33:17 +02:00
rc80211_pid.h Fix common misspellings 2011-03-31 11:26:23 -03:00
rc80211_pid_algo.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
rc80211_pid_debugfs.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6 2010-10-23 11:47:02 -07:00
rx.c mac80211: fix NULL dereference in radiotap code 2011-11-09 14:35:55 -05:00
scan.c Merge branch 'pm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm 2011-10-25 15:18:39 +02:00
spectmgmt.c mac80211: Remove unnecessary OOM logging messages 2011-09-13 15:45:02 -04:00
sta_info.c mac80211: uAPSD - fix IEEE80211_FCTL_MOREDATA bit setting 2011-11-07 13:19:15 -05:00
sta_info.h mac80211: optimise station flags 2011-09-30 15:57:19 -04:00
status.c mac80211: Fix endian bug in radiotap header generation 2011-11-21 14:45:20 -05:00
tkip.c mac80211: allow driver access to TKIP RX P1K 2011-07-15 13:38:32 -04:00
tkip.h mac80211: fix TKIP races, make API easier to use 2011-07-08 11:11:19 -04:00
tx.c mac80211: reformat TX unauthorised check 2011-10-14 14:48:16 -04:00
util.c mac80211: fix bug in ieee80211_build_probe_req 2011-11-09 14:35:55 -05:00
wep.c mac80211: remove the dependency on crypto_blkcipher 2011-04-04 16:20:00 -04:00
wep.h mac80211: remove the dependency on crypto_blkcipher 2011-04-04 16:20:00 -04:00
wme.c mac80211: optimise station flags 2011-09-30 15:57:19 -04:00
wme.h mac80211: Mesh data frames must have the QoS header 2011-09-14 13:56:50 -04:00
work.c mac80211: config hw when going back on-channel 2011-11-02 15:23:11 -04:00
wpa.c mac80211: move fragment flag to info flag as dont-fragment 2011-10-11 16:41:19 -04:00
wpa.h mac80211: 802.11w - Add BIP (AES-128-CMAC) 2009-01-29 16:00:02 -05:00