]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
mac80211: check whether HE connection is allowed by the reg domain
authorHaim Dreyfuss <haim.dreyfuss@intel.com>
Fri, 31 Jan 2020 11:12:44 +0000 (13:12 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 7 Feb 2020 11:39:27 +0000 (12:39 +0100)
The wireless device might be capable to connect HE
as well as the AP. However, the regulatory domain might
forbid it. Check whether the regulatory domain allows HE connection
when considering if HE IE should be added.
Also, add it when setting our peer capability.

Signed-off-by: Haim Dreyfuss <haim.dreyfuss@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/20200131111300.891737-8-luca@coelho.fi
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/mlme.c

index f076e73314a6484598ef114095e4ab0653cc56a6..152577cc22130d622188c65e5d6b8e0847f9fc83 100644 (file)
@@ -313,6 +313,10 @@ out:
                ret |= ieee80211_chandef_downgrade(chandef);
        }
 
+       if (!cfg80211_chandef_usable(sdata->wdev.wiphy, chandef,
+                                    IEEE80211_CHAN_NO_HE))
+               ret |= IEEE80211_STA_DISABLE_HE;
+
        if (chandef->width != vht_chandef.width && !tracking)
                sdata_info(sdata,
                           "capabilities/regulatory prevented using AP HT/VHT configuration, downgraded\n");
@@ -622,10 +626,21 @@ static void ieee80211_add_he_ie(struct ieee80211_sub_if_data *sdata,
 {
        u8 *pos;
        const struct ieee80211_sta_he_cap *he_cap = NULL;
+       struct ieee80211_chanctx_conf *chanctx_conf;
        u8 he_cap_size;
+       bool reg_cap = false;
+
+       rcu_read_lock();
+       chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
+       if (!WARN_ON_ONCE(!chanctx_conf))
+               reg_cap = cfg80211_chandef_usable(sdata->wdev.wiphy,
+                                                 &chanctx_conf->def,
+                                                 IEEE80211_CHAN_NO_HE);
+
+       rcu_read_unlock();
 
        he_cap = ieee80211_get_he_sta_cap(sband);
-       if (!he_cap)
+       if (!he_cap || !reg_cap)
                return;
 
        /*