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