Lines Matching +full:rates +full:- +full:mcs

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-2025 Intel Corporation
29 skb->pkt_type = IEEE80211_TX_STATUS_MSG;
30 skb_queue_tail(info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS ?
31 &local->skb_queue : &local->skb_queue_unreliable, skb);
32 tmp = skb_queue_len(&local->skb_queue) +
33 skb_queue_len(&local->skb_queue_unreliable);
35 (skb = skb_dequeue(&local->skb_queue_unreliable))) {
37 tmp--;
38 I802_DEBUG_INC(local->tx_status_drop);
40 tasklet_schedule(&local->tasklet);
49 struct ieee80211_hdr *hdr = (void *)skb->data;
52 if (info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER |
55 ieee80211_free_txskb(&local->hw, skb);
60 * This skb 'survived' a round-trip through the driver, and
67 memset(&info->control, 0, sizeof(info->control));
69 info->control.jiffies = jiffies;
70 info->control.vif = &sta->sdata->vif;
71 info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
72 info->flags |= IEEE80211_TX_INTFL_RETRANSMISSION;
73 info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
75 sta->deflink.status_stats.filtered++;
78 * Clear more-data bit on filtered frames, it might be set
84 if (hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_MOREDATA))
85 hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_MOREDATA);
87 if (ieee80211_is_data_qos(hdr->frame_control)) {
135 * (a) don't mix the irq-safe/not irq-safe TX status/RX processing
146 skb_queue_len(&sta->tx_filtered[ac]) < STA_MAX_TX_BUFFER) {
147 skb_queue_tail(&sta->tx_filtered[ac], skb);
150 if (!timer_pending(&local->sta_cleanup))
151 mod_timer(&local->sta_cleanup,
158 !(info->flags & IEEE80211_TX_INTFL_RETRIED)) {
160 info->flags |= IEEE80211_TX_INTFL_RETRIED;
165 ps_dbg_ratelimited(sta->sdata,
167 skb_queue_len(&sta->tx_filtered[ac]),
169 ieee80211_free_txskb(&local->hw, skb);
176 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
177 if (!tid_tx || !tid_tx->bar_pending)
180 tid_tx->bar_pending = false;
181 ieee80211_send_bar(&sta->sdata->vif, addr, tid, tid_tx->failed_bar_ssn);
186 struct ieee80211_mgmt *mgmt = (void *) skb->data;
188 if (ieee80211_is_data_qos(mgmt->frame_control)) {
189 struct ieee80211_hdr *hdr = (void *) skb->data;
193 ieee80211_check_pending_bar(sta, hdr->addr1, tid);
201 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
205 tid_tx->failed_bar_ssn = ssn;
206 tid_tx->bar_pending = true;
215 if (status && status->n_rates)
216 status_rate = &status->rates[status->n_rates - 1];
219 if (status_rate && !(status_rate->rate_idx.flags &
226 else if (info->status.rates[0].idx >= 0 &&
227 !(info->status.rates[0].flags &
240 if (status_rate->rate_idx.flags & RATE_INFO_FLAGS_MCS)
242 else if (status_rate->rate_idx.flags & RATE_INFO_FLAGS_VHT_MCS)
244 else if (status_rate->rate_idx.flags & RATE_INFO_FLAGS_HE_MCS)
246 } else if (info->status.rates[0].idx >= 0) {
247 if (info->status.rates[0].flags & IEEE80211_TX_RC_MCS)
249 else if (info->status.rates[0].flags & IEEE80211_TX_RC_VHT_MCS)
263 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
270 if (status && status->n_rates)
271 status_rate = &status->rates[status->n_rates - 1];
276 rthdr->it_len = cpu_to_le16(rtap_len);
277 rthdr->it_present =
291 if (!(status_rate->rate_idx.flags &
297 legacy_rate = status_rate->rate_idx.legacy;
298 } else if (info->status.rates[0].idx >= 0 &&
299 !(info->status.rates[0].flags & (IEEE80211_TX_RC_MCS |
303 sband = local->hw.wiphy->bands[info->band];
305 sband->bitrates[info->status.rates[0].idx].bitrate;
309 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_RATE));
317 if (!(info->flags & IEEE80211_TX_STAT_ACK) &&
318 !is_multicast_ether_addr(hdr->addr1))
321 if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
323 if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS)
334 if (status_rate && (status_rate->rate_idx.flags & RATE_INFO_FLAGS_MCS))
336 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_MCS));
340 if (status_rate->rate_idx.flags & RATE_INFO_FLAGS_SHORT_GI)
342 if (status_rate->rate_idx.bw == RATE_INFO_BW_40)
344 pos[2] = status_rate->rate_idx.mcs;
346 } else if (status_rate && (status_rate->rate_idx.flags &
349 u16 known = local->hw.radiotap_vht_details &
353 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_VHT));
356 pos = (u8 *)rthdr + ALIGN(pos - (u8 *)rthdr, 2);
358 /* u16 known - IEEE80211_RADIOTAP_VHT_KNOWN_* */
362 /* u8 flags - IEEE80211_RADIOTAP_VHT_FLAG_* */
363 if (status_rate->rate_idx.flags & RATE_INFO_FLAGS_SHORT_GI)
368 switch (status_rate->rate_idx.bw) {
385 *pos = (status_rate->rate_idx.mcs << 4) |
386 status_rate->rate_idx.nss;
395 } else if (status_rate && (status_rate->rate_idx.flags &
400 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_HE));
403 pos = (u8 *)rthdr + ALIGN(pos - (u8 *)rthdr, 2);
406 he->data1 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_FORMAT_SU |
411 he->data2 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_GI_KNOWN);
415 he->data6 |= HE_PREP(DATA6_NSTS, status_rate->rate_idx.nss);
425 he->data3 |= HE_PREP(DATA3_DATA_MCS, status_rate->rate_idx.mcs);
426 he->data3 |= HE_PREP(DATA3_DATA_DCM, status_rate->rate_idx.he_dcm);
428 he->data5 |= HE_PREP(DATA5_GI, status_rate->rate_idx.he_gi);
430 switch (status_rate->rate_idx.bw) {
432 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC,
436 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC,
440 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC,
444 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC,
460 he->data5 |= HE_PREP(DATA5_DATA_BW_RU_ALLOC,
461 status_rate->rate_idx.he_ru_alloc + 4);
464 WARN_ONCE(1, "Invalid SU BW %d\n", status_rate->rate_idx.bw);
470 if (status_rate || info->status.rates[0].idx < 0)
475 if (info->status.rates[0].flags & IEEE80211_TX_RC_MCS) {
476 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_MCS));
480 if (info->status.rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
482 if (info->status.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
484 if (info->status.rates[0].flags & IEEE80211_TX_RC_GREEN_FIELD)
486 pos[2] = info->status.rates[0].idx;
488 } else if (info->status.rates[0].flags & IEEE80211_TX_RC_VHT_MCS) {
489 u16 known = local->hw.radiotap_vht_details &
493 rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_VHT));
496 pos = (u8 *)rthdr + ALIGN(pos - (u8 *)rthdr, 2);
498 /* u16 known - IEEE80211_RADIOTAP_VHT_KNOWN_* */
502 /* u8 flags - IEEE80211_RADIOTAP_VHT_FLAG_* */
503 if (info->status.rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
508 if (info->status.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
510 else if (info->status.rates[0].flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
512 else if (info->status.rates[0].flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
519 *pos = (ieee80211_rate_get_vht_mcs(&info->status.rates[0]) << 4) |
520 ieee80211_rate_get_vht_nss(&info->status.rates[0]);
534 * If the frame wasn't ACKed by the peer - it will be re-sent through the AP
545 spin_lock(&sdata->u.mgd.teardown_lock);
546 teardown_skb = sdata->u.mgd.teardown_skb;
547 orig_teardown_skb = sdata->u.mgd.orig_teardown_skb;
549 sdata->u.mgd.teardown_skb = NULL;
550 sdata->u.mgd.orig_teardown_skb = NULL;
553 spin_unlock(&sdata->u.mgd.teardown_lock);
557 WARN_ON(!ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS));
566 ieee80211_subif_start_xmit(teardown_skb, skb->dev);
575 struct ieee80211_hdr *hdr = (void *)skb->data;
577 if (skb->dev) {
578 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
579 if (!sdata->dev)
582 if (skb->dev == sdata->dev)
589 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
590 switch (sdata->vif.type) {
594 if (sdata->u.nan.started)
601 if (ether_addr_equal(sdata->vif.addr, hdr->addr2))
617 spin_lock_irqsave(&local->ack_status_lock, flags);
618 skb = idr_remove(&local->ack_status_frames, info->status_data);
619 spin_unlock_irqrestore(&local->ack_status_lock, flags);
624 if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) {
625 u64 cookie = IEEE80211_SKB_CB(skb)->ack.cookie;
627 struct ieee80211_hdr *hdr = (void *)skb->data;
629 !!(info->status.flags & IEEE80211_TX_STATUS_ACK_SIGNAL_VALID);
632 .buf = skb->data,
633 .len = skb->len,
640 ktime_to_ns(skb_hwtstamps(orig_skb)->hwtstamp);
647 if (skb->protocol == sdata->control_port_protocol ||
648 skb->protocol == cpu_to_be16(ETH_P_PREAUTH))
649 cfg80211_control_port_tx_status(&sdata->wdev,
651 skb->data,
652 skb->len,
655 else if (ieee80211_is_any_nullfunc(hdr->frame_control))
656 cfg80211_probe_status(sdata->dev, hdr->addr1,
658 info->status.ack_signal,
661 else if (ieee80211_is_mgmt(hdr->frame_control))
662 cfg80211_mgmt_tx_status_ext(&sdata->wdev,
694 if (sdata->vif.type != NL80211_IFTYPE_STATION)
697 if (WARN(link_id >= ARRAY_SIZE(sdata->link),
701 link = rcu_dereference(sdata->link[link_id]);
712 link->smps_mode = smps_mode;
713 wiphy_work_queue(sdata->local->hw.wiphy, &link->u.mgd.recalc_smps);
726 if (sdata->vif.type != NL80211_IFTYPE_STATION)
729 wiphy_work_queue(sdata->local->hw.wiphy,
730 &sdata->u.mgd.teardown_ttlm_work);
739 struct ieee80211_hdr *hdr = (void *)skb->data;
740 bool acked = info->flags & IEEE80211_TX_STAT_ACK;
750 sta = sta_info_get_by_addrs(local, hdr->addr1, hdr->addr2);
758 if (info->flags & IEEE80211_TX_INTFL_MLME_CONN_TX) {
766 skb->dev = NULL;
769 if (ieee80211_is_data(hdr->frame_control) &&
773 info->flags);
780 skb_queue_tail(&sdata->status_queue,
782 wiphy_work_queue(local->hw.wiphy,
783 &sdata->work);
788 hdr->frame_control,
794 } else if (info->status_data_idr) {
797 } else if (info->status_data) {
804 switch (u16_get_bits(info->status_data,
808 info->status_data);
817 if (!dropped && skb->destructor) {
818 skb->wifi_acked_valid = 1;
819 skb->wifi_acked = acked;
825 kfree_skb_list(skb_shinfo(skb)->frag_list);
826 skb_shinfo(skb)->frag_list = NULL;
834 * - on # of retransmissions
835 * - current throughput (higher value for higher tpt)?
850 if (ieee80211_hw_check(&sta->local->hw, REPORTS_LOW_ACK))
854 if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
855 !(info->flags & IEEE80211_TX_STAT_AMPDU))
858 sta->deflink.status_stats.lost_packets++;
859 if (sta->sta.tdls) {
867 * last STA_LOST_TDLS_PKT_TIME ms, before triggering the CQM packet-loss
869 * For non-TDLS, use STA_LOST_PKT_THRESHOLD and STA_LOST_PKT_TIME
871 if (sta->deflink.status_stats.lost_packets < pkt_thr ||
872 !time_after(jiffies, sta->deflink.status_stats.last_pkt_time + pkt_time))
875 cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
876 sta->deflink.status_stats.lost_packets,
878 sta->deflink.status_stats.lost_packets = 0;
885 int count = -1;
889 if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
890 !(info->flags & IEEE80211_TX_STAT_AMPDU)) {
892 info->status.rates[i].idx = -1;
893 info->status.rates[i].count = 0;
895 } else if (info->status.rates[i].idx < 0) {
897 } else if (i >= hw->max_report_rates) {
899 info->status.rates[i].idx = -1;
900 info->status.rates[i].count = 0;
904 count += info->status.rates[i].count;
911 return i - 1;
935 skb->ip_summed = CHECKSUM_UNNECESSARY;
936 skb->pkt_type = PACKET_OTHERHOST;
937 skb->protocol = htons(ETH_P_802_2);
938 memset(skb->cb, 0, sizeof(skb->cb));
941 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
942 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
946 if (sdata->u.mntr.flags & MONITOR_FLAG_SKIP_TX)
952 skb2->dev = prev_dev;
957 prev_dev = sdata->dev;
961 skb->dev = prev_dev;
973 struct sk_buff *skb = status->skb;
974 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
976 struct ieee80211_tx_info *info = status->info;
984 fc = hdr->frame_control;
986 if (status->sta) {
987 sta = container_of(status->sta, struct sta_info, sta);
989 if (info->flags & IEEE80211_TX_STATUS_EOSP)
992 acked = !!(info->flags & IEEE80211_TX_STAT_ACK);
993 noack_success = !!(info->flags &
997 if (ieee80211_vif_is_mesh(&sta->sdata->vif) &&
1002 if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) &&
1003 (ieee80211_is_data(hdr->frame_control)) &&
1004 (rates_idx != -1))
1005 sta->deflink.tx_stats.last_rate =
1006 info->status.rates[rates_idx];
1008 if ((info->flags & IEEE80211_TX_STAT_AMPDU_NO_BACK) &&
1015 ssn = ((le16_to_cpu(hdr->seq_ctrl) + 0x10)
1017 ieee80211_send_bar(&sta->sdata->vif, hdr->addr1,
1033 bar = (struct ieee80211_bar *) skb->data;
1034 control = le16_to_cpu(bar->control);
1036 u16 ssn = le16_to_cpu(bar->start_seq_num);
1046 if (info->flags & IEEE80211_TX_STAT_TX_FILTERED) {
1051 sta->deflink.status_stats.msdu_failed[tid]++;
1053 sta->deflink.status_stats.msdu_retries[tid] +=
1057 if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked)
1063 * Fragments are passed to low-level drivers as separate skbs, so these
1066 if ((info->flags & IEEE80211_TX_STAT_ACK) ||
1067 (info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED)) {
1068 if (ieee80211_is_first_frag(hdr->seq_ctrl)) {
1069 I802_DEBUG_INC(local->dot11TransmittedFrameCount);
1071 I802_DEBUG_INC(local->dot11MulticastTransmittedFrameCount);
1073 I802_DEBUG_INC(local->dot11RetryCount);
1075 I802_DEBUG_INC(local->dot11MultipleRetryCount);
1082 if (!is_multicast_ether_addr(hdr->addr1) ||
1085 I802_DEBUG_INC(local->dot11TransmittedFragmentCount);
1087 if (ieee80211_is_first_frag(hdr->seq_ctrl))
1088 I802_DEBUG_INC(local->dot11FailedCount);
1093 ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) &&
1094 !(info->flags & IEEE80211_TX_CTL_INJECTED) &&
1095 local->ps_sdata && !(local->scanning)) {
1096 if (info->flags & IEEE80211_TX_STAT_ACK)
1097 local->ps_sdata->u.mgd.flags |=
1099 mod_timer(&local->dynamic_ps_timer,
1103 ieee80211_report_used_skb(local, skb, false, status->ack_hwtstamp);
1109 if (local->tx_mntrs)
1111 else if (status->free_list)
1112 list_add_tail(&skb->list, status->free_list);
1119 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1129 sta = sta_info_get_by_addrs(local, hdr->addr1, hdr->addr2);
1131 status.sta = &sta->sta;
1142 struct ieee80211_tx_info *info = status->info;
1143 struct ieee80211_sta *pubsta = status->sta;
1144 struct sk_buff *skb = status->skb;
1153 if (status->n_rates)
1154 sta->deflink.tx_stats.last_rate_info =
1155 status->rates[status->n_rates - 1].rate_idx;
1170 if (!status->info)
1175 acked = !!(info->flags & IEEE80211_TX_STAT_ACK);
1176 noack_success = !!(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED);
1178 !!(info->status.flags & IEEE80211_TX_STATUS_ACK_SIGNAL_VALID);
1181 struct ieee80211_sub_if_data *sdata = sta->sdata;
1184 sta->deflink.status_stats.retry_failed++;
1185 sta->deflink.status_stats.retry_count += retry_count;
1187 if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
1188 if (sdata->vif.type == NL80211_IFTYPE_STATION &&
1189 skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
1190 ieee80211_sta_tx_notify(sdata, (void *) skb->data,
1191 acked, info->status.tx_time);
1194 sta->deflink.status_stats.last_ack = jiffies;
1196 if (sta->deflink.status_stats.lost_packets)
1197 sta->deflink.status_stats.lost_packets = 0;
1200 sta->deflink.status_stats.last_pkt_time = jiffies;
1203 if (sdata->vif.type == NL80211_IFTYPE_STATION &&
1204 unlikely(sdata->u.mgd.probe_send_count > 0))
1205 sdata->u.mgd.probe_send_count = 0;
1208 sta->deflink.status_stats.last_ack_signal =
1209 (s8)info->status.ack_signal;
1210 sta->deflink.status_stats.ack_signal_filled = true;
1211 ewma_avg_signal_add(&sta->deflink.status_stats.avg_ack_signal,
1212 -info->status.ack_signal);
1230 if (ieee80211_vif_is_mesh(&sta->sdata->vif))
1234 if (skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
1239 I802_DEBUG_INC(local->dot11TransmittedFrameCount);
1241 I802_DEBUG_INC(local->dot11MulticastTransmittedFrameCount);
1243 I802_DEBUG_INC(local->dot11RetryCount);
1245 I802_DEBUG_INC(local->dot11MultipleRetryCount);
1247 I802_DEBUG_INC(local->dot11FailedCount);
1254 ieee80211_report_used_skb(local, skb, false, status->ack_hwtstamp);
1255 if (status->free_list)
1256 list_add_tail(&skb->list, status->free_list);
1275 if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
1276 sta->deflink.tx_stats.last_rate = info->status.rates[0];
1283 cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,