wifi: mac80211: status: look up band only where needed
authorJohannes Berg <johannes.berg@intel.com>
Wed, 1 Jun 2022 12:16:00 +0000 (14:16 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 20 Jun 2022 10:55:38 +0000 (12:55 +0200)
For MLD, we might eventually not really know the band on status,
but some code assumes it's there. Move the sband lookup deep to
the code that actually needs it, to make it clear where exactly
it's needed and for what purposes.

For rate control, at least initially we won't support it in MLO,
so that won't be an issue.

For TX monitoring, we may have to elide the rate and/or rely on
ieee80211_tx_status_ext() for rate information.

This also simplifies the function prototypes.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/rate.c
net/mac80211/rate.h
net/mac80211/status.c
net/mac80211/tx.c

index c3387ffe27f5d9904ed73a5d3dbcb9932d59608e..8286e607152cdf5f477be70578108e7b51d7bcf1 100644 (file)
@@ -2036,7 +2036,6 @@ struct sk_buff *
 ieee80211_build_data_template(struct ieee80211_sub_if_data *sdata,
                              struct sk_buff *skb, u32 info_flags);
 void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
-                         struct ieee80211_supported_band *sband,
                          int retry_count, int shift, bool send_to_cooked,
                          struct ieee80211_tx_status *status);
 
index 402e898b75c3daf9ea71676adc525230c24447a0..c58d9689f51faf09d0ae3be8d343692611628085 100644 (file)
@@ -68,16 +68,18 @@ void rate_control_rate_init(struct sta_info *sta)
 }
 
 void rate_control_tx_status(struct ieee80211_local *local,
-                           struct ieee80211_supported_band *sband,
                            struct ieee80211_tx_status *st)
 {
        struct rate_control_ref *ref = local->rate_ctrl;
        struct sta_info *sta = container_of(st->sta, struct sta_info, sta);
        void *priv_sta = sta->rate_ctrl_priv;
+       struct ieee80211_supported_band *sband;
 
        if (!ref || !test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
                return;
 
+       sband = local->hw.wiphy->bands[st->info->band];
+
        spin_lock_bh(&sta->rate_ctrl_lock);
        if (ref->ops->tx_status_ext)
                ref->ops->tx_status_ext(ref->priv, sband, priv_sta, st);
index fbc8bdb54c4304aa4819c17eaa40fbc0f4efe5ec..d89c13584dc844be3500adc6c783968eda6bdd03 100644 (file)
@@ -27,7 +27,6 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
                           struct ieee80211_tx_rate_control *txrc);
 
 void rate_control_tx_status(struct ieee80211_local *local,
-                           struct ieee80211_supported_band *sband,
                            struct ieee80211_tx_status *st);
 
 void rate_control_rate_init(struct sta_info *sta);
index d9cad6ad7a659495811f351bcc6ab6be76e7e5ce..5c2202a7ea1cce1a20ea069c19308e6469406336 100644 (file)
@@ -293,7 +293,6 @@ static int ieee80211_tx_radiotap_len(struct ieee80211_tx_info *info,
 
 static void
 ieee80211_add_tx_radiotap_header(struct ieee80211_local *local,
-                                struct ieee80211_supported_band *sband,
                                 struct sk_buff *skb, int retry_count,
                                 int rtap_len, int shift,
                                 struct ieee80211_tx_status *status)
@@ -336,9 +335,13 @@ ieee80211_add_tx_radiotap_header(struct ieee80211_local *local,
                        legacy_rate = status_rate->rate_idx.legacy;
        } else if (info->status.rates[0].idx >= 0 &&
                 !(info->status.rates[0].flags & (IEEE80211_TX_RC_MCS |
-                                                 IEEE80211_TX_RC_VHT_MCS)))
+                                                 IEEE80211_TX_RC_VHT_MCS))) {
+               struct ieee80211_supported_band *sband;
+
+               sband = local->hw.wiphy->bands[info->band];
                legacy_rate =
                        sband->bitrates[info->status.rates[0].idx].bitrate;
+       }
 
        if (legacy_rate) {
                rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_RATE));
@@ -845,7 +848,6 @@ static int ieee80211_tx_get_rates(struct ieee80211_hw *hw,
 }
 
 void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
-                         struct ieee80211_supported_band *sband,
                          int retry_count, int shift, bool send_to_cooked,
                          struct ieee80211_tx_status *status)
 {
@@ -862,7 +864,7 @@ void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
                dev_kfree_skb(skb);
                return;
        }
-       ieee80211_add_tx_radiotap_header(local, sband, skb, retry_count,
+       ieee80211_add_tx_radiotap_header(local, skb, retry_count,
                                         rtap_len, shift, status);
 
        /* XXX: is this sufficient for BPF? */
@@ -912,7 +914,6 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
        struct ieee80211_tx_info *info = status->info;
        struct sta_info *sta;
        __le16 fc;
-       struct ieee80211_supported_band *sband;
        bool send_to_cooked;
        bool acked;
        bool noack_success;
@@ -920,7 +921,6 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
        int shift = 0;
        int tid = IEEE80211_NUM_TIDS;
 
-       sband = local->hw.wiphy->bands[info->band];
        fc = hdr->frame_control;
 
        if (status->sta) {
@@ -1082,7 +1082,7 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
        }
 
        /* send to monitor interfaces */
-       ieee80211_tx_monitor(local, skb, sband, retry_count, shift,
+       ieee80211_tx_monitor(local, skb, retry_count, shift,
                             send_to_cooked, status);
 }
 
@@ -1114,7 +1114,6 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
        struct ieee80211_tx_info *info = status->info;
        struct ieee80211_sta *pubsta = status->sta;
        struct sk_buff *skb = status->skb;
-       struct ieee80211_supported_band *sband;
        struct sta_info *sta = NULL;
        int rates_idx, retry_count;
        bool acked, noack_success, ack_signal_valid;
@@ -1145,8 +1144,6 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
 
        rates_idx = ieee80211_tx_get_rates(hw, info, &retry_count);
 
-       sband = hw->wiphy->bands[info->band];
-
        acked = !!(info->flags & IEEE80211_TX_STAT_ACK);
        noack_success = !!(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED);
        ack_signal_valid =
@@ -1201,7 +1198,7 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
                        }
                }
 
-               rate_control_tx_status(local, sband, status);
+               rate_control_tx_status(local, status);
                if (ieee80211_vif_is_mesh(&sta->sdata->vif))
                        ieee80211s_update_metric(local, sta, status);
        }
@@ -1239,14 +1236,13 @@ void ieee80211_tx_rate_update(struct ieee80211_hw *hw,
                              struct ieee80211_tx_info *info)
 {
        struct ieee80211_local *local = hw_to_local(hw);
-       struct ieee80211_supported_band *sband = hw->wiphy->bands[info->band];
        struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
        struct ieee80211_tx_status status = {
                .info = info,
                .sta = pubsta,
        };
 
-       rate_control_tx_status(local, sband, &status);
+       rate_control_tx_status(local, &status);
 
        if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
                sta->deflink.tx_stats.last_rate = info->status.rates[0];
index 8530363b2666af100b5d4452058277a279cbfab7..f2229b120bdd1600ea9caf114ebecef8cf62568d 100644 (file)
@@ -5228,7 +5228,6 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
        struct ieee80211_mutable_offsets offs = {};
        struct sk_buff *bcn = __ieee80211_beacon_get(hw, vif, &offs, false);
        struct sk_buff *copy;
-       struct ieee80211_supported_band *sband;
        int shift;
 
        if (!bcn)
@@ -5250,12 +5249,7 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
                return bcn;
 
        shift = ieee80211_vif_get_shift(vif);
-       sband = ieee80211_get_sband(vif_to_sdata(vif));
-       if (!sband)
-               return bcn;
-
-       ieee80211_tx_monitor(hw_to_local(hw), copy, sband, 1, shift, false,
-                            NULL);
+       ieee80211_tx_monitor(hw_to_local(hw), copy, 1, shift, false, NULL);
 
        return bcn;
 }