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