aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/ieee80211_i.h
diff options
context:
space:
mode:
authorChristian Lamparter <chunkeey@googlemail.com>2013-02-04 12:44:44 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-02-11 12:44:55 -0500
commitf9e124fbd8cbea974b5dc7e9dafddd17d21df7e2 (patch)
treef09c89096de26a4211d73742933260d5d240b58e /net/mac80211/ieee80211_i.h
parent601513aa208f27ea87400a410d42c978421530ec (diff)
mac80211: protect rx-path with spinlock
This patch fixes the problem which was discussed in "mac80211: Fix PN corruption in case of multiple virtual interface" [1]. Amit Shakya reported a serious issue with my patch: mac80211: serialize rx path workers" [2]: In case, ieee80211_rx_handlers processing is going on for skbs received on one vif and at the same time, rx aggregation reorder timer expires on another vif then sta_rx_agg_reorder_timer_expired is invoked and it will push skbs into the single queue (local->rx_skb_queue). ieee80211_rx_handlers in the while loop assumes that the skbs are for the same sdata and sta. This assumption doesn't hold good in this scenario and the PN gets corrupted by PN received in other vif's skb, causing traffic to stop due to PN mismatch." [1] Message-Id: http://mid.gmane.org/201302041844.44436.chunkeey@googlemail.com [2] Commit-Id: 24a8fdad35835e8d71f7 Reported-by: Amit Shakya <amit.shakya@stericsson.com> Signed-off-by: Christian Lamparter <chunkeey@googlemail.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/ieee80211_i.h')
-rw-r--r--net/mac80211/ieee80211_i.h9
1 files changed, 1 insertions, 8 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 5fe9db707880..080cf0942ce7 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -958,14 +958,7 @@ struct ieee80211_local {
958 struct sk_buff_head skb_queue; 958 struct sk_buff_head skb_queue;
959 struct sk_buff_head skb_queue_unreliable; 959 struct sk_buff_head skb_queue_unreliable;
960 960
961 /* 961 spinlock_t rx_path_lock;
962 * Internal FIFO queue which is shared between multiple rx path
963 * stages. Its main task is to provide a serialization mechanism,
964 * so all rx handlers can enjoy having exclusive access to their
965 * private data structures.
966 */
967 struct sk_buff_head rx_skb_queue;
968 bool running_rx_handler; /* protected by rx_skb_queue.lock */
969 962
970 /* Station data */ 963 /* Station data */
971 /* 964 /*