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((1 << IEEE80211_RADIOTAP_TX_FLAGS) |
309 (1 << 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(1 << 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(1 << 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(1 << 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(1 << 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(1 << 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(1 << 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 __be16 ethertype = 0;
632
633 if (skb->len >= ETH_HLEN && skb->protocol == cpu_to_be16(ETH_P_802_3))
634 skb_copy_bits(skb, 2 * ETH_ALEN, ðertype, ETH_TLEN);
635
636 rcu_read_lock();
637 sdata = ieee80211_sdata_from_skb(local, skb);
638 if (sdata) {
639 if (ethertype == sdata->control_port_protocol ||
640 ethertype == cpu_to_be16(ETH_P_PREAUTH))
641 cfg80211_control_port_tx_status(&sdata->wdev,
642 cookie,
643 skb->data,
644 skb->len,
645 acked,
646 GFP_ATOMIC);
647 else if (ieee80211_is_any_nullfunc(hdr->frame_control))
648 cfg80211_probe_status(sdata->dev, hdr->addr1,
649 cookie, acked,
650 info->status.ack_signal,
651 info->status.is_valid_ack_signal,
652 GFP_ATOMIC);
653 else if (ieee80211_is_mgmt(hdr->frame_control))
654 cfg80211_mgmt_tx_status(&sdata->wdev, cookie,
655 skb->data, skb->len,
656 acked, GFP_ATOMIC);
657 else
658 pr_warn("Unknown status report in ack skb\n");
659
660 }
661 rcu_read_unlock();
662
663 dev_kfree_skb_any(skb);
664 } else if (dropped) {
665 dev_kfree_skb_any(skb);
666 } else {
667
668 skb_complete_wifi_ack(skb, acked);
669 }
670}
671
672static void ieee80211_report_used_skb(struct ieee80211_local *local,
673 struct sk_buff *skb, bool dropped)
674{
675 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
676 u16 tx_time_est = ieee80211_info_get_tx_time_est(info);
677 struct ieee80211_hdr *hdr = (void *)skb->data;
678 bool acked = info->flags & IEEE80211_TX_STAT_ACK;
679
680 if (dropped)
681 acked = false;
682
683 if (tx_time_est) {
684 struct sta_info *sta;
685
686 rcu_read_lock();
687
688 sta = sta_info_get_by_addrs(local, hdr->addr1, hdr->addr2);
689 ieee80211_sta_update_pending_airtime(local, sta,
690 skb_get_queue_mapping(skb),
691 tx_time_est,
692 true);
693 rcu_read_unlock();
694 }
695
696 if (info->flags & IEEE80211_TX_INTFL_MLME_CONN_TX) {
697 struct ieee80211_sub_if_data *sdata;
698
699 rcu_read_lock();
700
701 sdata = ieee80211_sdata_from_skb(local, skb);
702
703 if (!sdata) {
704 skb->dev = NULL;
705 } else {
706 unsigned int hdr_size =
707 ieee80211_hdrlen(hdr->frame_control);
708
709
710 if (ieee80211_is_data(hdr->frame_control) &&
711 (ieee80211_get_tdls_action(skb, hdr_size) ==
712 WLAN_TDLS_TEARDOWN))
713 ieee80211_tdls_td_tx_handle(local, sdata, skb,
714 info->flags);
715 else
716 ieee80211_mgd_conn_tx_status(sdata,
717 hdr->frame_control,
718 acked);
719 }
720
721 rcu_read_unlock();
722 } else if (info->ack_frame_id) {
723 ieee80211_report_ack_skb(local, info, acked, dropped);
724 }
725
726 if (!dropped && skb->destructor) {
727 skb->wifi_acked_valid = 1;
728 skb->wifi_acked = acked;
729 }
730
731 ieee80211_led_tx(local);
732
733 if (skb_has_frag_list(skb)) {
734 kfree_skb_list(skb_shinfo(skb)->frag_list);
735 skb_shinfo(skb)->frag_list = NULL;
736 }
737}
738
739
740
741
742
743
744
745
746#define STA_LOST_PKT_THRESHOLD 50
747#define STA_LOST_PKT_TIME HZ
748#define STA_LOST_TDLS_PKT_THRESHOLD 10
749#define STA_LOST_TDLS_PKT_TIME (10*HZ)
750
751static void ieee80211_lost_packet(struct sta_info *sta,
752 struct ieee80211_tx_info *info)
753{
754 unsigned long pkt_time = STA_LOST_PKT_TIME;
755 unsigned int pkt_thr = STA_LOST_PKT_THRESHOLD;
756
757
758
759
760 if (ieee80211_hw_check(&sta->local->hw, REPORTS_LOW_ACK))
761 return;
762
763
764 if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
765 !(info->flags & IEEE80211_TX_STAT_AMPDU))
766 return;
767
768 sta->status_stats.lost_packets++;
769 if (sta->sta.tdls) {
770 pkt_time = STA_LOST_TDLS_PKT_TIME;
771 pkt_thr = STA_LOST_PKT_THRESHOLD;
772 }
773
774
775
776
777
778
779
780
781 if (sta->status_stats.lost_packets < pkt_thr ||
782 !time_after(jiffies, sta->status_stats.last_pkt_time + pkt_time))
783 return;
784
785 cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
786 sta->status_stats.lost_packets, GFP_ATOMIC);
787 sta->status_stats.lost_packets = 0;
788}
789
790static int ieee80211_tx_get_rates(struct ieee80211_hw *hw,
791 struct ieee80211_tx_info *info,
792 int *retry_count)
793{
794 int count = -1;
795 int i;
796
797 for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
798 if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
799 !(info->flags & IEEE80211_TX_STAT_AMPDU)) {
800
801 info->status.rates[i].idx = -1;
802 info->status.rates[i].count = 0;
803 break;
804 } else if (info->status.rates[i].idx < 0) {
805 break;
806 } else if (i >= hw->max_report_rates) {
807
808 info->status.rates[i].idx = -1;
809 info->status.rates[i].count = 0;
810 break;
811 }
812
813 count += info->status.rates[i].count;
814 }
815
816 if (count < 0)
817 count = 0;
818
819 *retry_count = count;
820 return i - 1;
821}
822
823void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
824 struct ieee80211_supported_band *sband,
825 int retry_count, int shift, bool send_to_cooked,
826 struct ieee80211_tx_status *status)
827{
828 struct sk_buff *skb2;
829 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
830 struct ieee80211_sub_if_data *sdata;
831 struct net_device *prev_dev = NULL;
832 int rtap_len;
833
834
835 rtap_len = ieee80211_tx_radiotap_len(info, status);
836 if (WARN_ON_ONCE(skb_headroom(skb) < rtap_len)) {
837 pr_err("ieee80211_tx_status: headroom too small\n");
838 dev_kfree_skb(skb);
839 return;
840 }
841 ieee80211_add_tx_radiotap_header(local, sband, skb, retry_count,
842 rtap_len, shift, status);
843
844
845 skb_reset_mac_header(skb);
846 skb->ip_summed = CHECKSUM_UNNECESSARY;
847 skb->pkt_type = PACKET_OTHERHOST;
848 skb->protocol = htons(ETH_P_802_2);
849 memset(skb->cb, 0, sizeof(skb->cb));
850
851 rcu_read_lock();
852 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
853 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
854 if (!ieee80211_sdata_running(sdata))
855 continue;
856
857 if ((sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) &&
858 !send_to_cooked)
859 continue;
860
861 if (prev_dev) {
862 skb2 = skb_clone(skb, GFP_ATOMIC);
863 if (skb2) {
864 skb2->dev = prev_dev;
865 netif_rx(skb2);
866 }
867 }
868
869 prev_dev = sdata->dev;
870 }
871 }
872 if (prev_dev) {
873 skb->dev = prev_dev;
874 netif_rx(skb);
875 skb = NULL;
876 }
877 rcu_read_unlock();
878 dev_kfree_skb(skb);
879}
880
881static void __ieee80211_tx_status(struct ieee80211_hw *hw,
882 struct ieee80211_tx_status *status,
883 int rates_idx, int retry_count)
884{
885 struct sk_buff *skb = status->skb;
886 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
887 struct ieee80211_local *local = hw_to_local(hw);
888 struct ieee80211_tx_info *info = status->info;
889 struct sta_info *sta;
890 __le16 fc;
891 struct ieee80211_supported_band *sband;
892 bool send_to_cooked;
893 bool acked;
894 bool noack_success;
895 struct ieee80211_bar *bar;
896 int shift = 0;
897 int tid = IEEE80211_NUM_TIDS;
898
899 sband = local->hw.wiphy->bands[info->band];
900 fc = hdr->frame_control;
901
902 if (status->sta) {
903 sta = container_of(status->sta, struct sta_info, sta);
904 shift = ieee80211_vif_get_shift(&sta->sdata->vif);
905
906 if (info->flags & IEEE80211_TX_STATUS_EOSP)
907 clear_sta_flag(sta, WLAN_STA_SP);
908
909 acked = !!(info->flags & IEEE80211_TX_STAT_ACK);
910 noack_success = !!(info->flags &
911 IEEE80211_TX_STAT_NOACK_TRANSMITTED);
912
913
914 if (ieee80211_vif_is_mesh(&sta->sdata->vif) &&
915 ieee80211_is_data_qos(fc))
916 ieee80211_mpsp_trigger_process(
917 ieee80211_get_qos_ctl(hdr), sta, true, acked);
918
919 if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) &&
920 (ieee80211_is_data(hdr->frame_control)) &&
921 (rates_idx != -1))
922 sta->tx_stats.last_rate =
923 info->status.rates[rates_idx];
924
925 if ((info->flags & IEEE80211_TX_STAT_AMPDU_NO_BACK) &&
926 (ieee80211_is_data_qos(fc))) {
927 u16 ssn;
928 u8 *qc;
929
930 qc = ieee80211_get_qos_ctl(hdr);
931 tid = qc[0] & 0xf;
932 ssn = ((le16_to_cpu(hdr->seq_ctrl) + 0x10)
933 & IEEE80211_SCTL_SEQ);
934 ieee80211_send_bar(&sta->sdata->vif, hdr->addr1,
935 tid, ssn);
936 } else if (ieee80211_is_data_qos(fc)) {
937 u8 *qc = ieee80211_get_qos_ctl(hdr);
938
939 tid = qc[0] & 0xf;
940 }
941
942 if (!acked && ieee80211_is_back_req(fc)) {
943 u16 control;
944
945
946
947
948
949
950 bar = (struct ieee80211_bar *) skb->data;
951 control = le16_to_cpu(bar->control);
952 if (!(control & IEEE80211_BAR_CTRL_MULTI_TID)) {
953 u16 ssn = le16_to_cpu(bar->start_seq_num);
954
955 tid = (control &
956 IEEE80211_BAR_CTRL_TID_INFO_MASK) >>
957 IEEE80211_BAR_CTRL_TID_INFO_SHIFT;
958
959 ieee80211_set_bar_pending(sta, tid, ssn);
960 }
961 }
962
963 if (info->flags & IEEE80211_TX_STAT_TX_FILTERED) {
964 ieee80211_handle_filtered_frame(local, sta, skb);
965 return;
966 } else if (ieee80211_is_data_present(fc)) {
967 if (!acked && !noack_success)
968 sta->status_stats.msdu_failed[tid]++;
969
970 sta->status_stats.msdu_retries[tid] +=
971 retry_count;
972 }
973
974 if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked)
975 ieee80211_frame_acked(sta, skb);
976
977 }
978
979
980
981
982
983 if ((info->flags & IEEE80211_TX_STAT_ACK) ||
984 (info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED)) {
985 if (ieee80211_is_first_frag(hdr->seq_ctrl)) {
986 I802_DEBUG_INC(local->dot11TransmittedFrameCount);
987 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)))
988 I802_DEBUG_INC(local->dot11MulticastTransmittedFrameCount);
989 if (retry_count > 0)
990 I802_DEBUG_INC(local->dot11RetryCount);
991 if (retry_count > 1)
992 I802_DEBUG_INC(local->dot11MultipleRetryCount);
993 }
994
995
996
997
998
999 if (!is_multicast_ether_addr(hdr->addr1) ||
1000 ieee80211_is_data(fc) ||
1001 ieee80211_is_mgmt(fc))
1002 I802_DEBUG_INC(local->dot11TransmittedFragmentCount);
1003 } else {
1004 if (ieee80211_is_first_frag(hdr->seq_ctrl))
1005 I802_DEBUG_INC(local->dot11FailedCount);
1006 }
1007
1008 if (ieee80211_is_any_nullfunc(fc) &&
1009 ieee80211_has_pm(fc) &&
1010 ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) &&
1011 !(info->flags & IEEE80211_TX_CTL_INJECTED) &&
1012 local->ps_sdata && !(local->scanning)) {
1013 if (info->flags & IEEE80211_TX_STAT_ACK) {
1014 local->ps_sdata->u.mgd.flags |=
1015 IEEE80211_STA_NULLFUNC_ACKED;
1016 } else
1017 mod_timer(&local->dynamic_ps_timer, jiffies +
1018 msecs_to_jiffies(10));
1019 }
1020
1021 ieee80211_report_used_skb(local, skb, false);
1022
1023
1024 skb_orphan(skb);
1025
1026
1027 send_to_cooked = !!(info->flags & IEEE80211_TX_CTL_INJECTED) ||
1028 !(ieee80211_is_data(fc));
1029
1030
1031
1032
1033
1034 if (!local->monitors && (!send_to_cooked || !local->cooked_mntrs)) {
1035 if (status->free_list)
1036 list_add_tail(&skb->list, status->free_list);
1037 else
1038 dev_kfree_skb(skb);
1039 return;
1040 }
1041
1042
1043 ieee80211_tx_monitor(local, skb, sband, retry_count, shift,
1044 send_to_cooked, status);
1045}
1046
1047void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
1048{
1049 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1050 struct ieee80211_local *local = hw_to_local(hw);
1051 struct ieee80211_tx_status status = {
1052 .skb = skb,
1053 .info = IEEE80211_SKB_CB(skb),
1054 };
1055 struct sta_info *sta;
1056
1057 rcu_read_lock();
1058
1059 sta = sta_info_get_by_addrs(local, hdr->addr1, hdr->addr2);
1060 if (sta)
1061 status.sta = &sta->sta;
1062
1063 ieee80211_tx_status_ext(hw, &status);
1064 rcu_read_unlock();
1065}
1066EXPORT_SYMBOL(ieee80211_tx_status);
1067
1068void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
1069 struct ieee80211_tx_status *status)
1070{
1071 struct ieee80211_local *local = hw_to_local(hw);
1072 struct ieee80211_tx_info *info = status->info;
1073 struct ieee80211_sta *pubsta = status->sta;
1074 struct sk_buff *skb = status->skb;
1075 struct ieee80211_supported_band *sband;
1076 struct sta_info *sta = NULL;
1077 int rates_idx, retry_count;
1078 bool acked, noack_success;
1079 u16 tx_time_est;
1080
1081 if (pubsta) {
1082 sta = container_of(pubsta, struct sta_info, sta);
1083
1084 if (status->rate)
1085 sta->tx_stats.last_rate_info = *status->rate;
1086 }
1087
1088 if (skb && (tx_time_est =
1089 ieee80211_info_get_tx_time_est(IEEE80211_SKB_CB(skb))) > 0) {
1090
1091
1092
1093 ieee80211_sta_update_pending_airtime(local, sta,
1094 skb_get_queue_mapping(skb),
1095 tx_time_est,
1096 true);
1097 ieee80211_info_set_tx_time_est(IEEE80211_SKB_CB(skb), 0);
1098 }
1099
1100 if (!status->info)
1101 goto free;
1102
1103 rates_idx = ieee80211_tx_get_rates(hw, info, &retry_count);
1104
1105 sband = hw->wiphy->bands[info->band];
1106
1107 acked = !!(info->flags & IEEE80211_TX_STAT_ACK);
1108 noack_success = !!(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED);
1109
1110 if (pubsta) {
1111 struct ieee80211_sub_if_data *sdata = sta->sdata;
1112
1113 if (!acked && !noack_success)
1114 sta->status_stats.retry_failed++;
1115 sta->status_stats.retry_count += retry_count;
1116
1117 if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
1118 if (sdata->vif.type == NL80211_IFTYPE_STATION &&
1119 skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
1120 ieee80211_sta_tx_notify(sdata, (void *) skb->data,
1121 acked, info->status.tx_time);
1122
1123 if (acked) {
1124 sta->status_stats.last_ack = jiffies;
1125
1126 if (sta->status_stats.lost_packets)
1127 sta->status_stats.lost_packets = 0;
1128
1129
1130 sta->status_stats.last_pkt_time = jiffies;
1131
1132
1133 if (sdata->vif.type == NL80211_IFTYPE_STATION &&
1134 unlikely(sdata->u.mgd.probe_send_count > 0))
1135 sdata->u.mgd.probe_send_count = 0;
1136
1137 if (info->status.is_valid_ack_signal) {
1138 sta->status_stats.last_ack_signal =
1139 (s8)info->status.ack_signal;
1140 sta->status_stats.ack_signal_filled = true;
1141 ewma_avg_signal_add(&sta->status_stats.avg_ack_signal,
1142 -info->status.ack_signal);
1143 }
1144 } else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
1145
1146
1147
1148
1149 if (skb)
1150 ieee80211_handle_filtered_frame(local, sta, skb);
1151 return;
1152 } else if (noack_success) {
1153
1154 } else {
1155 ieee80211_lost_packet(sta, info);
1156 }
1157 }
1158
1159 rate_control_tx_status(local, sband, status);
1160 if (ieee80211_vif_is_mesh(&sta->sdata->vif))
1161 ieee80211s_update_metric(local, sta, status);
1162 }
1163
1164 if (skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
1165 return __ieee80211_tx_status(hw, status, rates_idx,
1166 retry_count);
1167
1168 if (acked || noack_success) {
1169 I802_DEBUG_INC(local->dot11TransmittedFrameCount);
1170 if (!pubsta)
1171 I802_DEBUG_INC(local->dot11MulticastTransmittedFrameCount);
1172 if (retry_count > 0)
1173 I802_DEBUG_INC(local->dot11RetryCount);
1174 if (retry_count > 1)
1175 I802_DEBUG_INC(local->dot11MultipleRetryCount);
1176 } else {
1177 I802_DEBUG_INC(local->dot11FailedCount);
1178 }
1179
1180free:
1181 if (!skb)
1182 return;
1183
1184 ieee80211_report_used_skb(local, skb, false);
1185 if (status->free_list)
1186 list_add_tail(&skb->list, status->free_list);
1187 else
1188 dev_kfree_skb(skb);
1189}
1190EXPORT_SYMBOL(ieee80211_tx_status_ext);
1191
1192void ieee80211_tx_rate_update(struct ieee80211_hw *hw,
1193 struct ieee80211_sta *pubsta,
1194 struct ieee80211_tx_info *info)
1195{
1196 struct ieee80211_local *local = hw_to_local(hw);
1197 struct ieee80211_supported_band *sband = hw->wiphy->bands[info->band];
1198 struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
1199 struct ieee80211_tx_status status = {
1200 .info = info,
1201 .sta = pubsta,
1202 };
1203
1204 rate_control_tx_status(local, sband, &status);
1205
1206 if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
1207 sta->tx_stats.last_rate = info->status.rates[0];
1208}
1209EXPORT_SYMBOL(ieee80211_tx_rate_update);
1210
1211void ieee80211_tx_status_8023(struct ieee80211_hw *hw,
1212 struct ieee80211_vif *vif,
1213 struct sk_buff *skb)
1214{
1215 struct ieee80211_sub_if_data *sdata;
1216 struct ieee80211_tx_status status = {
1217 .skb = skb,
1218 .info = IEEE80211_SKB_CB(skb),
1219 };
1220 struct sta_info *sta;
1221
1222 sdata = vif_to_sdata(vif);
1223
1224 rcu_read_lock();
1225
1226 if (!ieee80211_lookup_ra_sta(sdata, skb, &sta) && !IS_ERR(sta))
1227 status.sta = &sta->sta;
1228
1229 ieee80211_tx_status_ext(hw, &status);
1230
1231 rcu_read_unlock();
1232}
1233EXPORT_SYMBOL(ieee80211_tx_status_8023);
1234
1235void ieee80211_report_low_ack(struct ieee80211_sta *pubsta, u32 num_packets)
1236{
1237 struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
1238 cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
1239 num_packets, GFP_ATOMIC);
1240}
1241EXPORT_SYMBOL(ieee80211_report_low_ack);
1242
1243void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb)
1244{
1245 struct ieee80211_local *local = hw_to_local(hw);
1246
1247 ieee80211_report_used_skb(local, skb, true);
1248 dev_kfree_skb_any(skb);
1249}
1250EXPORT_SYMBOL(ieee80211_free_txskb);
1251
1252void ieee80211_purge_tx_queue(struct ieee80211_hw *hw,
1253 struct sk_buff_head *skbs)
1254{
1255 struct sk_buff *skb;
1256
1257 while ((skb = __skb_dequeue(skbs)))
1258 ieee80211_free_txskb(hw, skb);
1259}
1260