diff mbox series

[04/13] mbssid: get and set configuration parameters

Message ID 20220302222634.22185-5-quic_alokad@quicinc.com
State Changes Requested
Headers show
Series hostapd: MBSSID and EMA support | expand

Commit Message

Aloka Dixit March 2, 2022, 10:26 p.m. UTC
From: John Crispin <john@phrozen.org>

Add helper functions to retrieve the context for the transmitting
interfaces of the MBSSID set and the index of a given BSS.

Set device parameters - BSS index, transmitting BSS and
total number of BSS in the MBSSID set.

Signed-off-by: John Crispin <john@phrozen.org>
Co-developed-by: Aloka Dixit <quic_alokad@quicinc.com>
Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
---
 src/ap/beacon.c      | 33 +++++++++++++++++++++++++++++++--
 src/ap/hostapd.c     | 23 +++++++++++++++++++++++
 src/ap/hostapd.h     |  2 ++
 src/drivers/driver.h | 15 +++++++++++++++
 4 files changed, 71 insertions(+), 2 deletions(-)

Comments

Jouni Malinen April 7, 2022, 8:15 p.m. UTC | #1
On Wed, Mar 02, 2022 at 02:26:25PM -0800, Aloka Dixit wrote:
> diff --git a/src/ap/beacon.c b/src/ap/beacon.c

> +static void hostapd_set_mbssid_beacon(struct hostapd_data *hapd,
> +				      struct wpa_driver_ap_params *params)
> +{
> +	struct hostapd_iface *iface = hapd->iface;
> +
> +	if (!iface->conf->mbssid || iface->num_bss == 1)
> +		return;
> +
> +	if (!iface->mbssid_max_interfaces) {
> +		wpa_printf(MSG_DEBUG,
> +			   "MBSSID: Driver doesn't support multi-BSSID advertisements");
> +		return;
> +	} else if (iface->num_bss > iface->mbssid_max_interfaces) {
> +		wpa_printf(MSG_DEBUG,
> +			   "MBSSID: Driver supports maximum %u interfaces for multi-BSSID advertisements",
> +			   iface->mbssid_max_interfaces);
> +		return;
> +	}

Can these be reached in practice? Shouldn't such cases be prevented from
starting AP operation?

> +	params->mbssid_tx_iface = hostapd_mbssid_get_tx_bss(hapd)->conf->iface;
> +	params->mbssid_index = hostapd_mbssid_get_bss_index(hapd);
> +	params->mbssid_count = iface->num_bss;
> +	return;
> +}

No "return;" at the end of void function.

> @@ -1149,7 +1175,6 @@ static u8 * hostapd_probe_resp_offloads(struct hostapd_data *hapd,
>  	/* Generate a Probe Response template for the non-P2P case */
>  	return hostapd_gen_probe_resp(hapd, NULL, 0, resp_len);
>  }
> -
>  #endif /* NEED_AP_MLME */
>  
>  

Please do not include unrelated (and in this case, an undesired
whitespace change in general) changes in the patch.

> diff --git a/src/drivers/driver.h b/src/drivers/driver.h
> @@ -1582,6 +1582,21 @@ struct wpa_driver_ap_params {
> +	/**
> +	 * mbssid_tx_iface - Transmitting interface of the set
> +	 */
> +	const char *mbssid_tx_iface;
> +
> +	/**
> +	 * mbssid_index - The index of this BSS in the group
> +	 */
> +	unsigned int mbssid_index;
> +
> +	/**
> +	 * mbssid_count - Total number of BSSs in the group
> +	 */
> +	unsigned int mbssid_count;
>  };

Why is that mbssid_count added here? It does not seem to be used in any
of the following patches.. Or well, it is just used to check whether
MBSSID mechanism is to be enabled and a single bool would seem to be a
clearer way of indicating that to cover the case of mbssid_index == 0.
Or well, I guess even that bool would be unnecessary since
mbssid_tx_iface != NULL would indicate if this is enabled for both the
transmitting BSSID and the nontransmitting ones.
diff mbox series

Patch

diff --git a/src/ap/beacon.c b/src/ap/beacon.c
index 8cd1c417043e..1d70cb2ead2c 100644
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -428,6 +428,32 @@  static u8 * hostapd_eid_supported_op_classes(struct hostapd_data *hapd, u8 *eid)
 }
 
 
+static void hostapd_set_mbssid_beacon(struct hostapd_data *hapd,
+				      struct wpa_driver_ap_params *params)
+{
+	struct hostapd_iface *iface = hapd->iface;
+
+	if (!iface->conf->mbssid || iface->num_bss == 1)
+		return;
+
+	if (!iface->mbssid_max_interfaces) {
+		wpa_printf(MSG_DEBUG,
+			   "MBSSID: Driver doesn't support multi-BSSID advertisements");
+		return;
+	} else if (iface->num_bss > iface->mbssid_max_interfaces) {
+		wpa_printf(MSG_DEBUG,
+			   "MBSSID: Driver supports maximum %u interfaces for multi-BSSID advertisements",
+			   iface->mbssid_max_interfaces);
+		return;
+	}
+
+	params->mbssid_tx_iface = hostapd_mbssid_get_tx_bss(hapd)->conf->iface;
+	params->mbssid_index = hostapd_mbssid_get_bss_index(hapd);
+	params->mbssid_count = iface->num_bss;
+	return;
+}
+
+
 static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
 				   const struct ieee80211_mgmt *req,
 				   int is_p2p, size_t *resp_len)
@@ -1149,7 +1175,6 @@  static u8 * hostapd_probe_resp_offloads(struct hostapd_data *hapd,
 	/* Generate a Probe Response template for the non-P2P case */
 	return hostapd_gen_probe_resp(hapd, NULL, 0, resp_len);
 }
-
 #endif /* NEED_AP_MLME */
 
 
@@ -1432,7 +1457,11 @@  int ieee802_11_build_ap_params(struct hostapd_data *hapd,
 #ifdef NEED_AP_MLME
 	u16 capab_info;
 	u8 *pos, *tailpos, *tailend, *csa_pos;
+#endif /* NEED_AP_MLME */
+
+	os_memset(params, 0, sizeof(*params));
 
+#ifdef NEED_AP_MLME
 #define BEACON_HEAD_BUF_SIZE 256
 #define BEACON_TAIL_BUF_SIZE 512
 	head = os_zalloc(BEACON_HEAD_BUF_SIZE);
@@ -1556,6 +1585,7 @@  int ieee802_11_build_ap_params(struct hostapd_data *hapd,
 	tailpos = hostapd_eid_supported_op_classes(hapd, tailpos);
 	tailpos = hostapd_eid_ht_capabilities(hapd, tailpos);
 	tailpos = hostapd_eid_ht_operation(hapd, tailpos);
+	hostapd_set_mbssid_beacon(hapd, params);
 
 	tailpos = hostapd_eid_ext_capab(hapd, tailpos);
 
@@ -1662,7 +1692,6 @@  int ieee802_11_build_ap_params(struct hostapd_data *hapd,
 	resp = hostapd_probe_resp_offloads(hapd, &resp_len);
 #endif /* NEED_AP_MLME */
 
-	os_memset(params, 0, sizeof(*params));
 	params->head = (u8 *) head;
 	params->head_len = head_len;
 	params->tail = tail;
diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
index 14b608e67c23..9ca4ffa31d94 100644
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -87,6 +87,29 @@  int hostapd_for_each_interface(struct hapd_interfaces *interfaces,
 }
 
 
+struct hostapd_data * hostapd_mbssid_get_tx_bss(struct hostapd_data *hapd)
+{
+	if (hapd->iconf->mbssid)
+		return hapd->iface->bss[0];
+
+	return hapd;
+}
+
+
+int hostapd_mbssid_get_bss_index(struct hostapd_data *hapd)
+{
+	if (hapd->iconf->mbssid) {
+		size_t i;
+
+		for (i = 1; i < hapd->iface->num_bss; i++)
+			if (hapd->iface->bss[i] == hapd)
+				return i;
+	}
+
+	return 0;
+}
+
+
 void hostapd_reconfig_encryption(struct hostapd_data *hapd)
 {
 	if (hapd->wpa_auth)
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
index def0971cc11f..4e9046efa879 100644
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -691,6 +691,8 @@  struct hostapd_data * hostapd_get_iface(struct hapd_interfaces *interfaces,
 void hostapd_event_sta_opmode_changed(struct hostapd_data *hapd, const u8 *addr,
 				      enum smps_mode smps_mode,
 				      enum chan_width chan_width, u8 rx_nss);
+struct hostapd_data * hostapd_mbssid_get_tx_bss(struct hostapd_data *hapd);
+int hostapd_mbssid_get_bss_index(struct hostapd_data *hapd);
 
 #ifdef CONFIG_FST
 void fst_hostapd_fill_iface_obj(struct hostapd_data *hapd,
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index cf0f2180e704..0527f120287b 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -1582,6 +1582,21 @@  struct wpa_driver_ap_params {
 	 * Unsolicited broadcast Probe Response template length
 	 */
 	size_t unsol_bcast_probe_resp_tmpl_len;
+
+	/**
+	 * mbssid_tx_iface - Transmitting interface of the set
+	 */
+	const char *mbssid_tx_iface;
+
+	/**
+	 * mbssid_index - The index of this BSS in the group
+	 */
+	unsigned int mbssid_index;
+
+	/**
+	 * mbssid_count - Total number of BSSs in the group
+	 */
+	unsigned int mbssid_count;
 };
 
 struct wpa_driver_mesh_bss_params {