wifi: mac80211: HT: make ieee80211_ht_cap_ie_to_sta_ht_cap() MLO-aware
authorJohannes Berg <johannes.berg@intel.com>
Mon, 30 May 2022 21:34:04 +0000 (23:34 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 20 Jun 2022 10:55:29 +0000 (12:55 +0200)
Update ieee80211_ht_cap_ie_to_sta_ht_cap() to handle per-link
data.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/cfg.c
net/mac80211/ht.c
net/mac80211/ibss.c
net/mac80211/ieee80211_i.h
net/mac80211/mesh_plink.c
net/mac80211/mlme.c

index 9780d70fcf28be5996715d739769ea67d9980d03..d7f2eb7421c385a55d0be5c451fbf85e1e24d94f 100644 (file)
@@ -1758,7 +1758,7 @@ static int sta_apply_parameters(struct ieee80211_local *local,
 
        if (params->ht_capa)
                ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
-                                                 params->ht_capa, sta);
+                                                 params->ht_capa, sta, 0);
 
        /* VHT can override some HT caps such as the A-MSDU max length */
        if (params->vht_capa)
index ac94dd69c0a2f68b4c1d09afe99ce13c85088546..22677df83ed8b35e287cff2436bda3f66d4eaf54 100644 (file)
@@ -138,7 +138,7 @@ void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
 bool ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata,
                                       struct ieee80211_supported_band *sband,
                                       const struct ieee80211_ht_cap *ht_cap_ie,
-                                      struct sta_info *sta)
+                                      struct sta_info *sta, unsigned int link_id)
 {
        struct ieee80211_sta_ht_cap ht_cap, own_cap;
        u8 ampdu_info, tx_mcs_set_cap;
@@ -243,11 +243,12 @@ bool ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata,
                sta->sta.max_amsdu_len = IEEE80211_MAX_MPDU_LEN_HT_3839;
 
  apply:
-       changed = memcmp(&sta->sta.deflink.ht_cap, &ht_cap, sizeof(ht_cap));
+       changed = memcmp(&sta->sta.link[link_id]->ht_cap,
+                        &ht_cap, sizeof(ht_cap));
 
-       memcpy(&sta->sta.deflink.ht_cap, &ht_cap, sizeof(ht_cap));
+       memcpy(&sta->sta.link[link_id]->ht_cap, &ht_cap, sizeof(ht_cap));
 
-       switch (sdata->vif.bss_conf.chandef.width) {
+       switch (sdata->vif.link_conf[link_id]->chandef.width) {
        default:
                WARN_ON_ONCE(1);
                fallthrough;
@@ -264,9 +265,9 @@ bool ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata,
                break;
        }
 
-       sta->sta.deflink.bandwidth = bw;
+       sta->sta.link[link_id]->bandwidth = bw;
 
-       sta->deflink.cur_max_bandwidth =
+       sta->link[link_id]->cur_max_bandwidth =
                ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 ?
                                IEEE80211_STA_RX_BW_40 : IEEE80211_STA_RX_BW_20;
 
index 87815a3624f305ed54bf9ca0aee2388ed6469fb5..09c11c067cbf29a6c67f54fbf8708f8ac419a0c5 100644 (file)
@@ -1051,7 +1051,7 @@ static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
                memcpy(&htcap_ie, elems->ht_cap_elem, sizeof(htcap_ie));
                rates_updated |= ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
                                                                   &htcap_ie,
-                                                                  sta);
+                                                                  sta, 0);
 
                if (elems->vht_operation && elems->vht_cap_elem &&
                    sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_20 &&
index c59dc8f6126b46808bb4423bed2c843b481d5366..e75496a99299e09bca4cf0ee4d1f73df99574af2 100644 (file)
@@ -2065,7 +2065,7 @@ void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
 bool ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata,
                                       struct ieee80211_supported_band *sband,
                                       const struct ieee80211_ht_cap *ht_cap_ie,
-                                      struct sta_info *sta);
+                                      struct sta_info *sta, unsigned int link_id);
 void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata,
                          const u8 *da, u16 tid,
                          u16 initiator, u16 reason_code);
index fb7e8a9600ca19342fe240d857d141fc633a0b06..b64614cd314d84af1bfabdf00de7bbbee83b3e1d 100644 (file)
@@ -438,7 +438,7 @@ static void mesh_sta_info_init(struct ieee80211_sub_if_data *sdata,
        sta->sta.deflink.supp_rates[sband->band] = rates;
 
        if (ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
-                                             elems->ht_cap_elem, sta))
+                                             elems->ht_cap_elem, sta, 0))
                changed |= IEEE80211_RC_BW_CHANGED;
 
        ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
index 459780169e23ad658f087472f924791aee5288fa..30423b2d4eee5bd15ba33a5eff336450c5a6f52f 100644 (file)
@@ -3566,7 +3566,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
        /* Set up internal HT/VHT capabilities */
        if (elems->ht_cap_elem && !(ifmgd->flags & IEEE80211_STA_DISABLE_HT))
                ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
-                                                 elems->ht_cap_elem, sta);
+                                                 elems->ht_cap_elem, sta, 0);
 
        if (elems->vht_cap_elem && !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT))
                ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,