Lines Matching +full:data +full:- +full:rates

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright 2002-2005, Instant802 Networks, Inc.
4 * Copyright 2005-2006, Devicescape Software, Inc.
5 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
6 * Copyright 2008-2010 Johannes Berg <johannes@sipsolutions.net>
7 * Copyright 2013-2014 Intel Mobile Communications GmbH
8 * Copyright 2021-2023 Intel Corporation
29 skb->pkt_type = IEEE80211_TX_STATUS_MSG; in ieee80211_tx_status_irqsafe()
30 skb_queue_tail(info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS ? in ieee80211_tx_status_irqsafe()
31 &local->skb_queue : &local->skb_queue_unreliable, skb); in ieee80211_tx_status_irqsafe()
32 tmp = skb_queue_len(&local->skb_queue) + in ieee80211_tx_status_irqsafe()
33 skb_queue_len(&local->skb_queue_unreliable); in ieee80211_tx_status_irqsafe()
35 (skb = skb_dequeue(&local->skb_queue_unreliable))) { in ieee80211_tx_status_irqsafe()
37 tmp--; in ieee80211_tx_status_irqsafe()
38 I802_DEBUG_INC(local->tx_status_drop); in ieee80211_tx_status_irqsafe()
40 tasklet_schedule(&local->tasklet); in ieee80211_tx_status_irqsafe()
49 struct ieee80211_hdr *hdr = (void *)skb->data; in ieee80211_handle_filtered_frame()
52 if (info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER | in ieee80211_handle_filtered_frame()
55 ieee80211_free_txskb(&local->hw, skb); in ieee80211_handle_filtered_frame()
60 * This skb 'survived' a round-trip through the driver, and in ieee80211_handle_filtered_frame()
67 memset(&info->control, 0, sizeof(info->control)); in ieee80211_handle_filtered_frame()
69 info->control.jiffies = jiffies; in ieee80211_handle_filtered_frame()
70 info->control.vif = &sta->sdata->vif; in ieee80211_handle_filtered_frame()
71 info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING; in ieee80211_handle_filtered_frame()
72 info->flags |= IEEE80211_TX_INTFL_RETRANSMISSION; in ieee80211_handle_filtered_frame()
73 info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS; in ieee80211_handle_filtered_frame()
75 sta->deflink.status_stats.filtered++; in ieee80211_handle_filtered_frame()
78 * Clear more-data bit on filtered frames, it might be set in ieee80211_handle_filtered_frame()
84 if (hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) in ieee80211_handle_filtered_frame()
85 hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_MOREDATA); in ieee80211_handle_filtered_frame()
87 if (ieee80211_is_data_qos(hdr->frame_control)) { in ieee80211_handle_filtered_frame()
135 * (a) don't mix the irq-safe/not irq-safe TX status/RX processing in ieee80211_handle_filtered_frame()
146 skb_queue_len(&sta->tx_filtered[ac]) < STA_MAX_TX_BUFFER) { in ieee80211_handle_filtered_frame()
147 skb_queue_tail(&sta->tx_filtered[ac], skb); in ieee80211_handle_filtered_frame()
150 if (!timer_pending(&local->sta_cleanup)) in ieee80211_handle_filtered_frame()
151 mod_timer(&local->sta_cleanup, in ieee80211_handle_filtered_frame()
158 !(info->flags & IEEE80211_TX_INTFL_RETRIED)) { in ieee80211_handle_filtered_frame()
160 info->flags |= IEEE80211_TX_INTFL_RETRIED; in ieee80211_handle_filtered_frame()
165 ps_dbg_ratelimited(sta->sdata, in ieee80211_handle_filtered_frame()
167 skb_queue_len(&sta->tx_filtered[ac]), in ieee80211_handle_filtered_frame()
169 ieee80211_free_txskb(&local->hw, skb); in ieee80211_handle_filtered_frame()
176 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]); in ieee80211_check_pending_bar()
177 if (!tid_tx || !tid_tx->bar_pending) in ieee80211_check_pending_bar()
180 tid_tx->bar_pending = false; in ieee80211_check_pending_bar()
181 ieee80211_send_bar(&sta->sdata->vif, addr, tid, tid_tx->failed_bar_ssn); in ieee80211_check_pending_bar()
186 struct ieee80211_mgmt *mgmt = (void *) skb->data; in ieee80211_frame_acked()
187 struct ieee80211_local *local = sta->local; in ieee80211_frame_acked()
188 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_frame_acked()
190 if (ieee80211_is_data_qos(mgmt->frame_control)) { in ieee80211_frame_acked()
191 struct ieee80211_hdr *hdr = (void *) skb->data; in ieee80211_frame_acked()
195 ieee80211_check_pending_bar(sta, hdr->addr1, tid); in ieee80211_frame_acked()
198 if (ieee80211_is_action(mgmt->frame_control) && in ieee80211_frame_acked()
199 !ieee80211_has_protected(mgmt->frame_control) && in ieee80211_frame_acked()
200 mgmt->u.action.category == WLAN_CATEGORY_HT && in ieee80211_frame_acked()
201 mgmt->u.action.u.ht_smps.action == WLAN_HT_ACTION_SMPS && in ieee80211_frame_acked()
205 switch (mgmt->u.action.u.ht_smps.smps_control) { in ieee80211_frame_acked()
218 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_frame_acked()
220 * This update looks racy, but isn't -- if we come in ieee80211_frame_acked()
226 sdata->deflink.smps_mode = smps_mode; in ieee80211_frame_acked()
227 ieee80211_queue_work(&local->hw, &sdata->recalc_smps); in ieee80211_frame_acked()
236 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]); in ieee80211_set_bar_pending()
240 tid_tx->failed_bar_ssn = ssn; in ieee80211_set_bar_pending()
241 tid_tx->bar_pending = true; in ieee80211_set_bar_pending()
250 if (status && status->n_rates) in ieee80211_tx_radiotap_len()
251 status_rate = &status->rates[status->n_rates - 1]; in ieee80211_tx_radiotap_len()
254 if (status_rate && !(status_rate->rate_idx.flags & in ieee80211_tx_radiotap_len()
261 else if (info->status.rates[0].idx >= 0 && in ieee80211_tx_radiotap_len()
262 !(info->status.rates[0].flags & in ieee80211_tx_radiotap_len()
275 if (status_rate->rate_idx.flags & RATE_INFO_FLAGS_MCS) in ieee80211_tx_radiotap_len()
277 else if (status_rate->rate_idx.flags & RATE_INFO_FLAGS_VHT_MCS) in ieee80211_tx_radiotap_len()
279 else if (status_rate->rate_idx.flags & RATE_INFO_FLAGS_HE_MCS) in ieee80211_tx_radiotap_len()
281 } else if (info->status.rates[0].idx >= 0) { in ieee80211_tx_radiotap_len()
282 if (info->status.rates[0].flags & IEEE80211_TX_RC_MCS) in ieee80211_tx_radiotap_len()
284 else if (info->status.rates[0].flags & IEEE80211_TX_RC_VHT_MCS) in ieee80211_tx_radiotap_len()
298 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_add_tx_radiotap_header()
305 if (status && status->n_rates) in ieee80211_add_tx_radiotap_header()
306 status_rate = &status->rates[status->n_rates - 1]; in ieee80211_add_tx_radiotap_header()
311 rthdr->it_len = cpu_to_le16(rtap_len); in ieee80211_add_tx_radiotap_header()
312 rthdr->it_present = in ieee80211_add_tx_radiotap_header()
326 if (!(status_rate->rate_idx.flags & in ieee80211_add_tx_radiotap_header()
332 legacy_rate = status_rate->rate_idx.legacy; in ieee80211_add_tx_radiotap_header()
333 } else if (info->status.rates[0].idx >= 0 && in ieee80211_add_tx_radiotap_header()
334 !(info->status.rates[0].flags & (IEEE80211_TX_RC_MCS | in ieee80211_add_tx_radiotap_header()
338 sband = local->hw.wiphy->bands[info->band]; in ieee80211_add_tx_radiotap_header()
340 sband->bitrates[info->status.rates[0].idx].bitrate; in ieee80211_add_tx_radiotap_header()
344 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_RATE)); in ieee80211_add_tx_radiotap_header()
352 if (!(info->flags & IEEE80211_TX_STAT_ACK) && in ieee80211_add_tx_radiotap_header()
353 !is_multicast_ether_addr(hdr->addr1)) in ieee80211_add_tx_radiotap_header()
356 if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) in ieee80211_add_tx_radiotap_header()
358 if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) in ieee80211_add_tx_radiotap_header()
369 if (status_rate && (status_rate->rate_idx.flags & RATE_INFO_FLAGS_MCS)) in ieee80211_add_tx_radiotap_header()
371 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_MCS)); in ieee80211_add_tx_radiotap_header()
375 if (status_rate->rate_idx.flags & RATE_INFO_FLAGS_SHORT_GI) in ieee80211_add_tx_radiotap_header()
377 if (status_rate->rate_idx.bw == RATE_INFO_BW_40) in ieee80211_add_tx_radiotap_header()
379 pos[2] = status_rate->rate_idx.mcs; in ieee80211_add_tx_radiotap_header()
381 } else if (status_rate && (status_rate->rate_idx.flags & in ieee80211_add_tx_radiotap_header()
384 u16 known = local->hw.radiotap_vht_details & in ieee80211_add_tx_radiotap_header()
388 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_VHT)); in ieee80211_add_tx_radiotap_header()
391 pos = (u8 *)rthdr + ALIGN(pos - (u8 *)rthdr, 2); in ieee80211_add_tx_radiotap_header()
393 /* u16 known - IEEE80211_RADIOTAP_VHT_KNOWN_* */ in ieee80211_add_tx_radiotap_header()
397 /* u8 flags - IEEE80211_RADIOTAP_VHT_FLAG_* */ in ieee80211_add_tx_radiotap_header()
398 if (status_rate->rate_idx.flags & RATE_INFO_FLAGS_SHORT_GI) in ieee80211_add_tx_radiotap_header()
403 switch (status_rate->rate_idx.bw) { in ieee80211_add_tx_radiotap_header()
420 *pos = (status_rate->rate_idx.mcs << 4) | in ieee80211_add_tx_radiotap_header()
421 status_rate->rate_idx.nss; in ieee80211_add_tx_radiotap_header()
430 } else if (status_rate && (status_rate->rate_idx.flags & in ieee80211_add_tx_radiotap_header()
435 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_HE)); in ieee80211_add_tx_radiotap_header()
438 pos = (u8 *)rthdr + ALIGN(pos - (u8 *)rthdr, 2); in ieee80211_add_tx_radiotap_header()
441 he->data1 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_FORMAT_SU | in ieee80211_add_tx_radiotap_header()
446 he->data2 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_GI_KNOWN); in ieee80211_add_tx_radiotap_header()
450 he->data6 |= HE_PREP(DATA6_NSTS, status_rate->rate_idx.nss); in ieee80211_add_tx_radiotap_header()
460 he->data3 |= HE_PREP(DATA3_DATA_MCS, status_rate->rate_idx.mcs); in ieee80211_add_tx_radiotap_header()
461 he->data3 |= HE_PREP(DATA3_DATA_DCM, status_rate->rate_idx.he_dcm); in ieee80211_add_tx_radiotap_header()
463 he->data5 |= HE_PREP(DATA5_GI, status_rate->rate_idx.he_gi); in ieee80211_add_tx_radiotap_header()
465 switch (status_rate->rate_idx.bw) { in ieee80211_add_tx_radiotap_header()
467 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC, in ieee80211_add_tx_radiotap_header()
471 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC, in ieee80211_add_tx_radiotap_header()
475 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC, in ieee80211_add_tx_radiotap_header()
479 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC, in ieee80211_add_tx_radiotap_header()
495 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC, in ieee80211_add_tx_radiotap_header()
496 status_rate->rate_idx.he_ru_alloc + 4); in ieee80211_add_tx_radiotap_header()
499 WARN_ONCE(1, "Invalid SU BW %d\n", status_rate->rate_idx.bw); in ieee80211_add_tx_radiotap_header()
505 if (status_rate || info->status.rates[0].idx < 0) in ieee80211_add_tx_radiotap_header()
510 if (info->status.rates[0].flags & IEEE80211_TX_RC_MCS) { in ieee80211_add_tx_radiotap_header()
511 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_MCS)); in ieee80211_add_tx_radiotap_header()
515 if (info->status.rates[0].flags & IEEE80211_TX_RC_SHORT_GI) in ieee80211_add_tx_radiotap_header()
517 if (info->status.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) in ieee80211_add_tx_radiotap_header()
519 if (info->status.rates[0].flags & IEEE80211_TX_RC_GREEN_FIELD) in ieee80211_add_tx_radiotap_header()
521 pos[2] = info->status.rates[0].idx; in ieee80211_add_tx_radiotap_header()
523 } else if (info->status.rates[0].flags & IEEE80211_TX_RC_VHT_MCS) { in ieee80211_add_tx_radiotap_header()
524 u16 known = local->hw.radiotap_vht_details & in ieee80211_add_tx_radiotap_header()
528 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_VHT)); in ieee80211_add_tx_radiotap_header()
531 pos = (u8 *)rthdr + ALIGN(pos - (u8 *)rthdr, 2); in ieee80211_add_tx_radiotap_header()
533 /* u16 known - IEEE80211_RADIOTAP_VHT_KNOWN_* */ in ieee80211_add_tx_radiotap_header()
537 /* u8 flags - IEEE80211_RADIOTAP_VHT_FLAG_* */ in ieee80211_add_tx_radiotap_header()
538 if (info->status.rates[0].flags & IEEE80211_TX_RC_SHORT_GI) in ieee80211_add_tx_radiotap_header()
543 if (info->status.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) in ieee80211_add_tx_radiotap_header()
545 else if (info->status.rates[0].flags & IEEE80211_TX_RC_80_MHZ_WIDTH) in ieee80211_add_tx_radiotap_header()
547 else if (info->status.rates[0].flags & IEEE80211_TX_RC_160_MHZ_WIDTH) in ieee80211_add_tx_radiotap_header()
554 *pos = (ieee80211_rate_get_vht_mcs(&info->status.rates[0]) << 4) | in ieee80211_add_tx_radiotap_header()
555 ieee80211_rate_get_vht_nss(&info->status.rates[0]); in ieee80211_add_tx_radiotap_header()
569 * If the frame wasn't ACKed by the peer - it will be re-sent through the AP
579 /* Get the teardown data we need and free the lock */ in ieee80211_tdls_td_tx_handle()
580 spin_lock(&sdata->u.mgd.teardown_lock); in ieee80211_tdls_td_tx_handle()
581 teardown_skb = sdata->u.mgd.teardown_skb; in ieee80211_tdls_td_tx_handle()
582 orig_teardown_skb = sdata->u.mgd.orig_teardown_skb; in ieee80211_tdls_td_tx_handle()
584 sdata->u.mgd.teardown_skb = NULL; in ieee80211_tdls_td_tx_handle()
585 sdata->u.mgd.orig_teardown_skb = NULL; in ieee80211_tdls_td_tx_handle()
588 spin_unlock(&sdata->u.mgd.teardown_lock); in ieee80211_tdls_td_tx_handle()
592 WARN_ON(!ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)); in ieee80211_tdls_td_tx_handle()
601 ieee80211_subif_start_xmit(teardown_skb, skb->dev); in ieee80211_tdls_td_tx_handle()
611 if (skb->dev) { in ieee80211_sdata_from_skb()
612 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_sdata_from_skb()
613 if (!sdata->dev) in ieee80211_sdata_from_skb()
616 if (skb->dev == sdata->dev) in ieee80211_sdata_from_skb()
623 return rcu_dereference(local->p2p_sdata); in ieee80211_sdata_from_skb()
635 spin_lock_irqsave(&local->ack_status_lock, flags); in ieee80211_report_ack_skb()
636 skb = idr_remove(&local->ack_status_frames, info->ack_frame_id); in ieee80211_report_ack_skb()
637 spin_unlock_irqrestore(&local->ack_status_lock, flags); in ieee80211_report_ack_skb()
642 if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) { in ieee80211_report_ack_skb()
643 u64 cookie = IEEE80211_SKB_CB(skb)->ack.cookie; in ieee80211_report_ack_skb()
645 struct ieee80211_hdr *hdr = (void *)skb->data; in ieee80211_report_ack_skb()
647 !!(info->status.flags & IEEE80211_TX_STATUS_ACK_SIGNAL_VALID); in ieee80211_report_ack_skb()
650 .buf = skb->data, in ieee80211_report_ack_skb()
651 .len = skb->len, in ieee80211_report_ack_skb()
658 ktime_to_ns(skb_hwtstamps(orig_skb)->hwtstamp); in ieee80211_report_ack_skb()
665 if (skb->protocol == sdata->control_port_protocol || in ieee80211_report_ack_skb()
666 skb->protocol == cpu_to_be16(ETH_P_PREAUTH)) in ieee80211_report_ack_skb()
667 cfg80211_control_port_tx_status(&sdata->wdev, in ieee80211_report_ack_skb()
669 skb->data, in ieee80211_report_ack_skb()
670 skb->len, in ieee80211_report_ack_skb()
673 else if (ieee80211_is_any_nullfunc(hdr->frame_control)) in ieee80211_report_ack_skb()
674 cfg80211_probe_status(sdata->dev, hdr->addr1, in ieee80211_report_ack_skb()
676 info->status.ack_signal, in ieee80211_report_ack_skb()
679 else if (ieee80211_is_mgmt(hdr->frame_control)) in ieee80211_report_ack_skb()
680 cfg80211_mgmt_tx_status_ext(&sdata->wdev, in ieee80211_report_ack_skb()
704 struct ieee80211_hdr *hdr = (void *)skb->data; in ieee80211_report_used_skb()
705 bool acked = info->flags & IEEE80211_TX_STAT_ACK; in ieee80211_report_used_skb()
715 sta = sta_info_get_by_addrs(local, hdr->addr1, hdr->addr2); in ieee80211_report_used_skb()
723 if (info->flags & IEEE80211_TX_INTFL_MLME_CONN_TX) { in ieee80211_report_used_skb()
731 skb->dev = NULL; in ieee80211_report_used_skb()
734 ieee80211_hdrlen(hdr->frame_control); in ieee80211_report_used_skb()
737 if (ieee80211_is_data(hdr->frame_control) && in ieee80211_report_used_skb()
741 info->flags); in ieee80211_report_used_skb()
748 skb_queue_tail(&sdata->status_queue, in ieee80211_report_used_skb()
750 wiphy_work_queue(local->hw.wiphy, in ieee80211_report_used_skb()
751 &sdata->work); in ieee80211_report_used_skb()
756 hdr->frame_control, in ieee80211_report_used_skb()
762 } else if (info->ack_frame_id) { in ieee80211_report_used_skb()
767 if (!dropped && skb->destructor) { in ieee80211_report_used_skb()
768 skb->wifi_acked_valid = 1; in ieee80211_report_used_skb()
769 skb->wifi_acked = acked; in ieee80211_report_used_skb()
775 kfree_skb_list(skb_shinfo(skb)->frag_list); in ieee80211_report_used_skb()
776 skb_shinfo(skb)->frag_list = NULL; in ieee80211_report_used_skb()
784 * - on # of retransmissions
785 * - current throughput (higher value for higher tpt)?
800 if (ieee80211_hw_check(&sta->local->hw, REPORTS_LOW_ACK)) in ieee80211_lost_packet()
804 if ((info->flags & IEEE80211_TX_CTL_AMPDU) && in ieee80211_lost_packet()
805 !(info->flags & IEEE80211_TX_STAT_AMPDU)) in ieee80211_lost_packet()
808 sta->deflink.status_stats.lost_packets++; in ieee80211_lost_packet()
809 if (sta->sta.tdls) { in ieee80211_lost_packet()
817 * last STA_LOST_TDLS_PKT_TIME ms, before triggering the CQM packet-loss in ieee80211_lost_packet()
819 * For non-TDLS, use STA_LOST_PKT_THRESHOLD and STA_LOST_PKT_TIME in ieee80211_lost_packet()
821 if (sta->deflink.status_stats.lost_packets < pkt_thr || in ieee80211_lost_packet()
822 !time_after(jiffies, sta->deflink.status_stats.last_pkt_time + pkt_time)) in ieee80211_lost_packet()
825 cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr, in ieee80211_lost_packet()
826 sta->deflink.status_stats.lost_packets, in ieee80211_lost_packet()
828 sta->deflink.status_stats.lost_packets = 0; in ieee80211_lost_packet()
835 int count = -1; in ieee80211_tx_get_rates()
839 if ((info->flags & IEEE80211_TX_CTL_AMPDU) && in ieee80211_tx_get_rates()
840 !(info->flags & IEEE80211_TX_STAT_AMPDU)) { in ieee80211_tx_get_rates()
842 info->status.rates[i].idx = -1; in ieee80211_tx_get_rates()
843 info->status.rates[i].count = 0; in ieee80211_tx_get_rates()
845 } else if (info->status.rates[i].idx < 0) { in ieee80211_tx_get_rates()
847 } else if (i >= hw->max_report_rates) { in ieee80211_tx_get_rates()
849 info->status.rates[i].idx = -1; in ieee80211_tx_get_rates()
850 info->status.rates[i].count = 0; in ieee80211_tx_get_rates()
854 count += info->status.rates[i].count; in ieee80211_tx_get_rates()
861 return i - 1; in ieee80211_tx_get_rates()
886 skb->ip_summed = CHECKSUM_UNNECESSARY; in ieee80211_tx_monitor()
887 skb->pkt_type = PACKET_OTHERHOST; in ieee80211_tx_monitor()
888 skb->protocol = htons(ETH_P_802_2); in ieee80211_tx_monitor()
889 memset(skb->cb, 0, sizeof(skb->cb)); in ieee80211_tx_monitor()
892 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_tx_monitor()
893 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_tx_monitor()
897 if ((sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) && in ieee80211_tx_monitor()
904 skb2->dev = prev_dev; in ieee80211_tx_monitor()
909 prev_dev = sdata->dev; in ieee80211_tx_monitor()
913 skb->dev = prev_dev; in ieee80211_tx_monitor()
925 struct sk_buff *skb = status->skb; in __ieee80211_tx_status()
926 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in __ieee80211_tx_status()
928 struct ieee80211_tx_info *info = status->info; in __ieee80211_tx_status()
938 fc = hdr->frame_control; in __ieee80211_tx_status()
940 if (status->sta) { in __ieee80211_tx_status()
941 sta = container_of(status->sta, struct sta_info, sta); in __ieee80211_tx_status()
942 shift = ieee80211_vif_get_shift(&sta->sdata->vif); in __ieee80211_tx_status()
944 if (info->flags & IEEE80211_TX_STATUS_EOSP) in __ieee80211_tx_status()
947 acked = !!(info->flags & IEEE80211_TX_STAT_ACK); in __ieee80211_tx_status()
948 noack_success = !!(info->flags & in __ieee80211_tx_status()
952 if (ieee80211_vif_is_mesh(&sta->sdata->vif) && in __ieee80211_tx_status()
957 if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) && in __ieee80211_tx_status()
958 (ieee80211_is_data(hdr->frame_control)) && in __ieee80211_tx_status()
959 (rates_idx != -1)) in __ieee80211_tx_status()
960 sta->deflink.tx_stats.last_rate = in __ieee80211_tx_status()
961 info->status.rates[rates_idx]; in __ieee80211_tx_status()
963 if ((info->flags & IEEE80211_TX_STAT_AMPDU_NO_BACK) && in __ieee80211_tx_status()
970 ssn = ((le16_to_cpu(hdr->seq_ctrl) + 0x10) in __ieee80211_tx_status()
972 ieee80211_send_bar(&sta->sdata->vif, hdr->addr1, in __ieee80211_tx_status()
988 bar = (struct ieee80211_bar *) skb->data; in __ieee80211_tx_status()
989 control = le16_to_cpu(bar->control); in __ieee80211_tx_status()
991 u16 ssn = le16_to_cpu(bar->start_seq_num); in __ieee80211_tx_status()
1001 if (info->flags & IEEE80211_TX_STAT_TX_FILTERED) { in __ieee80211_tx_status()
1006 sta->deflink.status_stats.msdu_failed[tid]++; in __ieee80211_tx_status()
1008 sta->deflink.status_stats.msdu_retries[tid] += in __ieee80211_tx_status()
1012 if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked) in __ieee80211_tx_status()
1018 * Fragments are passed to low-level drivers as separate skbs, so these in __ieee80211_tx_status()
1021 if ((info->flags & IEEE80211_TX_STAT_ACK) || in __ieee80211_tx_status()
1022 (info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED)) { in __ieee80211_tx_status()
1023 if (ieee80211_is_first_frag(hdr->seq_ctrl)) { in __ieee80211_tx_status()
1024 I802_DEBUG_INC(local->dot11TransmittedFrameCount); in __ieee80211_tx_status()
1026 I802_DEBUG_INC(local->dot11MulticastTransmittedFrameCount); in __ieee80211_tx_status()
1028 I802_DEBUG_INC(local->dot11RetryCount); in __ieee80211_tx_status()
1030 I802_DEBUG_INC(local->dot11MultipleRetryCount); in __ieee80211_tx_status()
1035 * with a multicast address in the address 1 field of type Data in __ieee80211_tx_status()
1037 if (!is_multicast_ether_addr(hdr->addr1) || in __ieee80211_tx_status()
1040 I802_DEBUG_INC(local->dot11TransmittedFragmentCount); in __ieee80211_tx_status()
1042 if (ieee80211_is_first_frag(hdr->seq_ctrl)) in __ieee80211_tx_status()
1043 I802_DEBUG_INC(local->dot11FailedCount); in __ieee80211_tx_status()
1048 ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) && in __ieee80211_tx_status()
1049 !(info->flags & IEEE80211_TX_CTL_INJECTED) && in __ieee80211_tx_status()
1050 local->ps_sdata && !(local->scanning)) { in __ieee80211_tx_status()
1051 if (info->flags & IEEE80211_TX_STAT_ACK) in __ieee80211_tx_status()
1052 local->ps_sdata->u.mgd.flags |= in __ieee80211_tx_status()
1054 mod_timer(&local->dynamic_ps_timer, in __ieee80211_tx_status()
1058 ieee80211_report_used_skb(local, skb, false, status->ack_hwtstamp); in __ieee80211_tx_status()
1063 /* Need to make a copy before skb->cb gets cleared */ in __ieee80211_tx_status()
1064 send_to_cooked = !!(info->flags & IEEE80211_TX_CTL_INJECTED) || in __ieee80211_tx_status()
1071 if (!local->monitors && (!send_to_cooked || !local->cooked_mntrs)) { in __ieee80211_tx_status()
1072 if (status->free_list) in __ieee80211_tx_status()
1073 list_add_tail(&skb->list, status->free_list); in __ieee80211_tx_status()
1086 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_tx_status()
1096 sta = sta_info_get_by_addrs(local, hdr->addr1, hdr->addr2); in ieee80211_tx_status()
1098 status.sta = &sta->sta; in ieee80211_tx_status()
1109 struct ieee80211_tx_info *info = status->info; in ieee80211_tx_status_ext()
1110 struct ieee80211_sta *pubsta = status->sta; in ieee80211_tx_status_ext()
1111 struct sk_buff *skb = status->skb; in ieee80211_tx_status_ext()
1120 if (status->n_rates) in ieee80211_tx_status_ext()
1121 sta->deflink.tx_stats.last_rate_info = in ieee80211_tx_status_ext()
1122 status->rates[status->n_rates - 1].rate_idx; in ieee80211_tx_status_ext()
1137 if (!status->info) in ieee80211_tx_status_ext()
1142 acked = !!(info->flags & IEEE80211_TX_STAT_ACK); in ieee80211_tx_status_ext()
1143 noack_success = !!(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED); in ieee80211_tx_status_ext()
1145 !!(info->status.flags & IEEE80211_TX_STATUS_ACK_SIGNAL_VALID); in ieee80211_tx_status_ext()
1148 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_tx_status_ext()
1151 sta->deflink.status_stats.retry_failed++; in ieee80211_tx_status_ext()
1152 sta->deflink.status_stats.retry_count += retry_count; in ieee80211_tx_status_ext()
1154 if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) { in ieee80211_tx_status_ext()
1155 if (sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_tx_status_ext()
1156 skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) in ieee80211_tx_status_ext()
1157 ieee80211_sta_tx_notify(sdata, (void *) skb->data, in ieee80211_tx_status_ext()
1158 acked, info->status.tx_time); in ieee80211_tx_status_ext()
1161 sta->deflink.status_stats.last_ack = jiffies; in ieee80211_tx_status_ext()
1163 if (sta->deflink.status_stats.lost_packets) in ieee80211_tx_status_ext()
1164 sta->deflink.status_stats.lost_packets = 0; in ieee80211_tx_status_ext()
1167 sta->deflink.status_stats.last_pkt_time = jiffies; in ieee80211_tx_status_ext()
1170 if (sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_tx_status_ext()
1171 unlikely(sdata->u.mgd.probe_send_count > 0)) in ieee80211_tx_status_ext()
1172 sdata->u.mgd.probe_send_count = 0; in ieee80211_tx_status_ext()
1175 sta->deflink.status_stats.last_ack_signal = in ieee80211_tx_status_ext()
1176 (s8)info->status.ack_signal; in ieee80211_tx_status_ext()
1177 sta->deflink.status_stats.ack_signal_filled = true; in ieee80211_tx_status_ext()
1178 ewma_avg_signal_add(&sta->deflink.status_stats.avg_ack_signal, in ieee80211_tx_status_ext()
1179 -info->status.ack_signal); in ieee80211_tx_status_ext()
1197 if (ieee80211_vif_is_mesh(&sta->sdata->vif)) in ieee80211_tx_status_ext()
1201 if (skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) in ieee80211_tx_status_ext()
1206 I802_DEBUG_INC(local->dot11TransmittedFrameCount); in ieee80211_tx_status_ext()
1208 I802_DEBUG_INC(local->dot11MulticastTransmittedFrameCount); in ieee80211_tx_status_ext()
1210 I802_DEBUG_INC(local->dot11RetryCount); in ieee80211_tx_status_ext()
1212 I802_DEBUG_INC(local->dot11MultipleRetryCount); in ieee80211_tx_status_ext()
1214 I802_DEBUG_INC(local->dot11FailedCount); in ieee80211_tx_status_ext()
1221 ieee80211_report_used_skb(local, skb, false, status->ack_hwtstamp); in ieee80211_tx_status_ext()
1222 if (status->free_list) in ieee80211_tx_status_ext()
1223 list_add_tail(&skb->list, status->free_list); in ieee80211_tx_status_ext()
1242 if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) in ieee80211_tx_rate_update()
1243 sta->deflink.tx_stats.last_rate = info->status.rates[0]; in ieee80211_tx_rate_update()
1250 cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr, in ieee80211_report_low_ack()