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