1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/export.h>
14#include <linux/etherdevice.h>
15#include <net/mac80211.h>
16#include <asm/unaligned.h>
17#include "ieee80211_i.h"
18#include "rate.h"
19#include "mesh.h"
20#include "led.h"
21#include "wme.h"
22
23
24void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw,
25 struct sk_buff *skb)
26{
27 struct ieee80211_local *local = hw_to_local(hw);
28 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
29 int tmp;
30
31 skb->pkt_type = IEEE80211_TX_STATUS_MSG;
32 skb_queue_tail(info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS ?
33 &local->skb_queue : &local->skb_queue_unreliable, skb);
34 tmp = skb_queue_len(&local->skb_queue) +
35 skb_queue_len(&local->skb_queue_unreliable);
36 while (tmp > IEEE80211_IRQSAFE_QUEUE_LIMIT &&
37 (skb = skb_dequeue(&local->skb_queue_unreliable))) {
38 ieee80211_free_txskb(hw, skb);
39 tmp--;
40 I802_DEBUG_INC(local->tx_status_drop);
41 }
42 tasklet_schedule(&local->tasklet);
43}
44EXPORT_SYMBOL(ieee80211_tx_status_irqsafe);
45
46static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
47 struct sta_info *sta,
48 struct sk_buff *skb)
49{
50 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
51 struct ieee80211_hdr *hdr = (void *)skb->data;
52 int ac;
53
54
55
56
57
58
59
60
61
62 memset(&info->control, 0, sizeof(info->control));
63
64 info->control.jiffies = jiffies;
65 info->control.vif = &sta->sdata->vif;
66 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING |
67 IEEE80211_TX_INTFL_RETRANSMISSION;
68 info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
69
70 sta->tx_filtered_count++;
71
72
73
74
75
76
77
78
79 if (hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_MOREDATA))
80 hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_MOREDATA);
81
82 if (ieee80211_is_data_qos(hdr->frame_control)) {
83 u8 *p = ieee80211_get_qos_ctl(hdr);
84 int tid = *p & IEEE80211_QOS_CTL_TID_MASK;
85
86
87
88
89
90
91 if (*p & IEEE80211_QOS_CTL_EOSP)
92 *p &= ~IEEE80211_QOS_CTL_EOSP;
93 ac = ieee802_1d_to_ac[tid & 7];
94 } else {
95 ac = IEEE80211_AC_BE;
96 }
97
98
99
100
101
102
103 set_sta_flag(sta, WLAN_STA_CLEAR_PS_FILT);
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139 if (test_sta_flag(sta, WLAN_STA_PS_STA) &&
140 skb_queue_len(&sta->tx_filtered[ac]) < STA_MAX_TX_BUFFER) {
141 skb_queue_tail(&sta->tx_filtered[ac], skb);
142 sta_info_recalc_tim(sta);
143
144 if (!timer_pending(&local->sta_cleanup))
145 mod_timer(&local->sta_cleanup,
146 round_jiffies(jiffies +
147 STA_INFO_CLEANUP_INTERVAL));
148 return;
149 }
150
151 if (!test_sta_flag(sta, WLAN_STA_PS_STA) &&
152 !(info->flags & IEEE80211_TX_INTFL_RETRIED)) {
153
154 info->flags |= IEEE80211_TX_INTFL_RETRIED;
155 ieee80211_add_pending_skb(local, skb);
156 return;
157 }
158
159 ps_dbg_ratelimited(sta->sdata,
160 "dropped TX filtered frame, queue_len=%d PS=%d @%lu\n",
161 skb_queue_len(&sta->tx_filtered[ac]),
162 !!test_sta_flag(sta, WLAN_STA_PS_STA), jiffies);
163 ieee80211_free_txskb(&local->hw, skb);
164}
165
166static void ieee80211_check_pending_bar(struct sta_info *sta, u8 *addr, u8 tid)
167{
168 struct tid_ampdu_tx *tid_tx;
169
170 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
171 if (!tid_tx || !tid_tx->bar_pending)
172 return;
173
174 tid_tx->bar_pending = false;
175 ieee80211_send_bar(&sta->sdata->vif, addr, tid, tid_tx->failed_bar_ssn);
176}
177
178static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb)
179{
180 struct ieee80211_mgmt *mgmt = (void *) skb->data;
181 struct ieee80211_local *local = sta->local;
182 struct ieee80211_sub_if_data *sdata = sta->sdata;
183
184 if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
185 sta->last_rx = jiffies;
186
187 if (ieee80211_is_data_qos(mgmt->frame_control)) {
188 struct ieee80211_hdr *hdr = (void *) skb->data;
189 u8 *qc = ieee80211_get_qos_ctl(hdr);
190 u16 tid = qc[0] & 0xf;
191
192 ieee80211_check_pending_bar(sta, hdr->addr1, tid);
193 }
194
195 if (ieee80211_is_action(mgmt->frame_control) &&
196 mgmt->u.action.category == WLAN_CATEGORY_HT &&
197 mgmt->u.action.u.ht_smps.action == WLAN_HT_ACTION_SMPS &&
198 ieee80211_sdata_running(sdata)) {
199 enum ieee80211_smps_mode smps_mode;
200
201 switch (mgmt->u.action.u.ht_smps.smps_control) {
202 case WLAN_HT_SMPS_CONTROL_DYNAMIC:
203 smps_mode = IEEE80211_SMPS_DYNAMIC;
204 break;
205 case WLAN_HT_SMPS_CONTROL_STATIC:
206 smps_mode = IEEE80211_SMPS_STATIC;
207 break;
208 case WLAN_HT_SMPS_CONTROL_DISABLED:
209 default:
210 smps_mode = IEEE80211_SMPS_OFF;
211 break;
212 }
213
214 if (sdata->vif.type == NL80211_IFTYPE_STATION) {
215
216
217
218
219
220
221
222 sdata->smps_mode = smps_mode;
223 ieee80211_queue_work(&local->hw, &sdata->recalc_smps);
224 } else if (sdata->vif.type == NL80211_IFTYPE_AP ||
225 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
226 sta->known_smps_mode = smps_mode;
227 }
228 }
229}
230
231static void ieee80211_set_bar_pending(struct sta_info *sta, u8 tid, u16 ssn)
232{
233 struct tid_ampdu_tx *tid_tx;
234
235 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
236 if (!tid_tx)
237 return;
238
239 tid_tx->failed_bar_ssn = ssn;
240 tid_tx->bar_pending = true;
241}
242
243static int ieee80211_tx_radiotap_len(struct ieee80211_tx_info *info)
244{
245 int len = sizeof(struct ieee80211_radiotap_header);
246
247
248 if (info->status.rates[0].idx >= 0 &&
249 !(info->status.rates[0].flags & (IEEE80211_TX_RC_MCS |
250 IEEE80211_TX_RC_VHT_MCS)))
251 len += 2;
252
253
254 len += 2;
255
256
257 len += 1;
258
259
260
261 if (info->status.rates[0].idx >= 0) {
262 if (info->status.rates[0].flags & IEEE80211_TX_RC_MCS)
263 len += 3;
264 else if (info->status.rates[0].flags & IEEE80211_TX_RC_VHT_MCS)
265 len = ALIGN(len, 2) + 12;
266 }
267
268 return len;
269}
270
271static void
272ieee80211_add_tx_radiotap_header(struct ieee80211_local *local,
273 struct ieee80211_supported_band *sband,
274 struct sk_buff *skb, int retry_count,
275 int rtap_len, int shift)
276{
277 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
278 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
279 struct ieee80211_radiotap_header *rthdr;
280 unsigned char *pos;
281 u16 txflags;
282
283 rthdr = (struct ieee80211_radiotap_header *) skb_push(skb, rtap_len);
284
285 memset(rthdr, 0, rtap_len);
286 rthdr->it_len = cpu_to_le16(rtap_len);
287 rthdr->it_present =
288 cpu_to_le32((1 << IEEE80211_RADIOTAP_TX_FLAGS) |
289 (1 << IEEE80211_RADIOTAP_DATA_RETRIES));
290 pos = (unsigned char *)(rthdr + 1);
291
292
293
294
295
296
297
298
299 if (info->status.rates[0].idx >= 0 &&
300 !(info->status.rates[0].flags & (IEEE80211_TX_RC_MCS |
301 IEEE80211_TX_RC_VHT_MCS))) {
302 u16 rate;
303
304 rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_RATE);
305 rate = sband->bitrates[info->status.rates[0].idx].bitrate;
306 *pos = DIV_ROUND_UP(rate, 5 * (1 << shift));
307
308 pos += 2;
309 }
310
311
312 txflags = 0;
313 if (!(info->flags & IEEE80211_TX_STAT_ACK) &&
314 !is_multicast_ether_addr(hdr->addr1))
315 txflags |= IEEE80211_RADIOTAP_F_TX_FAIL;
316
317 if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
318 txflags |= IEEE80211_RADIOTAP_F_TX_CTS;
319 if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS)
320 txflags |= IEEE80211_RADIOTAP_F_TX_RTS;
321
322 put_unaligned_le16(txflags, pos);
323 pos += 2;
324
325
326
327 *pos = retry_count;
328 pos++;
329
330 if (info->status.rates[0].idx < 0)
331 return;
332
333
334
335 if (info->status.rates[0].flags & IEEE80211_TX_RC_MCS) {
336 rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_MCS);
337 pos[0] = IEEE80211_RADIOTAP_MCS_HAVE_MCS |
338 IEEE80211_RADIOTAP_MCS_HAVE_GI |
339 IEEE80211_RADIOTAP_MCS_HAVE_BW;
340 if (info->status.rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
341 pos[1] |= IEEE80211_RADIOTAP_MCS_SGI;
342 if (info->status.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
343 pos[1] |= IEEE80211_RADIOTAP_MCS_BW_40;
344 if (info->status.rates[0].flags & IEEE80211_TX_RC_GREEN_FIELD)
345 pos[1] |= IEEE80211_RADIOTAP_MCS_FMT_GF;
346 pos[2] = info->status.rates[0].idx;
347 pos += 3;
348 } else if (info->status.rates[0].flags & IEEE80211_TX_RC_VHT_MCS) {
349 u16 known = local->hw.radiotap_vht_details &
350 (IEEE80211_RADIOTAP_VHT_KNOWN_GI |
351 IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH);
352
353 rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_VHT);
354
355
356 pos = (u8 *)rthdr + ALIGN(pos - (u8 *)rthdr, 2);
357
358
359 put_unaligned_le16(known, pos);
360 pos += 2;
361
362
363 if (info->status.rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
364 *pos |= IEEE80211_RADIOTAP_VHT_FLAG_SGI;
365 pos++;
366
367
368 if (info->status.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
369 *pos = 1;
370 else if (info->status.rates[0].flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
371 *pos = 4;
372 else if (info->status.rates[0].flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
373 *pos = 11;
374 else
375 *pos = 0;
376 pos++;
377
378
379 *pos = (ieee80211_rate_get_vht_mcs(&info->status.rates[0]) << 4) |
380 ieee80211_rate_get_vht_nss(&info->status.rates[0]);
381 pos += 4;
382
383
384 pos++;
385
386 pos++;
387
388 pos += 2;
389 }
390}
391
392
393
394
395
396static void ieee80211_tdls_td_tx_handle(struct ieee80211_local *local,
397 struct ieee80211_sub_if_data *sdata,
398 struct sk_buff *skb, u32 flags)
399{
400 struct sk_buff *teardown_skb;
401 struct sk_buff *orig_teardown_skb;
402 bool is_teardown = false;
403
404
405 spin_lock(&sdata->u.mgd.teardown_lock);
406 teardown_skb = sdata->u.mgd.teardown_skb;
407 orig_teardown_skb = sdata->u.mgd.orig_teardown_skb;
408 if ((skb == orig_teardown_skb) && teardown_skb) {
409 sdata->u.mgd.teardown_skb = NULL;
410 sdata->u.mgd.orig_teardown_skb = NULL;
411 is_teardown = true;
412 }
413 spin_unlock(&sdata->u.mgd.teardown_lock);
414
415 if (is_teardown) {
416
417 WARN_ON(!(local->hw.flags &
418 IEEE80211_HW_REPORTS_TX_ACK_STATUS));
419
420
421 if (flags & IEEE80211_TX_STAT_ACK) {
422 dev_kfree_skb_any(teardown_skb);
423 } else {
424 tdls_dbg(sdata,
425 "TDLS Resending teardown through AP\n");
426
427 ieee80211_subif_start_xmit(teardown_skb, skb->dev);
428 }
429 }
430}
431
432static void ieee80211_report_used_skb(struct ieee80211_local *local,
433 struct sk_buff *skb, bool dropped)
434{
435 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
436 struct ieee80211_hdr *hdr = (void *)skb->data;
437 bool acked = info->flags & IEEE80211_TX_STAT_ACK;
438
439 if (dropped)
440 acked = false;
441
442 if (info->flags & (IEEE80211_TX_INTFL_NL80211_FRAME_TX |
443 IEEE80211_TX_INTFL_MLME_CONN_TX)) {
444 struct ieee80211_sub_if_data *sdata = NULL;
445 struct ieee80211_sub_if_data *iter_sdata;
446 u64 cookie = (unsigned long)skb;
447
448 rcu_read_lock();
449
450 if (skb->dev) {
451 list_for_each_entry_rcu(iter_sdata, &local->interfaces,
452 list) {
453 if (!iter_sdata->dev)
454 continue;
455
456 if (skb->dev == iter_sdata->dev) {
457 sdata = iter_sdata;
458 break;
459 }
460 }
461 } else {
462 sdata = rcu_dereference(local->p2p_sdata);
463 }
464
465 if (!sdata) {
466 skb->dev = NULL;
467 } else if (info->flags & IEEE80211_TX_INTFL_MLME_CONN_TX) {
468 unsigned int hdr_size =
469 ieee80211_hdrlen(hdr->frame_control);
470
471
472 if (ieee80211_is_data(hdr->frame_control) &&
473 (ieee80211_get_tdls_action(skb, hdr_size) ==
474 WLAN_TDLS_TEARDOWN))
475 ieee80211_tdls_td_tx_handle(local, sdata, skb,
476 info->flags);
477 else
478 ieee80211_mgd_conn_tx_status(sdata,
479 hdr->frame_control,
480 acked);
481 } else if (ieee80211_is_nullfunc(hdr->frame_control) ||
482 ieee80211_is_qos_nullfunc(hdr->frame_control)) {
483 cfg80211_probe_status(sdata->dev, hdr->addr1,
484 cookie, acked, GFP_ATOMIC);
485 } else {
486 cfg80211_mgmt_tx_status(&sdata->wdev, cookie, skb->data,
487 skb->len, acked, GFP_ATOMIC);
488 }
489
490 rcu_read_unlock();
491 }
492
493 if (unlikely(info->ack_frame_id)) {
494 struct sk_buff *ack_skb;
495 unsigned long flags;
496
497 spin_lock_irqsave(&local->ack_status_lock, flags);
498 ack_skb = idr_find(&local->ack_status_frames,
499 info->ack_frame_id);
500 if (ack_skb)
501 idr_remove(&local->ack_status_frames,
502 info->ack_frame_id);
503 spin_unlock_irqrestore(&local->ack_status_lock, flags);
504
505 if (ack_skb) {
506 if (!dropped) {
507
508 skb_complete_wifi_ack(ack_skb, acked);
509 } else {
510 dev_kfree_skb_any(ack_skb);
511 }
512 }
513 }
514}
515
516
517
518
519
520
521
522
523#define STA_LOST_PKT_THRESHOLD 50
524#define STA_LOST_TDLS_PKT_THRESHOLD 10
525#define STA_LOST_TDLS_PKT_TIME (10*HZ)
526
527static void ieee80211_lost_packet(struct sta_info *sta,
528 struct ieee80211_tx_info *info)
529{
530
531 if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
532 !(info->flags & IEEE80211_TX_STAT_AMPDU))
533 return;
534
535 sta->lost_packets++;
536 if (!sta->sta.tdls && sta->lost_packets < STA_LOST_PKT_THRESHOLD)
537 return;
538
539
540
541
542
543
544
545 if (sta->sta.tdls &&
546 (sta->lost_packets < STA_LOST_TDLS_PKT_THRESHOLD ||
547 time_before(jiffies,
548 sta->last_tdls_pkt_time + STA_LOST_TDLS_PKT_TIME)))
549 return;
550
551 cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
552 sta->lost_packets, GFP_ATOMIC);
553 sta->lost_packets = 0;
554}
555
556static int ieee80211_tx_get_rates(struct ieee80211_hw *hw,
557 struct ieee80211_tx_info *info,
558 int *retry_count)
559{
560 int rates_idx = -1;
561 int count = -1;
562 int i;
563
564 for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
565 if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
566 !(info->flags & IEEE80211_TX_STAT_AMPDU)) {
567
568 info->status.rates[i].idx = -1;
569 info->status.rates[i].count = 0;
570 break;
571 } else if (info->status.rates[i].idx < 0) {
572 break;
573 } else if (i >= hw->max_report_rates) {
574
575 info->status.rates[i].idx = -1;
576 info->status.rates[i].count = 0;
577 break;
578 }
579
580 count += info->status.rates[i].count;
581 }
582 rates_idx = i - 1;
583
584 if (count < 0)
585 count = 0;
586
587 *retry_count = count;
588 return rates_idx;
589}
590
591void ieee80211_tx_status_noskb(struct ieee80211_hw *hw,
592 struct ieee80211_sta *pubsta,
593 struct ieee80211_tx_info *info)
594{
595 struct ieee80211_local *local = hw_to_local(hw);
596 struct ieee80211_supported_band *sband;
597 int retry_count;
598 int rates_idx;
599 bool acked, noack_success;
600
601 rates_idx = ieee80211_tx_get_rates(hw, info, &retry_count);
602
603 sband = hw->wiphy->bands[info->band];
604
605 acked = !!(info->flags & IEEE80211_TX_STAT_ACK);
606 noack_success = !!(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED);
607
608 if (pubsta) {
609 struct sta_info *sta;
610
611 sta = container_of(pubsta, struct sta_info, sta);
612
613 if (!acked)
614 sta->tx_retry_failed++;
615 sta->tx_retry_count += retry_count;
616
617 if (acked) {
618 sta->last_rx = jiffies;
619
620 if (sta->lost_packets)
621 sta->lost_packets = 0;
622
623
624 if (test_sta_flag(sta, WLAN_STA_TDLS_PEER_AUTH))
625 sta->last_tdls_pkt_time = jiffies;
626 } else {
627 ieee80211_lost_packet(sta, info);
628 }
629
630 rate_control_tx_status_noskb(local, sband, sta, info);
631 }
632
633 if (acked || noack_success) {
634 local->dot11TransmittedFrameCount++;
635 if (!pubsta)
636 local->dot11MulticastTransmittedFrameCount++;
637 if (retry_count > 0)
638 local->dot11RetryCount++;
639 if (retry_count > 1)
640 local->dot11MultipleRetryCount++;
641 } else {
642 local->dot11FailedCount++;
643 }
644}
645EXPORT_SYMBOL(ieee80211_tx_status_noskb);
646
647void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
648{
649 struct sk_buff *skb2;
650 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
651 struct ieee80211_local *local = hw_to_local(hw);
652 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
653 __le16 fc;
654 struct ieee80211_supported_band *sband;
655 struct ieee80211_sub_if_data *sdata;
656 struct net_device *prev_dev = NULL;
657 struct sta_info *sta;
658 struct rhash_head *tmp;
659 int retry_count;
660 int rates_idx;
661 bool send_to_cooked;
662 bool acked;
663 struct ieee80211_bar *bar;
664 int rtap_len;
665 int shift = 0;
666 int tid = IEEE80211_NUM_TIDS;
667 const struct bucket_table *tbl;
668
669 rates_idx = ieee80211_tx_get_rates(hw, info, &retry_count);
670
671 rcu_read_lock();
672
673 sband = local->hw.wiphy->bands[info->band];
674 fc = hdr->frame_control;
675
676 tbl = rht_dereference_rcu(local->sta_hash.tbl, &local->sta_hash);
677
678 for_each_sta_info(local, tbl, hdr->addr1, sta, tmp) {
679
680 if (!ether_addr_equal(hdr->addr2, sta->sdata->vif.addr))
681 continue;
682
683 shift = ieee80211_vif_get_shift(&sta->sdata->vif);
684
685 if (info->flags & IEEE80211_TX_STATUS_EOSP)
686 clear_sta_flag(sta, WLAN_STA_SP);
687
688 acked = !!(info->flags & IEEE80211_TX_STAT_ACK);
689 if (!acked && test_sta_flag(sta, WLAN_STA_PS_STA)) {
690
691
692
693
694 ieee80211_handle_filtered_frame(local, sta, skb);
695 rcu_read_unlock();
696 return;
697 }
698
699
700 if (ieee80211_vif_is_mesh(&sta->sdata->vif) &&
701 ieee80211_is_data_qos(fc))
702 ieee80211_mpsp_trigger_process(
703 ieee80211_get_qos_ctl(hdr),
704 sta, true, acked);
705
706 if ((local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) &&
707 (ieee80211_is_data(hdr->frame_control)) &&
708 (rates_idx != -1))
709 sta->last_tx_rate = info->status.rates[rates_idx];
710
711 if ((info->flags & IEEE80211_TX_STAT_AMPDU_NO_BACK) &&
712 (ieee80211_is_data_qos(fc))) {
713 u16 ssn;
714 u8 *qc;
715
716 qc = ieee80211_get_qos_ctl(hdr);
717 tid = qc[0] & 0xf;
718 ssn = ((le16_to_cpu(hdr->seq_ctrl) + 0x10)
719 & IEEE80211_SCTL_SEQ);
720 ieee80211_send_bar(&sta->sdata->vif, hdr->addr1,
721 tid, ssn);
722 } else if (ieee80211_is_data_qos(fc)) {
723 u8 *qc = ieee80211_get_qos_ctl(hdr);
724
725 tid = qc[0] & 0xf;
726 }
727
728 if (!acked && ieee80211_is_back_req(fc)) {
729 u16 control;
730
731
732
733
734
735
736 bar = (struct ieee80211_bar *) skb->data;
737 control = le16_to_cpu(bar->control);
738 if (!(control & IEEE80211_BAR_CTRL_MULTI_TID)) {
739 u16 ssn = le16_to_cpu(bar->start_seq_num);
740
741 tid = (control &
742 IEEE80211_BAR_CTRL_TID_INFO_MASK) >>
743 IEEE80211_BAR_CTRL_TID_INFO_SHIFT;
744
745 ieee80211_set_bar_pending(sta, tid, ssn);
746 }
747 }
748
749 if (info->flags & IEEE80211_TX_STAT_TX_FILTERED) {
750 ieee80211_handle_filtered_frame(local, sta, skb);
751 rcu_read_unlock();
752 return;
753 } else {
754 if (!acked)
755 sta->tx_retry_failed++;
756 sta->tx_retry_count += retry_count;
757
758 if (ieee80211_is_data_present(fc)) {
759 if (!acked)
760 sta->tx_msdu_failed[tid]++;
761 sta->tx_msdu_retries[tid] += retry_count;
762 }
763 }
764
765 rate_control_tx_status(local, sband, sta, skb);
766 if (ieee80211_vif_is_mesh(&sta->sdata->vif))
767 ieee80211s_update_metric(local, sta, skb);
768
769 if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked)
770 ieee80211_frame_acked(sta, skb);
771
772 if ((sta->sdata->vif.type == NL80211_IFTYPE_STATION) &&
773 (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS))
774 ieee80211_sta_tx_notify(sta->sdata, (void *) skb->data,
775 acked, info->status.tx_time);
776
777 if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) {
778 if (info->flags & IEEE80211_TX_STAT_ACK) {
779 if (sta->lost_packets)
780 sta->lost_packets = 0;
781
782
783 if (test_sta_flag(sta, WLAN_STA_TDLS_PEER_AUTH))
784 sta->last_tdls_pkt_time = jiffies;
785 } else {
786 ieee80211_lost_packet(sta, info);
787 }
788 }
789
790 if (acked)
791 sta->last_ack_signal = info->status.ack_signal;
792 }
793
794 rcu_read_unlock();
795
796 ieee80211_led_tx(local);
797
798
799
800
801
802 if ((info->flags & IEEE80211_TX_STAT_ACK) ||
803 (info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED)) {
804 if (ieee80211_is_first_frag(hdr->seq_ctrl)) {
805 local->dot11TransmittedFrameCount++;
806 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)))
807 local->dot11MulticastTransmittedFrameCount++;
808 if (retry_count > 0)
809 local->dot11RetryCount++;
810 if (retry_count > 1)
811 local->dot11MultipleRetryCount++;
812 }
813
814
815
816
817
818 if (!is_multicast_ether_addr(hdr->addr1) ||
819 ieee80211_is_data(fc) ||
820 ieee80211_is_mgmt(fc))
821 local->dot11TransmittedFragmentCount++;
822 } else {
823 if (ieee80211_is_first_frag(hdr->seq_ctrl))
824 local->dot11FailedCount++;
825 }
826
827 if (ieee80211_is_nullfunc(fc) && ieee80211_has_pm(fc) &&
828 (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) &&
829 !(info->flags & IEEE80211_TX_CTL_INJECTED) &&
830 local->ps_sdata && !(local->scanning)) {
831 if (info->flags & IEEE80211_TX_STAT_ACK) {
832 local->ps_sdata->u.mgd.flags |=
833 IEEE80211_STA_NULLFUNC_ACKED;
834 } else
835 mod_timer(&local->dynamic_ps_timer, jiffies +
836 msecs_to_jiffies(10));
837 }
838
839 ieee80211_report_used_skb(local, skb, false);
840
841
842 skb_orphan(skb);
843
844
845 send_to_cooked = !!(info->flags & IEEE80211_TX_CTL_INJECTED) ||
846 !(ieee80211_is_data(fc));
847
848
849
850
851
852 if (!local->monitors && (!send_to_cooked || !local->cooked_mntrs)) {
853 dev_kfree_skb(skb);
854 return;
855 }
856
857
858 rtap_len = ieee80211_tx_radiotap_len(info);
859 if (WARN_ON_ONCE(skb_headroom(skb) < rtap_len)) {
860 pr_err("ieee80211_tx_status: headroom too small\n");
861 dev_kfree_skb(skb);
862 return;
863 }
864 ieee80211_add_tx_radiotap_header(local, sband, skb, retry_count,
865 rtap_len, shift);
866
867
868 skb_set_mac_header(skb, 0);
869 skb->ip_summed = CHECKSUM_UNNECESSARY;
870 skb->pkt_type = PACKET_OTHERHOST;
871 skb->protocol = htons(ETH_P_802_2);
872 memset(skb->cb, 0, sizeof(skb->cb));
873
874 rcu_read_lock();
875 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
876 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
877 if (!ieee80211_sdata_running(sdata))
878 continue;
879
880 if ((sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) &&
881 !send_to_cooked)
882 continue;
883
884 if (prev_dev) {
885 skb2 = skb_clone(skb, GFP_ATOMIC);
886 if (skb2) {
887 skb2->dev = prev_dev;
888 netif_rx(skb2);
889 }
890 }
891
892 prev_dev = sdata->dev;
893 }
894 }
895 if (prev_dev) {
896 skb->dev = prev_dev;
897 netif_rx(skb);
898 skb = NULL;
899 }
900 rcu_read_unlock();
901 dev_kfree_skb(skb);
902}
903EXPORT_SYMBOL(ieee80211_tx_status);
904
905void ieee80211_report_low_ack(struct ieee80211_sta *pubsta, u32 num_packets)
906{
907 struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
908 cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
909 num_packets, GFP_ATOMIC);
910}
911EXPORT_SYMBOL(ieee80211_report_low_ack);
912
913void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb)
914{
915 struct ieee80211_local *local = hw_to_local(hw);
916
917 ieee80211_report_used_skb(local, skb, true);
918 dev_kfree_skb_any(skb);
919}
920EXPORT_SYMBOL(ieee80211_free_txskb);
921
922void ieee80211_purge_tx_queue(struct ieee80211_hw *hw,
923 struct sk_buff_head *skbs)
924{
925 struct sk_buff *skb;
926
927 while ((skb = __skb_dequeue(skbs)))
928 ieee80211_free_txskb(hw, skb);
929}
930