]> git.baikalelectronics.ru Git - kernel.git/commit
mac80211: fix TX aggregation start/stop callback race
authorJohannes Berg <johannes.berg@intel.com>
Fri, 26 May 2017 22:27:25 +0000 (00:27 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 30 May 2017 07:08:40 +0000 (09:08 +0200)
commitdb07cc75ef3813239eb569e974202b791e3c62be
tree5af401a86137d6e3ec642bc86cd5ab6b3e418428
parented59488032ada8384f4d4ba9f85f402c212b5fbd
mac80211: fix TX aggregation start/stop callback race

When starting or stopping an aggregation session, one of the steps
is that the driver calls back to mac80211 that the start/stop can
proceed. This is handled by queueing up a fake SKB and processing
it from the normal iface/sdata work. Since this isn't flushed when
disassociating, the following race is possible:

 * associate
 * start aggregation session
 * driver callback
 * disassociate
 * associate again to the same AP
 * callback processing runs, leading to a WARN_ON() that
   the TID hadn't requested aggregation

If the second association isn't to the same AP, there would only
be a message printed ("Could not find station: <addr>"), but the
same race could happen.

Fix this by not going the whole detour with a fake SKB etc. but
simply looking up the aggregation session in the driver callback,
marking it with a START_CB/STOP_CB bit and then scheduling the
regular aggregation work that will now process these bits as well.
This also simplifies the code and gets rid of the whole problem
with allocation failures of said skb, which could have left the
session in limbo.

Reported-by: Jouni Malinen <j@w1.fi>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/agg-tx.c
net/mac80211/ht.c
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/sta_info.h