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