1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <linux/ieee80211.h>
18#include <linux/slab.h>
19#include <linux/export.h>
20#include <net/mac80211.h>
21#include "ieee80211_i.h"
22#include "driver-ops.h"
23#include "wme.h"
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
64 const u8 *da, u16 tid,
65 u8 dialog_token, u16 start_seq_num,
66 u16 agg_size, u16 timeout)
67{
68 struct ieee80211_local *local = sdata->local;
69 struct sk_buff *skb;
70 struct ieee80211_mgmt *mgmt;
71 u16 capab;
72
73 skb = dev_alloc_skb(sizeof(*mgmt) + local->hw.extra_tx_headroom);
74
75 if (!skb)
76 return;
77
78 skb_reserve(skb, local->hw.extra_tx_headroom);
79 mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
80 memset(mgmt, 0, 24);
81 memcpy(mgmt->da, da, ETH_ALEN);
82 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
83 if (sdata->vif.type == NL80211_IFTYPE_AP ||
84 sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
85 sdata->vif.type == NL80211_IFTYPE_MESH_POINT)
86 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
87 else if (sdata->vif.type == NL80211_IFTYPE_STATION)
88 memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
89 else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
90 memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
91
92 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
93 IEEE80211_STYPE_ACTION);
94
95 skb_put(skb, 1 + sizeof(mgmt->u.action.u.addba_req));
96
97 mgmt->u.action.category = WLAN_CATEGORY_BACK;
98 mgmt->u.action.u.addba_req.action_code = WLAN_ACTION_ADDBA_REQ;
99
100 mgmt->u.action.u.addba_req.dialog_token = dialog_token;
101 capab = (u16)(1 << 0);
102 capab |= (u16)(1 << 1);
103 capab |= (u16)(tid << 2);
104 capab |= (u16)(agg_size << 6);
105
106 mgmt->u.action.u.addba_req.capab = cpu_to_le16(capab);
107
108 mgmt->u.action.u.addba_req.timeout = cpu_to_le16(timeout);
109 mgmt->u.action.u.addba_req.start_seq_num =
110 cpu_to_le16(start_seq_num << 4);
111
112 ieee80211_tx_skb(sdata, skb);
113}
114
115void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn)
116{
117 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
118 struct ieee80211_local *local = sdata->local;
119 struct sk_buff *skb;
120 struct ieee80211_bar *bar;
121 u16 bar_control = 0;
122
123 skb = dev_alloc_skb(sizeof(*bar) + local->hw.extra_tx_headroom);
124 if (!skb)
125 return;
126
127 skb_reserve(skb, local->hw.extra_tx_headroom);
128 bar = (struct ieee80211_bar *)skb_put(skb, sizeof(*bar));
129 memset(bar, 0, sizeof(*bar));
130 bar->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL |
131 IEEE80211_STYPE_BACK_REQ);
132 memcpy(bar->ra, ra, ETH_ALEN);
133 memcpy(bar->ta, sdata->vif.addr, ETH_ALEN);
134 bar_control |= (u16)IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL;
135 bar_control |= (u16)IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA;
136 bar_control |= (u16)(tid << IEEE80211_BAR_CTRL_TID_INFO_SHIFT);
137 bar->control = cpu_to_le16(bar_control);
138 bar->start_seq_num = cpu_to_le16(ssn);
139
140 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |
141 IEEE80211_TX_CTL_REQ_TX_STATUS;
142 ieee80211_tx_skb_tid(sdata, skb, tid);
143}
144EXPORT_SYMBOL(ieee80211_send_bar);
145
146void ieee80211_assign_tid_tx(struct sta_info *sta, int tid,
147 struct tid_ampdu_tx *tid_tx)
148{
149 lockdep_assert_held(&sta->ampdu_mlme.mtx);
150 lockdep_assert_held(&sta->lock);
151 rcu_assign_pointer(sta->ampdu_mlme.tid_tx[tid], tid_tx);
152}
153
154
155
156
157
158
159
160
161
162
163
164
165static void __acquires(agg_queue)
166ieee80211_stop_queue_agg(struct ieee80211_sub_if_data *sdata, int tid)
167{
168 int queue = sdata->vif.hw_queue[ieee80211_ac_from_tid(tid)];
169
170
171
172 if (atomic_inc_return(&sdata->local->agg_queue_stop[queue]) == 1)
173 ieee80211_stop_queue_by_reason(
174 &sdata->local->hw, queue,
175 IEEE80211_QUEUE_STOP_REASON_AGGREGATION,
176 false);
177 __acquire(agg_queue);
178}
179
180static void __releases(agg_queue)
181ieee80211_wake_queue_agg(struct ieee80211_sub_if_data *sdata, int tid)
182{
183 int queue = sdata->vif.hw_queue[ieee80211_ac_from_tid(tid)];
184
185 if (atomic_dec_return(&sdata->local->agg_queue_stop[queue]) == 0)
186 ieee80211_wake_queue_by_reason(
187 &sdata->local->hw, queue,
188 IEEE80211_QUEUE_STOP_REASON_AGGREGATION,
189 false);
190 __release(agg_queue);
191}
192
193static void
194ieee80211_agg_stop_txq(struct sta_info *sta, int tid)
195{
196 struct ieee80211_txq *txq = sta->sta.txq[tid];
197 struct ieee80211_sub_if_data *sdata;
198 struct fq *fq;
199 struct txq_info *txqi;
200
201 if (!txq)
202 return;
203
204 txqi = to_txq_info(txq);
205 sdata = vif_to_sdata(txq->vif);
206 fq = &sdata->local->fq;
207
208
209 spin_lock_bh(&fq->lock);
210 set_bit(IEEE80211_TXQ_STOP, &txqi->flags);
211 spin_unlock_bh(&fq->lock);
212}
213
214static void
215ieee80211_agg_start_txq(struct sta_info *sta, int tid, bool enable)
216{
217 struct ieee80211_txq *txq = sta->sta.txq[tid];
218 struct txq_info *txqi;
219
220 if (!txq)
221 return;
222
223 txqi = to_txq_info(txq);
224
225 if (enable)
226 set_bit(IEEE80211_TXQ_AMPDU, &txqi->flags);
227 else
228 clear_bit(IEEE80211_TXQ_AMPDU, &txqi->flags);
229
230 clear_bit(IEEE80211_TXQ_STOP, &txqi->flags);
231 drv_wake_tx_queue(sta->sdata->local, txqi);
232}
233
234
235
236
237
238static void __acquires(agg_queue)
239ieee80211_agg_splice_packets(struct ieee80211_sub_if_data *sdata,
240 struct tid_ampdu_tx *tid_tx, u16 tid)
241{
242 struct ieee80211_local *local = sdata->local;
243 int queue = sdata->vif.hw_queue[ieee80211_ac_from_tid(tid)];
244 unsigned long flags;
245
246 ieee80211_stop_queue_agg(sdata, tid);
247
248 if (WARN(!tid_tx,
249 "TID %d gone but expected when splicing aggregates from the pending queue\n",
250 tid))
251 return;
252
253 if (!skb_queue_empty(&tid_tx->pending)) {
254 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
255
256 skb_queue_splice_tail_init(&tid_tx->pending,
257 &local->pending[queue]);
258 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
259 }
260}
261
262static void __releases(agg_queue)
263ieee80211_agg_splice_finish(struct ieee80211_sub_if_data *sdata, u16 tid)
264{
265 ieee80211_wake_queue_agg(sdata, tid);
266}
267
268static void ieee80211_remove_tid_tx(struct sta_info *sta, int tid)
269{
270 struct tid_ampdu_tx *tid_tx;
271
272 lockdep_assert_held(&sta->ampdu_mlme.mtx);
273 lockdep_assert_held(&sta->lock);
274
275 tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
276
277
278
279
280
281
282
283
284
285
286
287 ieee80211_agg_splice_packets(sta->sdata, tid_tx, tid);
288
289
290 ieee80211_assign_tid_tx(sta, tid, NULL);
291
292 ieee80211_agg_splice_finish(sta->sdata, tid);
293 ieee80211_agg_start_txq(sta, tid, false);
294
295 kfree_rcu(tid_tx, rcu_head);
296}
297
298int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
299 enum ieee80211_agg_stop_reason reason)
300{
301 struct ieee80211_local *local = sta->local;
302 struct tid_ampdu_tx *tid_tx;
303 struct ieee80211_ampdu_params params = {
304 .sta = &sta->sta,
305 .tid = tid,
306 .buf_size = 0,
307 .amsdu = false,
308 .timeout = 0,
309 .ssn = 0,
310 };
311 int ret;
312
313 lockdep_assert_held(&sta->ampdu_mlme.mtx);
314
315 switch (reason) {
316 case AGG_STOP_DECLINED:
317 case AGG_STOP_LOCAL_REQUEST:
318 case AGG_STOP_PEER_REQUEST:
319 params.action = IEEE80211_AMPDU_TX_STOP_CONT;
320 break;
321 case AGG_STOP_DESTROY_STA:
322 params.action = IEEE80211_AMPDU_TX_STOP_FLUSH;
323 break;
324 default:
325 WARN_ON_ONCE(1);
326 return -EINVAL;
327 }
328
329 spin_lock_bh(&sta->lock);
330
331 tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
332 if (!tid_tx) {
333 spin_unlock_bh(&sta->lock);
334 return -ENOENT;
335 }
336
337
338
339
340
341 if (test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) {
342 spin_unlock_bh(&sta->lock);
343 if (reason != AGG_STOP_DESTROY_STA)
344 return -EALREADY;
345 params.action = IEEE80211_AMPDU_TX_STOP_FLUSH_CONT;
346 ret = drv_ampdu_action(local, sta->sdata, ¶ms);
347 WARN_ON_ONCE(ret);
348 return 0;
349 }
350
351 if (test_bit(HT_AGG_STATE_WANT_START, &tid_tx->state)) {
352
353 ieee80211_assign_tid_tx(sta, tid, NULL);
354 spin_unlock_bh(&sta->lock);
355 kfree_rcu(tid_tx, rcu_head);
356 return 0;
357 }
358
359 set_bit(HT_AGG_STATE_STOPPING, &tid_tx->state);
360
361 spin_unlock_bh(&sta->lock);
362
363 ht_dbg(sta->sdata, "Tx BA session stop requested for %pM tid %u\n",
364 sta->sta.addr, tid);
365
366 del_timer_sync(&tid_tx->addba_resp_timer);
367 del_timer_sync(&tid_tx->session_timer);
368
369
370
371
372
373
374 clear_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state);
375
376
377
378
379
380
381
382
383
384
385
386
387
388 synchronize_net();
389
390 tid_tx->stop_initiator = reason == AGG_STOP_PEER_REQUEST ?
391 WLAN_BACK_RECIPIENT :
392 WLAN_BACK_INITIATOR;
393 tid_tx->tx_stop = reason == AGG_STOP_LOCAL_REQUEST;
394
395 ret = drv_ampdu_action(local, sta->sdata, ¶ms);
396
397
398 if (WARN_ON(ret)) {
399
400
401
402
403 }
404
405
406
407
408
409
410
411
412
413
414
415 return 0;
416}
417
418
419
420
421
422
423static void sta_addba_resp_timer_expired(unsigned long data)
424{
425
426
427
428
429 u16 tid = *(u8 *)data;
430 struct sta_info *sta = container_of((void *)data,
431 struct sta_info, timer_to_tid[tid]);
432 struct tid_ampdu_tx *tid_tx;
433
434
435 rcu_read_lock();
436 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
437 if (!tid_tx ||
438 test_bit(HT_AGG_STATE_RESPONSE_RECEIVED, &tid_tx->state)) {
439 rcu_read_unlock();
440 ht_dbg(sta->sdata,
441 "timer expired on %pM tid %d but we are not (or no longer) expecting addBA response there\n",
442 sta->sta.addr, tid);
443 return;
444 }
445
446 ht_dbg(sta->sdata, "addBA response timer expired on %pM tid %d\n",
447 sta->sta.addr, tid);
448
449 ieee80211_stop_tx_ba_session(&sta->sta, tid);
450 rcu_read_unlock();
451}
452
453void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
454{
455 struct tid_ampdu_tx *tid_tx;
456 struct ieee80211_local *local = sta->local;
457 struct ieee80211_sub_if_data *sdata = sta->sdata;
458 struct ieee80211_ampdu_params params = {
459 .sta = &sta->sta,
460 .action = IEEE80211_AMPDU_TX_START,
461 .tid = tid,
462 .buf_size = 0,
463 .amsdu = false,
464 .timeout = 0,
465 };
466 int ret;
467
468 tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
469
470
471
472
473
474
475 clear_bit(HT_AGG_STATE_WANT_START, &tid_tx->state);
476
477 ieee80211_agg_stop_txq(sta, tid);
478
479
480
481
482
483
484
485 synchronize_net();
486
487 params.ssn = sta->tid_seq[tid] >> 4;
488 ret = drv_ampdu_action(local, sdata, ¶ms);
489 if (ret) {
490 ht_dbg(sdata,
491 "BA request denied - HW unavailable for %pM tid %d\n",
492 sta->sta.addr, tid);
493 spin_lock_bh(&sta->lock);
494 ieee80211_agg_splice_packets(sdata, tid_tx, tid);
495 ieee80211_assign_tid_tx(sta, tid, NULL);
496 ieee80211_agg_splice_finish(sdata, tid);
497 spin_unlock_bh(&sta->lock);
498
499 ieee80211_agg_start_txq(sta, tid, false);
500
501 kfree_rcu(tid_tx, rcu_head);
502 return;
503 }
504
505
506 mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL);
507 ht_dbg(sdata, "activated addBA response timer on %pM tid %d\n",
508 sta->sta.addr, tid);
509
510 spin_lock_bh(&sta->lock);
511 sta->ampdu_mlme.last_addba_req_time[tid] = jiffies;
512 sta->ampdu_mlme.addba_req_num[tid]++;
513 spin_unlock_bh(&sta->lock);
514
515
516 ieee80211_send_addba_request(sdata, sta->sta.addr, tid,
517 tid_tx->dialog_token, params.ssn,
518 IEEE80211_MAX_AMPDU_BUF,
519 tid_tx->timeout);
520}
521
522
523
524
525
526static void sta_tx_agg_session_timer_expired(unsigned long data)
527{
528
529
530
531
532 u8 *ptid = (u8 *)data;
533 u8 *timer_to_id = ptid - *ptid;
534 struct sta_info *sta = container_of(timer_to_id, struct sta_info,
535 timer_to_tid[0]);
536 struct tid_ampdu_tx *tid_tx;
537 unsigned long timeout;
538
539 rcu_read_lock();
540 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[*ptid]);
541 if (!tid_tx || test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) {
542 rcu_read_unlock();
543 return;
544 }
545
546 timeout = tid_tx->last_tx + TU_TO_JIFFIES(tid_tx->timeout);
547 if (time_is_after_jiffies(timeout)) {
548 mod_timer(&tid_tx->session_timer, timeout);
549 rcu_read_unlock();
550 return;
551 }
552
553 rcu_read_unlock();
554
555 ht_dbg(sta->sdata, "tx session timer expired on %pM tid %d\n",
556 sta->sta.addr, (u16)*ptid);
557
558 ieee80211_stop_tx_ba_session(&sta->sta, *ptid);
559}
560
561int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
562 u16 timeout)
563{
564 struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
565 struct ieee80211_sub_if_data *sdata = sta->sdata;
566 struct ieee80211_local *local = sdata->local;
567 struct tid_ampdu_tx *tid_tx;
568 int ret = 0;
569
570 trace_api_start_tx_ba_session(pubsta, tid);
571
572 if (WARN(sta->reserved_tid == tid,
573 "Requested to start BA session on reserved tid=%d", tid))
574 return -EINVAL;
575
576 if (!pubsta->ht_cap.ht_supported)
577 return -EINVAL;
578
579 if (WARN_ON_ONCE(!local->ops->ampdu_action))
580 return -EINVAL;
581
582 if ((tid >= IEEE80211_NUM_TIDS) ||
583 !ieee80211_hw_check(&local->hw, AMPDU_AGGREGATION) ||
584 ieee80211_hw_check(&local->hw, TX_AMPDU_SETUP_IN_HW))
585 return -EINVAL;
586
587 if (WARN_ON(tid >= IEEE80211_FIRST_TSPEC_TSID))
588 return -EINVAL;
589
590 ht_dbg(sdata, "Open BA session requested for %pM tid %u\n",
591 pubsta->addr, tid);
592
593 if (sdata->vif.type != NL80211_IFTYPE_STATION &&
594 sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
595 sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
596 sdata->vif.type != NL80211_IFTYPE_AP &&
597 sdata->vif.type != NL80211_IFTYPE_ADHOC)
598 return -EINVAL;
599
600 if (test_sta_flag(sta, WLAN_STA_BLOCK_BA)) {
601 ht_dbg(sdata,
602 "BA sessions blocked - Denying BA session request %pM tid %d\n",
603 sta->sta.addr, tid);
604 return -EINVAL;
605 }
606
607
608
609
610
611
612
613
614
615
616
617
618
619 if (sta->sdata->vif.type == NL80211_IFTYPE_ADHOC &&
620 !sta->sta.ht_cap.ht_supported) {
621 ht_dbg(sdata,
622 "BA request denied - IBSS STA %pM does not advertise HT support\n",
623 pubsta->addr);
624 return -EINVAL;
625 }
626
627 spin_lock_bh(&sta->lock);
628
629
630 if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_MAX_RETRIES) {
631 ret = -EBUSY;
632 goto err_unlock_sta;
633 }
634
635
636
637
638
639
640 if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_BURST_RETRIES &&
641 time_before(jiffies, sta->ampdu_mlme.last_addba_req_time[tid] +
642 HT_AGG_RETRIES_PERIOD)) {
643 ht_dbg(sdata,
644 "BA request denied - waiting a grace period after %d failed requests on %pM tid %u\n",
645 sta->ampdu_mlme.addba_req_num[tid], sta->sta.addr, tid);
646 ret = -EBUSY;
647 goto err_unlock_sta;
648 }
649
650 tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
651
652 if (tid_tx || sta->ampdu_mlme.tid_start_tx[tid]) {
653 ht_dbg(sdata,
654 "BA request denied - session is not idle on %pM tid %u\n",
655 sta->sta.addr, tid);
656 ret = -EAGAIN;
657 goto err_unlock_sta;
658 }
659
660
661 tid_tx = kzalloc(sizeof(struct tid_ampdu_tx), GFP_ATOMIC);
662 if (!tid_tx) {
663 ret = -ENOMEM;
664 goto err_unlock_sta;
665 }
666
667 skb_queue_head_init(&tid_tx->pending);
668 __set_bit(HT_AGG_STATE_WANT_START, &tid_tx->state);
669
670 tid_tx->timeout = timeout;
671
672
673 tid_tx->addba_resp_timer.function = sta_addba_resp_timer_expired;
674 tid_tx->addba_resp_timer.data = (unsigned long)&sta->timer_to_tid[tid];
675 init_timer(&tid_tx->addba_resp_timer);
676
677
678 tid_tx->session_timer.function = sta_tx_agg_session_timer_expired;
679 tid_tx->session_timer.data = (unsigned long)&sta->timer_to_tid[tid];
680 init_timer_deferrable(&tid_tx->session_timer);
681
682
683 sta->ampdu_mlme.dialog_token_allocator++;
684 tid_tx->dialog_token = sta->ampdu_mlme.dialog_token_allocator;
685
686
687
688
689
690 sta->ampdu_mlme.tid_start_tx[tid] = tid_tx;
691
692 ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work);
693
694
695 err_unlock_sta:
696 spin_unlock_bh(&sta->lock);
697 return ret;
698}
699EXPORT_SYMBOL(ieee80211_start_tx_ba_session);
700
701static void ieee80211_agg_tx_operational(struct ieee80211_local *local,
702 struct sta_info *sta, u16 tid)
703{
704 struct tid_ampdu_tx *tid_tx;
705 struct ieee80211_ampdu_params params = {
706 .sta = &sta->sta,
707 .action = IEEE80211_AMPDU_TX_OPERATIONAL,
708 .tid = tid,
709 .timeout = 0,
710 .ssn = 0,
711 };
712
713 lockdep_assert_held(&sta->ampdu_mlme.mtx);
714
715 tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
716 params.buf_size = tid_tx->buf_size;
717 params.amsdu = tid_tx->amsdu;
718
719 ht_dbg(sta->sdata, "Aggregation is on for %pM tid %d\n",
720 sta->sta.addr, tid);
721
722 drv_ampdu_action(local, sta->sdata, ¶ms);
723
724
725
726
727
728 spin_lock_bh(&sta->lock);
729
730 ieee80211_agg_splice_packets(sta->sdata, tid_tx, tid);
731
732
733
734
735
736 set_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state);
737 ieee80211_agg_splice_finish(sta->sdata, tid);
738
739 spin_unlock_bh(&sta->lock);
740
741 ieee80211_agg_start_txq(sta, tid, true);
742}
743
744void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid)
745{
746 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
747 struct ieee80211_local *local = sdata->local;
748 struct sta_info *sta;
749 struct tid_ampdu_tx *tid_tx;
750
751 trace_api_start_tx_ba_cb(sdata, ra, tid);
752
753 if (tid >= IEEE80211_NUM_TIDS) {
754 ht_dbg(sdata, "Bad TID value: tid = %d (>= %d)\n",
755 tid, IEEE80211_NUM_TIDS);
756 return;
757 }
758
759 mutex_lock(&local->sta_mtx);
760 sta = sta_info_get_bss(sdata, ra);
761 if (!sta) {
762 mutex_unlock(&local->sta_mtx);
763 ht_dbg(sdata, "Could not find station: %pM\n", ra);
764 return;
765 }
766
767 mutex_lock(&sta->ampdu_mlme.mtx);
768 tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
769
770 if (WARN_ON(!tid_tx)) {
771 ht_dbg(sdata, "addBA was not requested!\n");
772 goto unlock;
773 }
774
775 if (WARN_ON(test_and_set_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state)))
776 goto unlock;
777
778 if (test_bit(HT_AGG_STATE_RESPONSE_RECEIVED, &tid_tx->state))
779 ieee80211_agg_tx_operational(local, sta, tid);
780
781 unlock:
782 mutex_unlock(&sta->ampdu_mlme.mtx);
783 mutex_unlock(&local->sta_mtx);
784}
785
786void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif,
787 const u8 *ra, u16 tid)
788{
789 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
790 struct ieee80211_local *local = sdata->local;
791 struct ieee80211_ra_tid *ra_tid;
792 struct sk_buff *skb = dev_alloc_skb(0);
793
794 if (unlikely(!skb))
795 return;
796
797 ra_tid = (struct ieee80211_ra_tid *) &skb->cb;
798 memcpy(&ra_tid->ra, ra, ETH_ALEN);
799 ra_tid->tid = tid;
800
801 skb->pkt_type = IEEE80211_SDATA_QUEUE_AGG_START;
802 skb_queue_tail(&sdata->skb_queue, skb);
803 ieee80211_queue_work(&local->hw, &sdata->work);
804}
805EXPORT_SYMBOL(ieee80211_start_tx_ba_cb_irqsafe);
806
807int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
808 enum ieee80211_agg_stop_reason reason)
809{
810 int ret;
811
812 mutex_lock(&sta->ampdu_mlme.mtx);
813
814 ret = ___ieee80211_stop_tx_ba_session(sta, tid, reason);
815
816 mutex_unlock(&sta->ampdu_mlme.mtx);
817
818 return ret;
819}
820
821int ieee80211_stop_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid)
822{
823 struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
824 struct ieee80211_sub_if_data *sdata = sta->sdata;
825 struct ieee80211_local *local = sdata->local;
826 struct tid_ampdu_tx *tid_tx;
827 int ret = 0;
828
829 trace_api_stop_tx_ba_session(pubsta, tid);
830
831 if (!local->ops->ampdu_action)
832 return -EINVAL;
833
834 if (tid >= IEEE80211_NUM_TIDS)
835 return -EINVAL;
836
837 spin_lock_bh(&sta->lock);
838 tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
839
840 if (!tid_tx) {
841 ret = -ENOENT;
842 goto unlock;
843 }
844
845 WARN(sta->reserved_tid == tid,
846 "Requested to stop BA session on reserved tid=%d", tid);
847
848 if (test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) {
849
850 ret = 0;
851 goto unlock;
852 }
853
854 set_bit(HT_AGG_STATE_WANT_STOP, &tid_tx->state);
855 ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work);
856
857 unlock:
858 spin_unlock_bh(&sta->lock);
859 return ret;
860}
861EXPORT_SYMBOL(ieee80211_stop_tx_ba_session);
862
863void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid)
864{
865 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
866 struct ieee80211_local *local = sdata->local;
867 struct sta_info *sta;
868 struct tid_ampdu_tx *tid_tx;
869 bool send_delba = false;
870
871 trace_api_stop_tx_ba_cb(sdata, ra, tid);
872
873 if (tid >= IEEE80211_NUM_TIDS) {
874 ht_dbg(sdata, "Bad TID value: tid = %d (>= %d)\n",
875 tid, IEEE80211_NUM_TIDS);
876 return;
877 }
878
879 ht_dbg(sdata, "Stopping Tx BA session for %pM tid %d\n", ra, tid);
880
881 mutex_lock(&local->sta_mtx);
882
883 sta = sta_info_get_bss(sdata, ra);
884 if (!sta) {
885 ht_dbg(sdata, "Could not find station: %pM\n", ra);
886 goto unlock;
887 }
888
889 mutex_lock(&sta->ampdu_mlme.mtx);
890 spin_lock_bh(&sta->lock);
891 tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
892
893 if (!tid_tx || !test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) {
894 ht_dbg(sdata,
895 "unexpected callback to A-MPDU stop for %pM tid %d\n",
896 sta->sta.addr, tid);
897 goto unlock_sta;
898 }
899
900 if (tid_tx->stop_initiator == WLAN_BACK_INITIATOR && tid_tx->tx_stop)
901 send_delba = true;
902
903 ieee80211_remove_tid_tx(sta, tid);
904
905 unlock_sta:
906 spin_unlock_bh(&sta->lock);
907
908 if (send_delba)
909 ieee80211_send_delba(sdata, ra, tid,
910 WLAN_BACK_INITIATOR, WLAN_REASON_QSTA_NOT_USE);
911
912 mutex_unlock(&sta->ampdu_mlme.mtx);
913 unlock:
914 mutex_unlock(&local->sta_mtx);
915}
916
917void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif,
918 const u8 *ra, u16 tid)
919{
920 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
921 struct ieee80211_local *local = sdata->local;
922 struct ieee80211_ra_tid *ra_tid;
923 struct sk_buff *skb = dev_alloc_skb(0);
924
925 if (unlikely(!skb))
926 return;
927
928 ra_tid = (struct ieee80211_ra_tid *) &skb->cb;
929 memcpy(&ra_tid->ra, ra, ETH_ALEN);
930 ra_tid->tid = tid;
931
932 skb->pkt_type = IEEE80211_SDATA_QUEUE_AGG_STOP;
933 skb_queue_tail(&sdata->skb_queue, skb);
934 ieee80211_queue_work(&local->hw, &sdata->work);
935}
936EXPORT_SYMBOL(ieee80211_stop_tx_ba_cb_irqsafe);
937
938
939void ieee80211_process_addba_resp(struct ieee80211_local *local,
940 struct sta_info *sta,
941 struct ieee80211_mgmt *mgmt,
942 size_t len)
943{
944 struct tid_ampdu_tx *tid_tx;
945 struct ieee80211_txq *txq;
946 u16 capab, tid;
947 u8 buf_size;
948 bool amsdu;
949
950 capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab);
951 amsdu = capab & IEEE80211_ADDBA_PARAM_AMSDU_MASK;
952 tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
953 buf_size = (capab & IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) >> 6;
954 buf_size = min(buf_size, local->hw.max_tx_aggregation_subframes);
955
956 txq = sta->sta.txq[tid];
957 if (!amsdu && txq)
958 set_bit(IEEE80211_TXQ_NO_AMSDU, &to_txq_info(txq)->flags);
959
960 mutex_lock(&sta->ampdu_mlme.mtx);
961
962 tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
963 if (!tid_tx)
964 goto out;
965
966 if (mgmt->u.action.u.addba_resp.dialog_token != tid_tx->dialog_token) {
967 ht_dbg(sta->sdata, "wrong addBA response token, %pM tid %d\n",
968 sta->sta.addr, tid);
969 goto out;
970 }
971
972 del_timer_sync(&tid_tx->addba_resp_timer);
973
974 ht_dbg(sta->sdata, "switched off addBA timer for %pM tid %d\n",
975 sta->sta.addr, tid);
976
977
978
979
980
981
982 if (test_bit(HT_AGG_STATE_WANT_STOP, &tid_tx->state) ||
983 test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) {
984 ht_dbg(sta->sdata,
985 "got addBA resp for %pM tid %d but we already gave up\n",
986 sta->sta.addr, tid);
987 goto out;
988 }
989
990
991
992
993
994
995
996 if (le16_to_cpu(mgmt->u.action.u.addba_resp.status)
997 == WLAN_STATUS_SUCCESS && buf_size) {
998 if (test_and_set_bit(HT_AGG_STATE_RESPONSE_RECEIVED,
999 &tid_tx->state)) {
1000
1001 goto out;
1002 }
1003
1004 tid_tx->buf_size = buf_size;
1005 tid_tx->amsdu = amsdu;
1006
1007 if (test_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state))
1008 ieee80211_agg_tx_operational(local, sta, tid);
1009
1010 sta->ampdu_mlme.addba_req_num[tid] = 0;
1011
1012 if (tid_tx->timeout) {
1013 mod_timer(&tid_tx->session_timer,
1014 TU_TO_EXP_TIME(tid_tx->timeout));
1015 tid_tx->last_tx = jiffies;
1016 }
1017
1018 } else {
1019 ___ieee80211_stop_tx_ba_session(sta, tid, AGG_STOP_DECLINED);
1020 }
1021
1022 out:
1023 mutex_unlock(&sta->ampdu_mlme.mtx);
1024}
1025