]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
cfg80211: parse multi-bssid only if HW supports it
authorSara Sharon <sara.sharon@intel.com>
Wed, 16 Jan 2019 21:02:03 +0000 (23:02 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 8 Feb 2019 12:51:50 +0000 (13:51 +0100)
Parsing and exposing nontransmitted APs is problematic
when underlying HW doesn't support it. Do it only if
driver indicated support. Allow HE restriction as well,
since the HE spec defined the exact manner that Multiple
BSSID set should behave. APs that not support the HE
spec will have less predictable Multiple BSSID set
support/behavior

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
net/wireless/scan.c

index 86de6b62a44b6c839eb6257ef6a1515e761df47f..67aeb7199617a5811e693e7e889768d304518ef4 100644 (file)
@@ -4315,6 +4315,11 @@ struct cfg80211_pmsr_capabilities {
  * @txq_memory_limit: configuration internal TX queue memory limit
  * @txq_quantum: configuration of internal TX queue scheduler quantum
  *
+ * @support_mbssid: can HW support association with nontransmitted AP
+ * @support_only_he_mbssid: don't parse MBSSID elements if it is not
+ *     HE AP, in order to avoid compatibility issues.
+ *     @support_mbssid must be set for this to have any effect.
+ *
  * @pmsr_capa: peer measurement capabilities
  */
 struct wiphy {
@@ -4455,6 +4460,9 @@ struct wiphy {
        u32 txq_memory_limit;
        u32 txq_quantum;
 
+       u8 support_mbssid:1,
+          support_only_he_mbssid:1;
+
        const struct cfg80211_pmsr_capabilities *pmsr_capa;
 
        char priv[0] __aligned(NETDEV_ALIGN);
index 325323a842d8a84f3bc012a30fe9fade0cae77fd..ab0f0178ee0ebdc4753c45d8f86e79809a964bf8 100644 (file)
@@ -1417,6 +1417,11 @@ static void cfg80211_parse_mbssid_data(struct wiphy *wiphy,
                return;
        if (!cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ie, ielen))
                return;
+       if (!wiphy->support_mbssid)
+               return;
+       if (wiphy->support_only_he_mbssid &&
+           !cfg80211_find_ext_ie(WLAN_EID_EXT_HE_CAPABILITY, ie, ielen))
+               return;
 
        new_ie = kmalloc(IEEE80211_MAX_DATA_LEN, gfp);
        if (!new_ie)
@@ -1701,7 +1706,11 @@ cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
 
        res = cfg80211_inform_single_bss_frame_data(wiphy, data, mgmt,
                                                    len, NULL, gfp);
-       if (!res || !cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ie, ielen))
+       if (!res || !wiphy->support_mbssid ||
+           !cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ie, ielen))
+               return res;
+       if (wiphy->support_only_he_mbssid &&
+           !cfg80211_find_ext_ie(WLAN_EID_EXT_HE_CAPABILITY, ie, ielen))
                return res;
 
        /* process each non-transmitting bss */