mac80211: indicate support for multiple BSSID
authorSara Sharon <sara.sharon@intel.com>
Wed, 16 Jan 2019 21:03:25 +0000 (23:03 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 8 Feb 2019 12:56:37 +0000 (13:56 +0100)
Set multi-bssid support flags according to driver support.

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/linux/ieee80211.h
include/net/mac80211.h
net/mac80211/debugfs.c
net/mac80211/main.c
net/mac80211/mlme.c

index 7479f0bd50e137223029a0bdd80ab1084905851c..8da5ba97328f7baa63d8f696c5d8b8d8be750470 100644 (file)
@@ -2657,6 +2657,11 @@ enum ieee80211_tdls_actioncode {
  */
 #define WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING   BIT(2)
 
+/* Multiple BSSID capability is set in the 6th bit of 3rd byte of the
+ * @WLAN_EID_EXT_CAPABILITY information element
+ */
+#define WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT     BIT(6)
+
 /* TDLS capabilities in the the 4th byte of @WLAN_EID_EXT_CAPABILITY */
 #define WLAN_EXT_CAPA4_TDLS_BUFFER_STA         BIT(4)
 #define WLAN_EXT_CAPA4_TDLS_PEER_PSM           BIT(5)
index b0e364f502855fbf984ad431eae6d2684c190908..97aed7b1ba5da5c84379b970d645fd03bce09ee7 100644 (file)
@@ -2234,6 +2234,11 @@ struct ieee80211_txq {
  * @IEEE80211_HW_TX_STATUS_NO_AMPDU_LEN: Driver does not report accurate A-MPDU
  *     length in tx status information
  *
+ * @IEEE80211_HW_SUPPORTS_MULTI_BSSID: Hardware supports multi BSSID
+ *
+ * @IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID: Hardware supports multi BSSID
+ *     only for HE APs. Applies if @IEEE80211_HW_SUPPORTS_MULTI_BSSID is set.
+ *
  * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
  */
 enum ieee80211_hw_flags {
@@ -2283,6 +2288,8 @@ enum ieee80211_hw_flags {
        IEEE80211_HW_SUPPORTS_VHT_EXT_NSS_BW,
        IEEE80211_HW_STA_MMPDU_TXQ,
        IEEE80211_HW_TX_STATUS_NO_AMPDU_LEN,
+       IEEE80211_HW_SUPPORTS_MULTI_BSSID,
+       IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID,
 
        /* keep last, obviously */
        NUM_IEEE80211_HW_FLAGS
index 343ad0a915e474850cd9cc86638cec1e3ba4781f..2d43bc127043617329fd8296ce230e81f5260412 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2007      Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
- * Copyright (C) 2018 Intel Corporation
+ * Copyright (C) 2018 - 2019 Intel Corporation
  *
  * GPLv2
  *
@@ -219,6 +219,8 @@ static const char *hw_flag_names[] = {
        FLAG(SUPPORTS_VHT_EXT_NSS_BW),
        FLAG(STA_MMPDU_TXQ),
        FLAG(TX_STATUS_NO_AMPDU_LEN),
+       FLAG(SUPPORTS_MULTI_BSSID),
+       FLAG(SUPPORTS_ONLY_HE_MULTI_BSSID),
 #undef FLAG
 };
 
index 71005b6dfcd123c3073bb6054227e88974bc98f5..5055aeba5c5ab20f43e53e360425d15c4e02fbf5 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright (C) 2017     Intel Deutschland GmbH
- * Copyright (C) 2018 Intel Corporation
+ * Copyright (C) 2018 - 2019 Intel Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -1112,6 +1112,17 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
        if (ieee80211_hw_check(&local->hw, CHANCTX_STA_CSA))
                local->ext_capa[0] |= WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING;
 
+       /* mac80211 supports multi BSSID, if the driver supports it */
+       if (ieee80211_hw_check(&local->hw, SUPPORTS_MULTI_BSSID)) {
+               local->hw.wiphy->support_mbssid = true;
+               if (ieee80211_hw_check(&local->hw,
+                                      SUPPORTS_ONLY_HE_MULTI_BSSID))
+                       local->hw.wiphy->support_only_he_mbssid = true;
+               else
+                       local->ext_capa[2] |=
+                               WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT;
+       }
+
        local->hw.wiphy->max_num_csa_counters = IEEE80211_MAX_CSA_COUNTERS_NUM;
 
        result = wiphy_register(local->hw.wiphy);
index 64b6ddb674562a97fdc1d2b615c178e89ab8f500..a49fbb3f3ed7b4200126af01346f74ba97a9d7db 100644 (file)
@@ -813,6 +813,21 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
                }
        }
 
+       /* Set MBSSID support for HE AP if needed */
+       if (ieee80211_hw_check(&local->hw, SUPPORTS_ONLY_HE_MULTI_BSSID) &&
+           !(ifmgd->flags & IEEE80211_STA_DISABLE_HE) && assoc_data->ie_len) {
+               struct element *elem;
+
+               /* we know it's writable, cast away the const */
+               elem = (void *)cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY,
+                                                 assoc_data->ie,
+                                                 assoc_data->ie_len);
+
+               /* We can probably assume both always true */
+               if (elem && elem->datalen >= 3)
+                       elem->data[2] |= WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT;
+       }
+
        /* if present, add any custom IEs that go before HT */
        if (assoc_data->ie_len) {
                static const u8 before_ht[] = {