1
2
3
4
5
6
7
8
9
10
11#include <linux/export.h>
12#include <linux/etherdevice.h>
13#include <net/mac80211.h>
14#include <asm/unaligned.h>
15#include "ieee80211_i.h"
16#include "rate.h"
17#include "mesh.h"
18#include "led.h"
19#include "wme.h"
20
21
22void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw,
23 struct sk_buff *skb)
24{
25 struct ieee80211_local *local = hw_to_local(hw);
26 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
27 int tmp;
28
29 skb->pkt_type = IEEE80211_TX_STATUS_MSG;
30 skb_queue_tail(info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS ?
31 &local->skb_queue : &local->skb_queue_unreliable, skb);
32 tmp = skb_queue_len(&local->skb_queue) +
33 skb_queue_len(&local->skb_queue_unreliable);
34 while (tmp > IEEE80211_IRQSAFE_QUEUE_LIMIT &&
35 (skb = skb_dequeue(&local->skb_queue_unreliable))) {
36 ieee80211_free_txskb(hw, skb);
37 tmp--;
38 I802_DEBUG_INC(local->tx_status_drop);
39 }
40 tasklet_schedule(&local->tasklet);
41}
42EXPORT_SYMBOL(ieee80211_tx_status_irqsafe);
43
44static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
45 struct sta_info *sta,
46 struct sk_buff *skb)
47{
48 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
49 struct ieee80211_hdr *hdr = (void *)skb->data;
50 int ac;
51
52 if (info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER |
53 IEEE80211_TX_CTL_AMPDU |
54 IEEE80211_TX_CTL_HW_80211_ENCAP)) {
55 ieee80211_free_txskb(&local->hw, skb);
56 return;
57 }
58
59
60
61
62
63
64
65
66
67 memset(&info->control, 0, sizeof(info->control));
68
69 info->control.jiffies = jiffies;
70 info->control.vif = &sta->sdata->vif;
71 info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
72 info->flags |= IEEE80211_TX_INTFL_RETRANSMISSION;
73 info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
74
75 sta->status_stats.filtered++;
76
77
78
79
80
81
82
83
84 if (hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_MOREDATA))
85 hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_MOREDATA);
86
87 if (ieee80211_is_data_qos(hdr->frame_control)) {
88 u8 *p = ieee80211_get_qos_ctl(hdr);
89 int tid = *p & IEEE80211_QOS_CTL_TID_MASK;
90
91
92
93
94
95
96 if (*p & IEEE80211_QOS_CTL_EOSP)
97 *p &= ~IEEE80211_QOS_CTL_EOSP;
98 ac = ieee80211_ac_from_tid(tid);
99 } else {
100 ac = IEEE80211_AC_BE;
101 }
102
103
104
105
106
107
108 set_sta_flag(sta, WLAN_STA_CLEAR_PS_FILT);
109 ieee80211_clear_fast_xmit(sta);
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
141
142
143
144
145 if (test_sta_flag(sta, WLAN_STA_PS_STA) &&
146 skb_queue_len(&sta->tx_filtered[ac]) < STA_MAX_TX_BUFFER) {
147 skb_queue_tail(&sta->tx_filtered[ac], skb);
148 sta_info_recalc_tim(sta);
149
150 if (!timer_pending(&local->sta_cleanup))
151 mod_timer(&local->sta_cleanup,
152 round_jiffies(jiffies +
153 STA_INFO_CLEANUP_INTERVAL));
154 return;
155 }
156
157 if (!test_sta_flag(sta, WLAN_STA_PS_STA) &&
158 !(info->flags & IEEE80211_TX_INTFL_RETRIED)) {
159
160 info->flags |= IEEE80211_TX_INTFL_RETRIED;
161 ieee80211_add_pending_skb(local, skb);
162 return;
163 }
164
165 ps_dbg_ratelimited(sta->sdata,
166 "dropped TX filtered frame, queue_len=%d PS=%d @%lu\n",
167 skb_queue_len(&sta->tx_filtered[ac]),
168 !!test_sta_flag(sta, WLAN_STA_PS_STA), jiffies);
169 ieee80211_free_txskb(&local->hw, skb);
170}
171
172static void ieee80211_check_pending_bar(struct sta_info *sta, u8 *addr, u8 tid)
173{
174 struct tid_ampdu_tx *tid_tx;
175
176 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
177 if (!tid_tx || !tid_tx->bar_pending)
178 return;
179
180 tid_tx->bar_pending = false;
181 ieee80211_send_bar(&sta->sdata->vif, addr, tid, tid_tx->failed_bar_ssn);
182}
183
184static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb)
185{
186 struct ieee80211_mgmt *mgmt = (void *) skb->data;
187 struct ieee80211_local *local = sta->local;
188 struct ieee80211_sub_if_data *sdata = sta->sdata;
189
190 if (ieee80211_is_data_qos(mgmt->frame_control)) {
191 struct ieee80211_hdr *hdr = (void *) skb->data;
192 u8 *qc = ieee80211_get_qos_ctl(hdr);
193 u16 tid = qc[0] & 0xf;
194
195 ieee80211_check_pending_bar(sta, hdr->addr1, tid);
196 }
197
198 if (ieee80211_is_action(mgmt->frame_control) &&
199 !ieee80211_has_protected(mgmt->frame_control) &&
200 mgmt->u.action.category == WLAN_CATEGORY_HT &&
201 mgmt->u.action.u.ht_smps.action == WLAN_HT_ACTION_SMPS &&
202 ieee80211_sdata_running(sdata)) {
203 enum ieee80211_smps_mode smps_mode;
204
205 switch (mgmt->u.action.u.ht_smps.smps_control) {
206 case WLAN_HT_SMPS_CONTROL_DYNAMIC:
207 smps_mode = IEEE80211_SMPS_DYNAMIC;
208 break;
209 case WLAN_HT_SMPS_CONTROL_STATIC:
210 smps_mode = IEEE80211_SMPS_STATIC;
211 break;
212 case WLAN_HT_SMPS_CONTROL_DISABLED:
213 default:
214 smps_mode = IEEE80211_SMPS_OFF;
215 break;
216 }
217
218 if (sdata->vif.type == NL80211_IFTYPE_STATION) {
219
220
221
222
223
224
225
226 sdata->smps_mode = smps_mode;
227 ieee80211_queue_work(&local->hw, &sdata->recalc_smps);
228 } else if (sdata->vif.type == NL80211_IFTYPE_AP ||
229 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
230 sta->known_smps_mode = smps_mode;
231 }
232 }
233}
234
235static void ieee80211_set_bar_pending(struct sta_info *sta, u8 tid, u16 ssn)
236{
237 struct tid_ampdu_tx *tid_tx;
238
239 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
240 if (!tid_tx)
241 return;
242
243 tid_tx->failed_bar_ssn = ssn;
244 tid_tx->bar_pending = true;
245}
246
247static int ieee80211_tx_radiotap_len(struct ieee80211_tx_info *info,
248 struct ieee80211_tx_status *status)
249{
250 int len = sizeof(struct ieee80211_radiotap_header);
251
252
253 if (status && status->rate && !(status->rate->flags &
254 (RATE_INFO_FLAGS_MCS |
255 RATE_INFO_FLAGS_DMG |
256 RATE_INFO_FLAGS_EDMG |
257 RATE_INFO_FLAGS_VHT_MCS |
258 RATE_INFO_FLAGS_HE_MCS)))
259 len += 2;
260 else if (info->status.rates[0].idx >= 0 &&
261 !(info->status.rates[0].flags &
262 (IEEE80211_TX_RC_MCS | IEEE80211_TX_RC_VHT_MCS)))
263 len += 2;
264
265
266 len += 2;
267
268
269 len += 1;
270
271
272
273 if (status && status->rate) {
274 if (status->rate->flags & RATE_INFO_FLAGS_MCS)
275 len += 3;
276 else if (status->rate->flags & RATE_INFO_FLAGS_VHT_MCS)
277 len = ALIGN(len, 2) + 12;
278 else if (status->rate->flags & RATE_INFO_FLAGS_HE_MCS)
279 len = ALIGN(len, 2) + 12;
280 } else if (info->status.rates[0].idx >= 0) {
281 if (info->status.rates[0].flags & IEEE80211_TX_RC_MCS)
282 len += 3;
283 else if (info->status.rates[0].flags & IEEE80211_TX_RC_VHT_MCS)
284 len = ALIGN(len, 2) + 12;
285 }
286
287 return len;
288}
289
290static void
291ieee80211_add_tx_radiotap_header(struct ieee80211_local *local,
292 struct ieee80211_supported_band *sband,
293 struct sk_buff *skb, int retry_count,
294 int rtap_len, int shift,
295 struct ieee80211_tx_status *status)
296{
297 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
298 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
299 struct ieee80211_radiotap_header *rthdr;
300 unsigned char *pos;
301 u16 legacy_rate = 0;
302 u16 txflags;
303
304 rthdr = skb_push(skb, rtap_len);
305
306 memset(rthdr, 0, rtap_len);
307 rthdr->it_len = cpu_to_le16(rtap_len);
308 rthdr->it_present =
309 cpu_to_le32(BIT(IEEE80211_RADIOTAP_TX_FLAGS) |
310 BIT(IEEE80211_RADIOTAP_DATA_RETRIES));
311 pos = (unsigned char *)(rthdr + 1);
312
313
314
315
316
317
318
319
320
321 if (status && status->rate) {
322 if (!(status->rate->flags & (RATE_INFO_FLAGS_MCS |
323 RATE_INFO_FLAGS_DMG |
324 RATE_INFO_FLAGS_EDMG |
325 RATE_INFO_FLAGS_VHT_MCS |
326 RATE_INFO_FLAGS_HE_MCS)))
327 legacy_rate = status->rate->legacy;
328 } else if (info->status.rates[0].idx >= 0 &&
329 !(info->status.rates[0].flags & (IEEE80211_TX_RC_MCS |
330 IEEE80211_TX_RC_VHT_MCS)))
331 legacy_rate =
332 sband->bitrates[info->status.rates[0].idx].bitrate;
333
334 if (legacy_rate) {
335 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_RATE));
336 *pos = DIV_ROUND_UP(legacy_rate, 5 * (1 << shift));
337
338 pos += 2;
339 }
340
341
342 txflags = 0;
343 if (!(info->flags & IEEE80211_TX_STAT_ACK) &&
344 !is_multicast_ether_addr(hdr->addr1))
345 txflags |= IEEE80211_RADIOTAP_F_TX_FAIL;
346
347 if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
348 txflags |= IEEE80211_RADIOTAP_F_TX_CTS;
349 if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS)
350 txflags |= IEEE80211_RADIOTAP_F_TX_RTS;
351
352 put_unaligned_le16(txflags, pos);
353 pos += 2;
354
355
356
357 *pos = retry_count;
358 pos++;
359
360 if (status && status->rate &&
361 (status->rate->flags & RATE_INFO_FLAGS_MCS)) {
362 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_MCS));
363 pos[0] = IEEE80211_RADIOTAP_MCS_HAVE_MCS |
364 IEEE80211_RADIOTAP_MCS_HAVE_GI |
365 IEEE80211_RADIOTAP_MCS_HAVE_BW;
366 if (status->rate->flags & RATE_INFO_FLAGS_SHORT_GI)
367 pos[1] |= IEEE80211_RADIOTAP_MCS_SGI;
368 if (status->rate->bw == RATE_INFO_BW_40)
369 pos[1] |= IEEE80211_RADIOTAP_MCS_BW_40;
370 pos[2] = status->rate->mcs;
371 pos += 3;
372 } else if (status && status->rate &&
373 (status->rate->flags & RATE_INFO_FLAGS_VHT_MCS)) {
374 u16 known = local->hw.radiotap_vht_details &
375 (IEEE80211_RADIOTAP_VHT_KNOWN_GI |
376 IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH);
377
378 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_VHT));
379
380
381 pos = (u8 *)rthdr + ALIGN(pos - (u8 *)rthdr, 2);
382
383
384 put_unaligned_le16(known, pos);
385 pos += 2;
386
387
388 if (status->rate->flags & RATE_INFO_FLAGS_SHORT_GI)
389 *pos |= IEEE80211_RADIOTAP_VHT_FLAG_SGI;
390 pos++;
391
392
393 switch (status->rate->bw) {
394 case RATE_INFO_BW_160:
395 *pos = 11;
396 break;
397 case RATE_INFO_BW_80:
398 *pos = 4;
399 break;
400 case RATE_INFO_BW_40:
401 *pos = 1;
402 break;
403 default:
404 *pos = 0;
405 break;
406 }
407 pos++;
408
409
410 *pos = (status->rate->mcs << 4) | status->rate->nss;
411 pos += 4;
412
413
414 pos++;
415
416 pos++;
417
418 pos += 2;
419 } else if (status && status->rate &&
420 (status->rate->flags & RATE_INFO_FLAGS_HE_MCS)) {
421 struct ieee80211_radiotap_he *he;
422
423 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_HE));
424
425
426 pos = (u8 *)rthdr + ALIGN(pos - (u8 *)rthdr, 2);
427 he = (struct ieee80211_radiotap_he *)pos;
428
429 he->data1 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_FORMAT_SU |
430 IEEE80211_RADIOTAP_HE_DATA1_DATA_MCS_KNOWN |
431 IEEE80211_RADIOTAP_HE_DATA1_DATA_DCM_KNOWN |
432 IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN);
433
434 he->data2 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_GI_KNOWN);
435
436#define HE_PREP(f, val) le16_encode_bits(val, IEEE80211_RADIOTAP_HE_##f)
437
438 he->data6 |= HE_PREP(DATA6_NSTS, status->rate->nss);
439
440#define CHECK_GI(s) \
441 BUILD_BUG_ON(IEEE80211_RADIOTAP_HE_DATA5_GI_##s != \
442 (int)NL80211_RATE_INFO_HE_GI_##s)
443
444 CHECK_GI(0_8);
445 CHECK_GI(1_6);
446 CHECK_GI(3_2);
447
448 he->data3 |= HE_PREP(DATA3_DATA_MCS, status->rate->mcs);
449 he->data3 |= HE_PREP(DATA3_DATA_DCM, status->rate->he_dcm);
450
451 he->data5 |= HE_PREP(DATA5_GI, status->rate->he_gi);
452
453 switch (status->rate->bw) {
454 case RATE_INFO_BW_20:
455 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC,
456 IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_20MHZ);
457 break;
458 case RATE_INFO_BW_40:
459 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC,
460 IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_40MHZ);
461 break;
462 case RATE_INFO_BW_80:
463 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC,
464 IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_80MHZ);
465 break;
466 case RATE_INFO_BW_160:
467 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC,
468 IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_160MHZ);
469 break;
470 case RATE_INFO_BW_HE_RU:
471#define CHECK_RU_ALLOC(s) \
472 BUILD_BUG_ON(IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_##s##T != \
473 NL80211_RATE_INFO_HE_RU_ALLOC_##s + 4)
474
475 CHECK_RU_ALLOC(26);
476 CHECK_RU_ALLOC(52);
477 CHECK_RU_ALLOC(106);
478 CHECK_RU_ALLOC(242);
479 CHECK_RU_ALLOC(484);
480 CHECK_RU_ALLOC(996);
481 CHECK_RU_ALLOC(2x996);
482
483 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC,
484 status->rate->he_ru_alloc + 4);
485 break;
486 default:
487 WARN_ONCE(1, "Invalid SU BW %d\n", status->rate->bw);
488 }
489
490 pos += sizeof(struct ieee80211_radiotap_he);
491 }
492
493 if ((status && status->rate) || info->status.rates[0].idx < 0)
494 return;
495
496
497
498 if (info->status.rates[0].flags & IEEE80211_TX_RC_MCS) {
499 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_MCS));
500 pos[0] = IEEE80211_RADIOTAP_MCS_HAVE_MCS |
501 IEEE80211_RADIOTAP_MCS_HAVE_GI |
502 IEEE80211_RADIOTAP_MCS_HAVE_BW;
503 if (info->status.rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
504 pos[1] |= IEEE80211_RADIOTAP_MCS_SGI;
505 if (info->status.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
506 pos[1] |= IEEE80211_RADIOTAP_MCS_BW_40;
507 if (info->status.rates[0].flags & IEEE80211_TX_RC_GREEN_FIELD)
508 pos[1] |= IEEE80211_RADIOTAP_MCS_FMT_GF;
509 pos[2] = info->status.rates[0].idx;
510 pos += 3;
511 } else if (info->status.rates[0].flags & IEEE80211_TX_RC_VHT_MCS) {
512 u16 known = local->hw.radiotap_vht_details &
513 (IEEE80211_RADIOTAP_VHT_KNOWN_GI |
514 IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH);
515
516 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_VHT));
517
518
519 pos = (u8 *)rthdr + ALIGN(pos - (u8 *)rthdr, 2);
520
521
522 put_unaligned_le16(known, pos);
523 pos += 2;
524
525
526 if (info->status.rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
527 *pos |= IEEE80211_RADIOTAP_VHT_FLAG_SGI;
528 pos++;
529
530
531 if (info->status.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
532 *pos = 1;
533 else if (info->status.rates[0].flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
534 *pos = 4;
535 else if (info->status.rates[0].flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
536 *pos = 11;
537 else
538 *pos = 0;
539 pos++;
540
541
542 *pos = (ieee80211_rate_get_vht_mcs(&info->status.rates[0]) << 4) |
543 ieee80211_rate_get_vht_nss(&info->status.rates[0]);
544 pos += 4;
545
546
547 pos++;
548
549 pos++;
550
551 pos += 2;
552 }
553}
554
555
556
557
558
559static void ieee80211_tdls_td_tx_handle(struct ieee80211_local *local,
560 struct ieee80211_sub_if_data *sdata,
561 struct sk_buff *skb, u32 flags)
562{
563 struct sk_buff *teardown_skb;
564 struct sk_buff *orig_teardown_skb;
565 bool is_teardown = false;
566
567
568 spin_lock(&sdata->u.mgd.teardown_lock);
569 teardown_skb = sdata->u.mgd.teardown_skb;
570 orig_teardown_skb = sdata->u.mgd.orig_teardown_skb;
571 if ((skb == orig_teardown_skb) && teardown_skb) {
572 sdata->u.mgd.teardown_skb = NULL;
573 sdata->u.mgd.orig_teardown_skb = NULL;
574 is_teardown = true;
575 }
576 spin_unlock(&sdata->u.mgd.teardown_lock);
577
578 if (is_teardown) {
579
580 WARN_ON(!ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS));
581
582
583 if (flags & IEEE80211_TX_STAT_ACK) {
584 dev_kfree_skb_any(teardown_skb);
585 } else {
586 tdls_dbg(sdata,
587 "TDLS Resending teardown through AP\n");
588
589 ieee80211_subif_start_xmit(teardown_skb, skb->dev);
590 }
591 }
592}
593
594static struct ieee80211_sub_if_data *
595ieee80211_sdata_from_skb(struct ieee80211_local *local, struct sk_buff *skb)
596{
597 struct ieee80211_sub_if_data *sdata;
598
599 if (skb->dev) {
600 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
601 if (!sdata->dev)
602 continue;
603
604 if (skb->dev == sdata->dev)
605 return sdata;
606 }
607
608 return NULL;
609 }
610
611 return rcu_dereference(local->p2p_sdata);
612}
613
614static void ieee80211_report_ack_skb(struct ieee80211_local *local,
615 struct ieee80211_tx_info *info,
616 bool acked, bool dropped)
617{
618 struct sk_buff *skb;
619 unsigned long flags;
620
621 spin_lock_irqsave(&local->ack_status_lock, flags);
622 skb = idr_remove(&local->ack_status_frames, info->ack_frame_id);
623 spin_unlock_irqrestore(&local->ack_status_lock, flags);
624
625 if (!skb)
626 return;
627
628 if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) {
629 u64 cookie = IEEE80211_SKB_CB(skb)->ack.cookie;
630 struct ieee80211_sub_if_data *sdata;
631 struct ieee80211_hdr *hdr = (void *)skb->data;
632 bool is_valid_ack_signal =
633 !!(info->status.flags & IEEE80211_TX_STATUS_ACK_SIGNAL_VALID);
634
635 rcu_read_lock();
636 sdata = ieee80211_sdata_from_skb(local, skb);
637 if (sdata) {
638 if (skb->protocol == sdata->control_port_protocol ||
639 skb->protocol == cpu_to_be16(ETH_P_PREAUTH))
640 cfg80211_control_port_tx_status(&sdata->wdev,
641 cookie,
642 skb->data,
643 skb->len,
644 acked,
645 GFP_ATOMIC);
646 else if (ieee80211_is_any_nullfunc(hdr->frame_control))
647 cfg80211_probe_status(sdata->dev, hdr->addr1,
648 cookie, acked,
649 info->status.ack_signal,
650 is_valid_ack_signal,
651 GFP_ATOMIC);
652 else if (ieee80211_is_mgmt(hdr->frame_control))
653 cfg80211_mgmt_tx_status(&sdata->wdev, cookie,
654 skb->data, skb->len,
655 acked, GFP_ATOMIC);
656 else
657 pr_warn("Unknown status report in ack skb\n");
658
659 }
660 rcu_read_unlock();
661
662 dev_kfree_skb_any(skb);
663 } else if (dropped) {
664 dev_kfree_skb_any(skb);
665 } else {
666
667 skb_complete_wifi_ack(skb, acked);
668 }
669}
670
671static void ieee80211_report_used_skb(struct ieee80211_local *local,
672 struct sk_buff *skb, bool dropped)
673{
674 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
675 u16 tx_time_est = ieee80211_info_get_tx_time_est(info);
676 struct ieee80211_hdr *hdr = (void *)skb->data;
677 bool acked = info->flags & IEEE80211_TX_STAT_ACK;
678
679 if (dropped)
680 acked = false;
681
682 if (tx_time_est) {
683 struct sta_info *sta;
684
685 rcu_read_lock();
686
687 sta = sta_info_get_by_addrs(local, hdr->addr1, hdr->addr2);
688 ieee80211_sta_update_pending_airtime(local, sta,
689 skb_get_queue_mapping(skb),
690 tx_time_est,
691 true);
692 rcu_read_unlock();
693 }
694
695 if (info->flags & IEEE80211_TX_INTFL_MLME_CONN_TX) {
696 struct ieee80211_sub_if_data *sdata;
697
698 rcu_read_lock();
699
700 sdata = ieee80211_sdata_from_skb(local, skb);
701
702 if (!sdata) {
703 skb->dev = NULL;
704 } else {
705 unsigned int hdr_size =
706 ieee80211_hdrlen(hdr->frame_control);
707
708
709 if (ieee80211_is_data(hdr->frame_control) &&
710 (ieee80211_get_tdls_action(skb, hdr_size) ==
711 WLAN_TDLS_TEARDOWN)) {
712 ieee80211_tdls_td_tx_handle(local, sdata, skb,
713 info->flags);
714 } else if (ieee80211_s1g_is_twt_setup(skb)) {
715 if (!acked) {
716 struct sk_buff *qskb;
717
718 qskb = skb_clone(skb, GFP_ATOMIC);
719 if (qskb) {
720 skb_queue_tail(&sdata->status_queue,
721 qskb);
722 ieee80211_queue_work(&local->hw,
723 &sdata->work);
724 }
725 }
726 } else {
727 ieee80211_mgd_conn_tx_status(sdata,
728 hdr->frame_control,
729 acked);
730 }
731 }
732
733 rcu_read_unlock();
734 } else if (info->ack_frame_id) {
735 ieee80211_report_ack_skb(local, info, acked, dropped);
736 }
737
738 if (!dropped && skb->destructor) {
739 skb->wifi_acked_valid = 1;
740 skb->wifi_acked = acked;
741 }
742
743 ieee80211_led_tx(local);
744
745 if (skb_has_frag_list(skb)) {
746 kfree_skb_list(skb_shinfo(skb)->frag_list);
747 skb_shinfo(skb)->frag_list = NULL;
748 }
749}
750
751
752
753
754
755
756
757
758#define STA_LOST_PKT_THRESHOLD 50
759#define STA_LOST_PKT_TIME HZ
760#define STA_LOST_TDLS_PKT_TIME (10*HZ)
761
762static void ieee80211_lost_packet(struct sta_info *sta,
763 struct ieee80211_tx_info *info)
764{
765 unsigned long pkt_time = STA_LOST_PKT_TIME;
766 unsigned int pkt_thr = STA_LOST_PKT_THRESHOLD;
767
768
769
770
771 if (ieee80211_hw_check(&sta->local->hw, REPORTS_LOW_ACK))
772 return;
773
774
775 if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
776 !(info->flags & IEEE80211_TX_STAT_AMPDU))
777 return;
778
779 sta->status_stats.lost_packets++;
780 if (sta->sta.tdls) {
781 pkt_time = STA_LOST_TDLS_PKT_TIME;
782 pkt_thr = STA_LOST_PKT_THRESHOLD;
783 }
784
785
786
787
788
789
790
791
792 if (sta->status_stats.lost_packets < pkt_thr ||
793 !time_after(jiffies, sta->status_stats.last_pkt_time + pkt_time))
794 return;
795
796 cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
797 sta->status_stats.lost_packets, GFP_ATOMIC);
798 sta->status_stats.lost_packets = 0;
799}
800
801static int ieee80211_tx_get_rates(struct ieee80211_hw *hw,
802 struct ieee80211_tx_info *info,
803 int *retry_count)
804{
805 int count = -1;
806 int i;
807
808 for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
809 if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
810 !(info->flags & IEEE80211_TX_STAT_AMPDU)) {
811
812 info->status.rates[i].idx = -1;
813 info->status.rates[i].count = 0;
814 break;
815 } else if (info->status.rates[i].idx < 0) {
816 break;
817 } else if (i >= hw->max_report_rates) {
818
819 info->status.rates[i].idx = -1;
820 info->status.rates[i].count = 0;
821 break;
822 }
823
824 count += info->status.rates[i].count;
825 }
826
827 if (count < 0)
828 count = 0;
829
830 *retry_count = count;
831 return i - 1;
832}
833
834void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
835 struct ieee80211_supported_band *sband,
836 int retry_count, int shift, bool send_to_cooked,
837 struct ieee80211_tx_status *status)
838{
839 struct sk_buff *skb2;
840 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
841 struct ieee80211_sub_if_data *sdata;
842 struct net_device *prev_dev = NULL;
843 int rtap_len;
844
845
846 rtap_len = ieee80211_tx_radiotap_len(info, status);
847 if (WARN_ON_ONCE(skb_headroom(skb) < rtap_len)) {
848 pr_err("ieee80211_tx_status: headroom too small\n");
849 dev_kfree_skb(skb);
850 return;
851 }
852 ieee80211_add_tx_radiotap_header(local, sband, skb, retry_count,
853 rtap_len, shift, status);
854
855
856 skb_reset_mac_header(skb);
857 skb->ip_summed = CHECKSUM_UNNECESSARY;
858 skb->pkt_type = PACKET_OTHERHOST;
859 skb->protocol = htons(ETH_P_802_2);
860 memset(skb->cb, 0, sizeof(skb->cb));
861
862 rcu_read_lock();
863 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
864 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
865 if (!ieee80211_sdata_running(sdata))
866 continue;
867
868 if ((sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) &&
869 !send_to_cooked)
870 continue;
871
872 if (prev_dev) {
873 skb2 = skb_clone(skb, GFP_ATOMIC);
874 if (skb2) {
875 skb2->dev = prev_dev;
876 netif_rx(skb2);
877 }
878 }
879
880 prev_dev = sdata->dev;
881 }
882 }
883 if (prev_dev) {
884 skb->dev = prev_dev;
885 netif_rx(skb);
886 skb = NULL;
887 }
888 rcu_read_unlock();
889 dev_kfree_skb(skb);
890}
891
892static void __ieee80211_tx_status(struct ieee80211_hw *hw,
893 struct ieee80211_tx_status *status,
894 int rates_idx, int retry_count)
895{
896 struct sk_buff *skb = status->skb;
897 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
898 struct ieee80211_local *local = hw_to_local(hw);
899 struct ieee80211_tx_info *info = status->info;
900 struct sta_info *sta;
901 __le16 fc;
902 struct ieee80211_supported_band *sband;
903 bool send_to_cooked;
904 bool acked;
905 bool noack_success;
906 struct ieee80211_bar *bar;
907 int shift = 0;
908 int tid = IEEE80211_NUM_TIDS;
909
910 sband = local->hw.wiphy->bands[info->band];
911 fc = hdr->frame_control;
912
913 if (status->sta) {
914 sta = container_of(status->sta, struct sta_info, sta);
915 shift = ieee80211_vif_get_shift(&sta->sdata->vif);
916
917 if (info->flags & IEEE80211_TX_STATUS_EOSP)
918 clear_sta_flag(sta, WLAN_STA_SP);
919
920 acked = !!(info->flags & IEEE80211_TX_STAT_ACK);
921 noack_success = !!(info->flags &
922 IEEE80211_TX_STAT_NOACK_TRANSMITTED);
923
924
925 if (ieee80211_vif_is_mesh(&sta->sdata->vif) &&
926 ieee80211_is_data_qos(fc))
927 ieee80211_mpsp_trigger_process(
928 ieee80211_get_qos_ctl(hdr), sta, true, acked);
929
930 if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) &&
931 (ieee80211_is_data(hdr->frame_control)) &&
932 (rates_idx != -1))
933 sta->tx_stats.last_rate =
934 info->status.rates[rates_idx];
935
936 if ((info->flags & IEEE80211_TX_STAT_AMPDU_NO_BACK) &&
937 (ieee80211_is_data_qos(fc))) {
938 u16 ssn;
939 u8 *qc;
940
941 qc = ieee80211_get_qos_ctl(hdr);
942 tid = qc[0] & 0xf;
943 ssn = ((le16_to_cpu(hdr->seq_ctrl) + 0x10)
944 & IEEE80211_SCTL_SEQ);
945 ieee80211_send_bar(&sta->sdata->vif, hdr->addr1,
946 tid, ssn);
947 } else if (ieee80211_is_data_qos(fc)) {
948 u8 *qc = ieee80211_get_qos_ctl(hdr);
949
950 tid = qc[0] & 0xf;
951 }
952
953 if (!acked && ieee80211_is_back_req(fc)) {
954 u16 control;
955
956
957
958
959
960
961 bar = (struct ieee80211_bar *) skb->data;
962 control = le16_to_cpu(bar->control);
963 if (!(control & IEEE80211_BAR_CTRL_MULTI_TID)) {
964 u16 ssn = le16_to_cpu(bar->start_seq_num);
965
966 tid = (control &
967 IEEE80211_BAR_CTRL_TID_INFO_MASK) >>
968 IEEE80211_BAR_CTRL_TID_INFO_SHIFT;
969
970 ieee80211_set_bar_pending(sta, tid, ssn);
971 }
972 }
973
974 if (info->flags & IEEE80211_TX_STAT_TX_FILTERED) {
975 ieee80211_handle_filtered_frame(local, sta, skb);
976 return;
977 } else if (ieee80211_is_data_present(fc)) {
978 if (!acked && !noack_success)
979 sta->status_stats.msdu_failed[tid]++;
980
981 sta->status_stats.msdu_retries[tid] +=
982 retry_count;
983 }
984
985 if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked)
986 ieee80211_frame_acked(sta, skb);
987
988 } else if (wiphy_ext_feature_isset(local->hw.wiphy,
989 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) {
990 struct ieee80211_sub_if_data *sdata;
991 struct ieee80211_txq *txq;
992 u32 airtime;
993
994
995 sdata = ieee80211_sdata_from_skb(local, skb);
996
997 if (sdata && (txq = sdata->vif.txq)) {
998 airtime = info->status.tx_time ?:
999 ieee80211_calc_expected_tx_airtime(hw,
1000 &sdata->vif,
1001 NULL,
1002 skb->len,
1003 false);
1004
1005 ieee80211_register_airtime(txq, airtime, 0);
1006 }
1007 }
1008
1009
1010
1011
1012
1013 if ((info->flags & IEEE80211_TX_STAT_ACK) ||
1014 (info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED)) {
1015 if (ieee80211_is_first_frag(hdr->seq_ctrl)) {
1016 I802_DEBUG_INC(local->dot11TransmittedFrameCount);
1017 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)))
1018 I802_DEBUG_INC(local->dot11MulticastTransmittedFrameCount);
1019 if (retry_count > 0)
1020 I802_DEBUG_INC(local->dot11RetryCount);
1021 if (retry_count > 1)
1022 I802_DEBUG_INC(local->dot11MultipleRetryCount);
1023 }
1024
1025
1026
1027
1028
1029 if (!is_multicast_ether_addr(hdr->addr1) ||
1030 ieee80211_is_data(fc) ||
1031 ieee80211_is_mgmt(fc))
1032 I802_DEBUG_INC(local->dot11TransmittedFragmentCount);
1033 } else {
1034 if (ieee80211_is_first_frag(hdr->seq_ctrl))
1035 I802_DEBUG_INC(local->dot11FailedCount);
1036 }
1037
1038 if (ieee80211_is_any_nullfunc(fc) &&
1039 ieee80211_has_pm(fc) &&
1040 ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) &&
1041 !(info->flags & IEEE80211_TX_CTL_INJECTED) &&
1042 local->ps_sdata && !(local->scanning)) {
1043 if (info->flags & IEEE80211_TX_STAT_ACK)
1044 local->ps_sdata->u.mgd.flags |=
1045 IEEE80211_STA_NULLFUNC_ACKED;
1046 mod_timer(&local->dynamic_ps_timer,
1047 jiffies + msecs_to_jiffies(10));
1048 }
1049
1050 ieee80211_report_used_skb(local, skb, false);
1051
1052
1053 skb_orphan(skb);
1054
1055
1056 send_to_cooked = !!(info->flags & IEEE80211_TX_CTL_INJECTED) ||
1057 !(ieee80211_is_data(fc));
1058
1059
1060
1061
1062
1063 if (!local->monitors && (!send_to_cooked || !local->cooked_mntrs)) {
1064 if (status->free_list)
1065 list_add_tail(&skb->list, status->free_list);
1066 else
1067 dev_kfree_skb(skb);
1068 return;
1069 }
1070
1071
1072 ieee80211_tx_monitor(local, skb, sband, retry_count, shift,
1073 send_to_cooked, status);
1074}
1075
1076void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
1077{
1078 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1079 struct ieee80211_local *local = hw_to_local(hw);
1080 struct ieee80211_tx_status status = {
1081 .skb = skb,
1082 .info = IEEE80211_SKB_CB(skb),
1083 };
1084 struct sta_info *sta;
1085
1086 rcu_read_lock();
1087
1088 sta = sta_info_get_by_addrs(local, hdr->addr1, hdr->addr2);
1089 if (sta)
1090 status.sta = &sta->sta;
1091
1092 ieee80211_tx_status_ext(hw, &status);
1093 rcu_read_unlock();
1094}
1095EXPORT_SYMBOL(ieee80211_tx_status);
1096
1097void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
1098 struct ieee80211_tx_status *status)
1099{
1100 struct ieee80211_local *local = hw_to_local(hw);
1101 struct ieee80211_tx_info *info = status->info;
1102 struct ieee80211_sta *pubsta = status->sta;
1103 struct sk_buff *skb = status->skb;
1104 struct ieee80211_supported_band *sband;
1105 struct sta_info *sta = NULL;
1106 int rates_idx, retry_count;
1107 bool acked, noack_success, ack_signal_valid;
1108 u16 tx_time_est;
1109
1110 if (pubsta) {
1111 sta = container_of(pubsta, struct sta_info, sta);
1112
1113 if (status->rate)
1114 sta->tx_stats.last_rate_info = *status->rate;
1115 }
1116
1117 if (skb && (tx_time_est =
1118 ieee80211_info_get_tx_time_est(IEEE80211_SKB_CB(skb))) > 0) {
1119
1120
1121
1122 ieee80211_sta_update_pending_airtime(local, sta,
1123 skb_get_queue_mapping(skb),
1124 tx_time_est,
1125 true);
1126 ieee80211_info_set_tx_time_est(IEEE80211_SKB_CB(skb), 0);
1127 }
1128
1129 if (!status->info)
1130 goto free;
1131
1132 rates_idx = ieee80211_tx_get_rates(hw, info, &retry_count);
1133
1134 sband = hw->wiphy->bands[info->band];
1135
1136 acked = !!(info->flags & IEEE80211_TX_STAT_ACK);
1137 noack_success = !!(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED);
1138 ack_signal_valid =
1139 !!(info->status.flags & IEEE80211_TX_STATUS_ACK_SIGNAL_VALID);
1140
1141 if (pubsta) {
1142 struct ieee80211_sub_if_data *sdata = sta->sdata;
1143
1144 if (!acked && !noack_success)
1145 sta->status_stats.retry_failed++;
1146 sta->status_stats.retry_count += retry_count;
1147
1148 if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
1149 if (sdata->vif.type == NL80211_IFTYPE_STATION &&
1150 skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
1151 ieee80211_sta_tx_notify(sdata, (void *) skb->data,
1152 acked, info->status.tx_time);
1153
1154 if (acked) {
1155 sta->status_stats.last_ack = jiffies;
1156
1157 if (sta->status_stats.lost_packets)
1158 sta->status_stats.lost_packets = 0;
1159
1160
1161 sta->status_stats.last_pkt_time = jiffies;
1162
1163
1164 if (sdata->vif.type == NL80211_IFTYPE_STATION &&
1165 unlikely(sdata->u.mgd.probe_send_count > 0))
1166 sdata->u.mgd.probe_send_count = 0;
1167
1168 if (ack_signal_valid) {
1169 sta->status_stats.last_ack_signal =
1170 (s8)info->status.ack_signal;
1171 sta->status_stats.ack_signal_filled = true;
1172 ewma_avg_signal_add(&sta->status_stats.avg_ack_signal,
1173 -info->status.ack_signal);
1174 }
1175 } else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
1176
1177
1178
1179
1180 if (skb)
1181 ieee80211_handle_filtered_frame(local, sta, skb);
1182 return;
1183 } else if (noack_success) {
1184
1185 } else {
1186 ieee80211_lost_packet(sta, info);
1187 }
1188 }
1189
1190 rate_control_tx_status(local, sband, status);
1191 if (ieee80211_vif_is_mesh(&sta->sdata->vif))
1192 ieee80211s_update_metric(local, sta, status);
1193 }
1194
1195 if (skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
1196 return __ieee80211_tx_status(hw, status, rates_idx,
1197 retry_count);
1198
1199 if (acked || noack_success) {
1200 I802_DEBUG_INC(local->dot11TransmittedFrameCount);
1201 if (!pubsta)
1202 I802_DEBUG_INC(local->dot11MulticastTransmittedFrameCount);
1203 if (retry_count > 0)
1204 I802_DEBUG_INC(local->dot11RetryCount);
1205 if (retry_count > 1)
1206 I802_DEBUG_INC(local->dot11MultipleRetryCount);
1207 } else {
1208 I802_DEBUG_INC(local->dot11FailedCount);
1209 }
1210
1211free:
1212 if (!skb)
1213 return;
1214
1215 ieee80211_report_used_skb(local, skb, false);
1216 if (status->free_list)
1217 list_add_tail(&skb->list, status->free_list);
1218 else
1219 dev_kfree_skb(skb);
1220}
1221EXPORT_SYMBOL(ieee80211_tx_status_ext);
1222
1223void ieee80211_tx_rate_update(struct ieee80211_hw *hw,
1224 struct ieee80211_sta *pubsta,
1225 struct ieee80211_tx_info *info)
1226{
1227 struct ieee80211_local *local = hw_to_local(hw);
1228 struct ieee80211_supported_band *sband = hw->wiphy->bands[info->band];
1229 struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
1230 struct ieee80211_tx_status status = {
1231 .info = info,
1232 .sta = pubsta,
1233 };
1234
1235 rate_control_tx_status(local, sband, &status);
1236
1237 if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
1238 sta->tx_stats.last_rate = info->status.rates[0];
1239}
1240EXPORT_SYMBOL(ieee80211_tx_rate_update);
1241
1242void ieee80211_tx_status_8023(struct ieee80211_hw *hw,
1243 struct ieee80211_vif *vif,
1244 struct sk_buff *skb)
1245{
1246 struct ieee80211_sub_if_data *sdata;
1247 struct ieee80211_tx_status status = {
1248 .skb = skb,
1249 .info = IEEE80211_SKB_CB(skb),
1250 };
1251 struct sta_info *sta;
1252
1253 sdata = vif_to_sdata(vif);
1254
1255 rcu_read_lock();
1256
1257 if (!ieee80211_lookup_ra_sta(sdata, skb, &sta) && !IS_ERR(sta))
1258 status.sta = &sta->sta;
1259
1260 ieee80211_tx_status_ext(hw, &status);
1261
1262 rcu_read_unlock();
1263}
1264EXPORT_SYMBOL(ieee80211_tx_status_8023);
1265
1266void ieee80211_report_low_ack(struct ieee80211_sta *pubsta, u32 num_packets)
1267{
1268 struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
1269 cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
1270 num_packets, GFP_ATOMIC);
1271}
1272EXPORT_SYMBOL(ieee80211_report_low_ack);
1273
1274void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb)
1275{
1276 struct ieee80211_local *local = hw_to_local(hw);
1277
1278 ieee80211_report_used_skb(local, skb, true);
1279 dev_kfree_skb_any(skb);
1280}
1281EXPORT_SYMBOL(ieee80211_free_txskb);
1282
1283void ieee80211_purge_tx_queue(struct ieee80211_hw *hw,
1284 struct sk_buff_head *skbs)
1285{
1286 struct sk_buff *skb;
1287
1288 while ((skb = __skb_dequeue(skbs)))
1289 ieee80211_free_txskb(hw, skb);
1290}
1291