diff options
author | Johannes Berg <johannes.berg@intel.com> | 2010-06-10 04:21:35 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-06-14 15:39:26 -0400 |
commit | bed7ee6e44cb7633a4f9821688a6c7ae977615ed (patch) | |
tree | 0c4997408d74abbde021b11b6b1046d815524e15 /net/mac80211/iface.c | |
parent | 77a121c3a88eb00a4b5e753d083dbb7d49fefb0a (diff) |
mac80211: always process blockack action from workqueue
To prepare for making the ampdu_action callback
sleep, make mac80211 always process blockack
action frames from the skb queue. This gets rid
of the current special case for managed mode
interfaces as well.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/iface.c')
-rw-r--r-- | net/mac80211/iface.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 1bf276d7024b..7a3dbde9979e 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
@@ -724,7 +724,36 @@ static void ieee80211_iface_work(struct work_struct *work) | |||
724 | 724 | ||
725 | /* first process frames */ | 725 | /* first process frames */ |
726 | while ((skb = skb_dequeue(&sdata->skb_queue))) { | 726 | while ((skb = skb_dequeue(&sdata->skb_queue))) { |
727 | switch (sdata->vif.type) { | 727 | struct ieee80211_mgmt *mgmt = (void *)skb->data; |
728 | |||
729 | if (ieee80211_is_action(mgmt->frame_control) && | ||
730 | mgmt->u.action.category == WLAN_CATEGORY_BACK) { | ||
731 | int len = skb->len; | ||
732 | struct sta_info *sta; | ||
733 | |||
734 | rcu_read_lock(); | ||
735 | sta = sta_info_get(sdata, mgmt->sa); | ||
736 | if (sta) { | ||
737 | switch (mgmt->u.action.u.addba_req.action_code) { | ||
738 | case WLAN_ACTION_ADDBA_REQ: | ||
739 | ieee80211_process_addba_request( | ||
740 | local, sta, mgmt, len); | ||
741 | break; | ||
742 | case WLAN_ACTION_ADDBA_RESP: | ||
743 | ieee80211_process_addba_resp(local, sta, | ||
744 | mgmt, len); | ||
745 | break; | ||
746 | case WLAN_ACTION_DELBA: | ||
747 | ieee80211_process_delba(sdata, sta, | ||
748 | mgmt, len); | ||
749 | break; | ||
750 | default: | ||
751 | WARN_ON(1); | ||
752 | break; | ||
753 | } | ||
754 | } | ||
755 | rcu_read_unlock(); | ||
756 | } else switch (sdata->vif.type) { | ||
728 | case NL80211_IFTYPE_STATION: | 757 | case NL80211_IFTYPE_STATION: |
729 | ieee80211_sta_rx_queued_mgmt(sdata, skb); | 758 | ieee80211_sta_rx_queued_mgmt(sdata, skb); |
730 | break; | 759 | break; |