From: Aloka Dixit <alokad@codeaurora.org>
To: johannes@sipsolutions.net
Cc: linux-wireless@vger.kernel.org, John Crispin <john@phrozen.org>,
Aloka Dixit <alokad@codeaurora.org>
Subject: [PATCH v9 2/4] mac80211: add multiple bssid support to interface handling
Date: Wed, 10 Mar 2021 10:26:02 -0800 [thread overview]
Message-ID: <20210310182604.8858-3-alokad@codeaurora.org> (raw)
In-Reply-To: <20210310182604.8858-1-alokad@codeaurora.org>
From: John Crispin <john@phrozen.org>
Add a new helper ieee80211_set_multiple_bssid_options() takes propagating
the cfg80211 data down the stack.
The patch also makes sure that all members of the bss set will get closed
when either of them is shutdown.
Signed-off-by: John Crispin <john@phrozen.org>
Co-developed-by: Aloka Dixit <alokad@codeaurora.org>
Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
---
include/net/mac80211.h | 30 +++++++++++++++++++++++-
net/mac80211/cfg.c | 53 ++++++++++++++++++++++++++++++++++++++++++
net/mac80211/debugfs.c | 1 +
net/mac80211/iface.c | 6 +++++
4 files changed, 89 insertions(+), 1 deletion(-)
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 2d1d629e5d14..b9f51515c2e8 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -631,6 +631,7 @@ struct ieee80211_fils_discovery {
* @s1g: BSS is S1G BSS (affects Association Request format).
* @beacon_tx_rate: The configured beacon transmit rate that needs to be passed
* to driver when rate control is offloaded to firmware.
+ * @multiple_bssid: the multiple bssid settings of the AP.
*/
struct ieee80211_bss_conf {
const u8 *bssid;
@@ -700,6 +701,7 @@ struct ieee80211_bss_conf {
u32 unsol_bcast_probe_resp_interval;
bool s1g;
struct cfg80211_bitrate_mask beacon_tx_rate;
+ struct cfg80211_multiple_bssid multiple_bssid;
};
/**
@@ -1663,6 +1665,19 @@ enum ieee80211_offload_flags {
IEEE80211_OFFLOAD_DECAP_ENABLED = BIT(2),
};
+/**
+ * enum ieee80211_vif_multiple_bssid_flags - virtual interface multiple bssid flags
+ *
+ * @IEEE80211_VIF_MBSS_TRANSMITTING: this BSS is transmitting beacons
+ * @IEEE80211_VIF_MBSS_NON_TRANSMITTING: this BSS is not transmitting beacons
+ * @IEEE80211_VIF_MBSS_EMA_BEACON: beacons should be send out in EMA mode
+ */
+enum ieee80211_vif_multiple_bssid_flags {
+ IEEE80211_VIF_MBSS_TRANSMITTING = BIT(1),
+ IEEE80211_VIF_MBSS_NON_TRANSMITTING = BIT(2),
+ IEEE80211_VIF_MBSS_EMA_BEACON = BIT(3),
+};
+
/**
* struct ieee80211_vif - per-interface data
*
@@ -1709,6 +1724,11 @@ enum ieee80211_offload_flags {
* protected by fq->lock.
* @offload_flags: 802.3 -> 802.11 enapsulation offload flags, see
* &enum ieee80211_offload_flags.
+ *
+ * @multiple_bssid: Multiple BSSID configurations.
+ * @multiple_bssid.parent: Interface index of the transmitted BSS.
+ * @multiple_bssid.flags: multiple bssid flags, see
+ * enum ieee80211_vif_multiple_bssid_flags.
*/
struct ieee80211_vif {
enum nl80211_iftype type;
@@ -1737,6 +1757,11 @@ struct ieee80211_vif {
bool txqs_stopped[IEEE80211_NUM_ACS];
+ struct {
+ struct ieee80211_vif *parent;
+ u32 flags;
+ } multiple_bssid;
+
/* must be last */
u8 drv_priv[] __aligned(sizeof(void *));
};
@@ -2384,7 +2409,7 @@ 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_MULTI_BSSID: Hardware supports multi BSSID in STA mode
*
* @IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID: Hardware supports multi BSSID
* only for HE APs. Applies if @IEEE80211_HW_SUPPORTS_MULTI_BSSID is set.
@@ -2399,6 +2424,8 @@ struct ieee80211_txq {
* @IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD: Hardware supports rx decapsulation
* offload
*
+ * @IEEE80211_HW_SUPPORTS_MULTI_BSSID_AP: Hardware supports multi BSSID in
+ * AP mode
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
*/
enum ieee80211_hw_flags {
@@ -2453,6 +2480,7 @@ enum ieee80211_hw_flags {
IEEE80211_HW_AMPDU_KEYBORDER_SUPPORT,
IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD,
IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD,
+ IEEE80211_HW_SUPPORTS_MULTI_BSSID_AP,
/* keep last, obviously */
NUM_IEEE80211_HW_FLAGS
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index c4c70e30ad7f..91e659a43f67 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -111,6 +111,39 @@ static int ieee80211_set_mon_options(struct ieee80211_sub_if_data *sdata,
return 0;
}
+static void ieee80211_set_multiple_bssid_options(struct ieee80211_sub_if_data *sdata,
+ struct cfg80211_ap_settings *params)
+{
+ struct ieee80211_local *local = sdata->local;
+ struct wiphy *wiphy = local->hw.wiphy;
+ struct net_device *parent;
+ struct ieee80211_sub_if_data *psdata;
+
+ if (!ieee80211_hw_check(&local->hw, SUPPORTS_MULTI_BSSID_AP))
+ return;
+
+ if (!params->multiple_bssid.count)
+ return;
+
+ if (params->multiple_bssid.parent) {
+ parent = __dev_get_by_index(wiphy_net(wiphy),
+ params->multiple_bssid.parent);
+ if (!parent || !parent->ieee80211_ptr)
+ return;
+ psdata = IEEE80211_WDEV_TO_SUB_IF(parent->ieee80211_ptr);
+ if (psdata->vif.multiple_bssid.parent)
+ return;
+ sdata->vif.multiple_bssid.parent = &psdata->vif;
+ sdata->vif.multiple_bssid.flags |= IEEE80211_VIF_MBSS_NON_TRANSMITTING;
+ } else {
+ sdata->vif.multiple_bssid.flags |= IEEE80211_VIF_MBSS_TRANSMITTING;
+ }
+
+ if (params->multiple_bssid.ema)
+ sdata->vif.multiple_bssid.flags |= IEEE80211_VIF_MBSS_EMA_BEACON;
+ sdata->vif.bss_conf.multiple_bssid = params->multiple_bssid;
+}
+
static struct wireless_dev *ieee80211_add_iface(struct wiphy *wiphy,
const char *name,
unsigned char name_assign_type,
@@ -141,6 +174,23 @@ static struct wireless_dev *ieee80211_add_iface(struct wiphy *wiphy,
static int ieee80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
{
+ struct ieee80211_sub_if_data *sdata;
+
+ sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
+ if (sdata && sdata->vif.type == NL80211_IFTYPE_AP) {
+ if (sdata->vif.multiple_bssid.flags & IEEE80211_VIF_MBSS_TRANSMITTING) {
+ struct ieee80211_sub_if_data *child;
+
+ rcu_read_lock();
+ list_for_each_entry_rcu(child, &sdata->local->interfaces, list)
+ if (child->vif.multiple_bssid.parent == &sdata->vif)
+ dev_close(child->wdev.netdev);
+ rcu_read_unlock();
+ } else {
+ sdata->vif.multiple_bssid.parent = NULL;
+ }
+ }
+
ieee80211_if_remove(IEEE80211_WDEV_TO_SUB_IF(wdev));
return 0;
@@ -1078,6 +1128,9 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
changed |= BSS_CHANGED_HE_BSS_COLOR;
}
+ if (sdata->vif.type == NL80211_IFTYPE_AP)
+ ieee80211_set_multiple_bssid_options(sdata, params);
+
mutex_lock(&local->mtx);
err = ieee80211_vif_use_channel(sdata, ¶ms->chandef,
IEEE80211_CHANCTX_SHARED);
diff --git a/net/mac80211/debugfs.c b/net/mac80211/debugfs.c
index 5296898875ff..249b8f4e6a54 100644
--- a/net/mac80211/debugfs.c
+++ b/net/mac80211/debugfs.c
@@ -456,6 +456,7 @@ static const char *hw_flag_names[] = {
FLAG(AMPDU_KEYBORDER_SUPPORT),
FLAG(SUPPORTS_TX_ENCAP_OFFLOAD),
FLAG(SUPPORTS_RX_DECAP_OFFLOAD),
+ FLAG(SUPPORTS_MULTI_BSSID_AP),
#undef FLAG
};
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index b80c9b016b2b..6bb48bf87aca 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -376,6 +376,12 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do
bool cancel_scan;
struct cfg80211_nan_func *func;
+ /* make sure the parent is already down */
+ if (sdata->vif.type == NL80211_IFTYPE_AP &&
+ sdata->vif.multiple_bssid.parent &&
+ ieee80211_sdata_running(vif_to_sdata(sdata->vif.multiple_bssid.parent)))
+ dev_close(vif_to_sdata(sdata->vif.multiple_bssid.parent)->wdev.netdev);
+
clear_bit(SDATA_STATE_RUNNING, &sdata->state);
cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata;
--
2.25.0
next prev parent reply other threads:[~2021-03-10 18:27 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-10 18:26 [PATCH v9 0/4] Multiple BSSID support Aloka Dixit
2021-03-10 18:26 ` [PATCH v9 1/4] nl80211: add basic multiple bssid support Aloka Dixit
2021-04-08 12:05 ` Johannes Berg
2021-04-08 17:09 ` Aloka Dixit
2021-03-10 18:26 ` Aloka Dixit [this message]
2021-04-08 12:06 ` [PATCH v9 2/4] mac80211: add multiple bssid support to interface handling Johannes Berg
2021-04-16 21:35 ` Aloka Dixit
2021-04-19 11:28 ` Johannes Berg
2021-04-19 22:35 ` Aloka Dixit
2021-04-19 22:42 ` Aloka Dixit
2021-04-20 8:25 ` Johannes Berg
2021-03-10 18:26 ` [PATCH v9 3/4] mac80211: add multiple bssid/EMA support to beacon handling Aloka Dixit
2021-04-08 12:11 ` Johannes Berg
2021-04-08 17:16 ` Aloka Dixit
2021-03-10 18:26 ` [PATCH v9 4/4] mac80211: CSA on non-transmitting interfaces Aloka Dixit
2021-04-08 11:53 ` [PATCH v9 0/4] Multiple BSSID support Johannes Berg
2021-04-09 18:05 ` Aloka Dixit
2021-04-08 12:17 ` Johannes Berg
2021-04-09 18:31 ` Aloka Dixit
2021-04-09 19:28 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210310182604.8858-3-alokad@codeaurora.org \
--to=alokad@codeaurora.org \
--cc=johannes@sipsolutions.net \
--cc=john@phrozen.org \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.