diff options
Diffstat (limited to 'net/mac80211/agg-rx.c')
| -rw-r--r-- | net/mac80211/agg-rx.c | 73 | 
1 files changed, 24 insertions, 49 deletions
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index a978e666ed6..9598fdb4ad0 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c @@ -14,6 +14,7 @@   */  #include <linux/ieee80211.h> +#include <linux/slab.h>  #include <net/mac80211.h>  #include "ieee80211_i.h"  #include "driver-ops.h" @@ -22,19 +23,20 @@ void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,  				    u16 initiator, u16 reason)  {  	struct ieee80211_local *local = sta->local; +	struct tid_ampdu_rx *tid_rx;  	int i; -	/* check if TID is in operational state */  	spin_lock_bh(&sta->lock); -	if (sta->ampdu_mlme.tid_state_rx[tid] != HT_AGG_STATE_OPERATIONAL) { + +	/* check if TID is in operational state */ +	if (!sta->ampdu_mlme.tid_active_rx[tid]) {  		spin_unlock_bh(&sta->lock);  		return;  	} -	sta->ampdu_mlme.tid_state_rx[tid] = -		HT_AGG_STATE_REQ_STOP_BA_MSK | -		(initiator << HT_AGG_STATE_INITIATOR_SHIFT); -	spin_unlock_bh(&sta->lock); +	sta->ampdu_mlme.tid_active_rx[tid] = false; + +	tid_rx = sta->ampdu_mlme.tid_rx[tid];  #ifdef CONFIG_MAC80211_HT_DEBUG  	printk(KERN_DEBUG "Rx BA session stop requested for %pM tid %u\n", @@ -46,61 +48,35 @@ void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,  		printk(KERN_DEBUG "HW problem - can not stop rx "  				"aggregation for tid %d\n", tid); -	/* shutdown timer has not expired */ -	if (initiator != WLAN_BACK_TIMER) -		del_timer_sync(&sta->ampdu_mlme.tid_rx[tid]->session_timer); -  	/* check if this is a self generated aggregation halt */ -	if (initiator == WLAN_BACK_RECIPIENT || initiator == WLAN_BACK_TIMER) +	if (initiator == WLAN_BACK_RECIPIENT)  		ieee80211_send_delba(sta->sdata, sta->sta.addr,  				     tid, 0, reason);  	/* free the reordering buffer */ -	for (i = 0; i < sta->ampdu_mlme.tid_rx[tid]->buf_size; i++) { -		if (sta->ampdu_mlme.tid_rx[tid]->reorder_buf[i]) { +	for (i = 0; i < tid_rx->buf_size; i++) { +		if (tid_rx->reorder_buf[i]) {  			/* release the reordered frames */ -			dev_kfree_skb(sta->ampdu_mlme.tid_rx[tid]->reorder_buf[i]); -			sta->ampdu_mlme.tid_rx[tid]->stored_mpdu_num--; -			sta->ampdu_mlme.tid_rx[tid]->reorder_buf[i] = NULL; +			dev_kfree_skb(tid_rx->reorder_buf[i]); +			tid_rx->stored_mpdu_num--; +			tid_rx->reorder_buf[i] = NULL;  		}  	} -	spin_lock_bh(&sta->lock);  	/* free resources */ -	kfree(sta->ampdu_mlme.tid_rx[tid]->reorder_buf); -	kfree(sta->ampdu_mlme.tid_rx[tid]->reorder_time); +	kfree(tid_rx->reorder_buf); +	kfree(tid_rx->reorder_time); +	sta->ampdu_mlme.tid_rx[tid] = NULL; -	if (!sta->ampdu_mlme.tid_rx[tid]->shutdown) { -		kfree(sta->ampdu_mlme.tid_rx[tid]); -		sta->ampdu_mlme.tid_rx[tid] = NULL; -	} - -	sta->ampdu_mlme.tid_state_rx[tid] = HT_AGG_STATE_IDLE;  	spin_unlock_bh(&sta->lock); -} - -void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid, -					u16 initiator, u16 reason) -{ -	struct sta_info *sta; - -	rcu_read_lock(); - -	sta = sta_info_get(sdata, ra); -	if (!sta) { -		rcu_read_unlock(); -		return; -	} - -	__ieee80211_stop_rx_ba_session(sta, tid, initiator, reason); -	rcu_read_unlock(); +	del_timer_sync(&tid_rx->session_timer); +	kfree(tid_rx);  }  /*   * After accepting the AddBA Request we activated a timer,   * resetting it after each frame that arrives from the originator. - * if this timer expires ieee80211_sta_stop_rx_ba_session will be executed.   */  static void sta_rx_agg_session_timer_expired(unsigned long data)  { @@ -116,9 +92,8 @@ static void sta_rx_agg_session_timer_expired(unsigned long data)  #ifdef CONFIG_MAC80211_HT_DEBUG  	printk(KERN_DEBUG "rx session timer expired on tid %d\n", (u16)*ptid);  #endif -	ieee80211_sta_stop_rx_ba_session(sta->sdata, sta->sta.addr, -					 (u16)*ptid, WLAN_BACK_TIMER, -					 WLAN_REASON_QSTA_TIMEOUT); +	__ieee80211_stop_rx_ba_session(sta, *ptid, WLAN_BACK_RECIPIENT, +				       WLAN_REASON_QSTA_TIMEOUT);  }  static void ieee80211_send_addba_resp(struct ieee80211_sub_if_data *sdata, u8 *da, u16 tid, @@ -193,7 +168,7 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,  	status = WLAN_STATUS_REQUEST_DECLINED; -	if (test_sta_flags(sta, WLAN_STA_SUSPEND)) { +	if (test_sta_flags(sta, WLAN_STA_BLOCK_BA)) {  #ifdef CONFIG_MAC80211_HT_DEBUG  		printk(KERN_DEBUG "Suspend in progress. "  		       "Denying ADDBA request\n"); @@ -231,7 +206,7 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,  	/* examine state machine */  	spin_lock_bh(&sta->lock); -	if (sta->ampdu_mlme.tid_state_rx[tid] != HT_AGG_STATE_IDLE) { +	if (sta->ampdu_mlme.tid_active_rx[tid]) {  #ifdef CONFIG_MAC80211_HT_DEBUG  		if (net_ratelimit())  			printk(KERN_DEBUG "unexpected AddBA Req from " @@ -293,7 +268,7 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,  	}  	/* change state and send addba resp */ -	sta->ampdu_mlme.tid_state_rx[tid] = HT_AGG_STATE_OPERATIONAL; +	sta->ampdu_mlme.tid_active_rx[tid] = true;  	tid_agg_rx->dialog_token = dialog_token;  	tid_agg_rx->ssn = start_seq_num;  	tid_agg_rx->head_seq_num = start_seq_num;  |