diff options
Diffstat (limited to 'net/mac80211/agg-rx.c')
-rw-r--r-- | net/mac80211/agg-rx.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index 31bf2586fb84..d38c49b644cd 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c | |||
@@ -52,7 +52,7 @@ static void ieee80211_free_tid_rx(struct rcu_head *h) | |||
52 | del_timer_sync(&tid_rx->reorder_timer); | 52 | del_timer_sync(&tid_rx->reorder_timer); |
53 | 53 | ||
54 | for (i = 0; i < tid_rx->buf_size; i++) | 54 | for (i = 0; i < tid_rx->buf_size; i++) |
55 | dev_kfree_skb(tid_rx->reorder_buf[i]); | 55 | __skb_queue_purge(&tid_rx->reorder_buf[i]); |
56 | kfree(tid_rx->reorder_buf); | 56 | kfree(tid_rx->reorder_buf); |
57 | kfree(tid_rx->reorder_time); | 57 | kfree(tid_rx->reorder_time); |
58 | kfree(tid_rx); | 58 | kfree(tid_rx); |
@@ -232,7 +232,7 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | |||
232 | struct tid_ampdu_rx *tid_agg_rx; | 232 | struct tid_ampdu_rx *tid_agg_rx; |
233 | u16 capab, tid, timeout, ba_policy, buf_size, start_seq_num, status; | 233 | u16 capab, tid, timeout, ba_policy, buf_size, start_seq_num, status; |
234 | u8 dialog_token; | 234 | u8 dialog_token; |
235 | int ret = -EOPNOTSUPP; | 235 | int i, ret = -EOPNOTSUPP; |
236 | 236 | ||
237 | /* extract session parameters from addba request frame */ | 237 | /* extract session parameters from addba request frame */ |
238 | dialog_token = mgmt->u.action.u.addba_req.dialog_token; | 238 | dialog_token = mgmt->u.action.u.addba_req.dialog_token; |
@@ -308,7 +308,7 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | |||
308 | 308 | ||
309 | /* prepare reordering buffer */ | 309 | /* prepare reordering buffer */ |
310 | tid_agg_rx->reorder_buf = | 310 | tid_agg_rx->reorder_buf = |
311 | kcalloc(buf_size, sizeof(struct sk_buff *), GFP_KERNEL); | 311 | kcalloc(buf_size, sizeof(struct sk_buff_head), GFP_KERNEL); |
312 | tid_agg_rx->reorder_time = | 312 | tid_agg_rx->reorder_time = |
313 | kcalloc(buf_size, sizeof(unsigned long), GFP_KERNEL); | 313 | kcalloc(buf_size, sizeof(unsigned long), GFP_KERNEL); |
314 | if (!tid_agg_rx->reorder_buf || !tid_agg_rx->reorder_time) { | 314 | if (!tid_agg_rx->reorder_buf || !tid_agg_rx->reorder_time) { |
@@ -318,6 +318,9 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | |||
318 | goto end; | 318 | goto end; |
319 | } | 319 | } |
320 | 320 | ||
321 | for (i = 0; i < buf_size; i++) | ||
322 | __skb_queue_head_init(&tid_agg_rx->reorder_buf[i]); | ||
323 | |||
321 | ret = drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_START, | 324 | ret = drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_START, |
322 | &sta->sta, tid, &start_seq_num, 0); | 325 | &sta->sta, tid, &start_seq_num, 0); |
323 | ht_dbg(sta->sdata, "Rx A-MPDU request on %pM tid %d result %d\n", | 326 | ht_dbg(sta->sdata, "Rx A-MPDU request on %pM tid %d result %d\n", |