From e2c420d32f11ad1e72ce081ab4efdc8382398212 Mon Sep 17 00:00:00 2001
From: Benjamin Berg <benjamin.berg@intel.com>
Date: Mon, 22 May 2023 22:33:31 +0300
Subject: [PATCH 03/54] AP: MLO: Retrieve EML and MLD capabilities from driver

Add the new driver API get_mld_capab and and use it to fetch MLD
and EML capabilities.

Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
---
 hostapd/main.c       |  2 ++
 src/ap/ap_drv_ops.c  | 13 +++++++++++++
 src/ap/ap_drv_ops.h  |  1 +
 src/ap/hostapd.h     |  2 ++
 src/drivers/driver.h | 12 ++++++++++++
 5 files changed, 30 insertions(+)

diff --git a/hostapd/main.c b/hostapd/main.c
index ce2df81c4..fc5b51a17 100644
--- a/hostapd/main.c
+++ b/hostapd/main.c
@@ -235,6 +235,8 @@ static int hostapd_driver_init(struct hostapd_iface *iface)
 		 */
 		hostapd_get_ext_capa(iface);
 
+		hostapd_get_mld_capa(iface);
+
 		triggs = wpa_get_wowlan_triggers(conf->wowlan_triggers, &capa);
 		if (triggs && hapd->driver->set_wowlan) {
 			if (hapd->driver->set_wowlan(hapd->drv_priv, triggs))
diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
index 844896e8b..46c989a85 100644
--- a/src/ap/ap_drv_ops.c
+++ b/src/ap/ap_drv_ops.c
@@ -941,6 +941,19 @@ void hostapd_get_ext_capa(struct hostapd_iface *iface)
 }
 
 
+void hostapd_get_mld_capa(struct hostapd_iface *iface)
+{
+	struct hostapd_data *hapd = iface->bss[0];
+
+	if (!hapd->driver || !hapd->driver->get_mld_capab)
+		return;
+
+	hapd->driver->get_mld_capab(hapd->drv_priv, WPA_IF_AP_BSS,
+				    &iface->mld_eml_capa,
+				    &iface->mld_mld_capa);
+}
+
+
 /**
  * hostapd_drv_do_acs - Start automatic channel selection
  * @hapd: BSS data for the device initiating ACS
diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
index 023cbf1f8..866440027 100644
--- a/src/ap/ap_drv_ops.h
+++ b/src/ap/ap_drv_ops.h
@@ -155,6 +155,7 @@ int hostapd_drv_set_qos_map(struct hostapd_data *hapd, const u8 *qos_map_set,
 			    u8 qos_map_set_len);
 
 void hostapd_get_ext_capa(struct hostapd_iface *iface);
+void hostapd_get_mld_capa(struct hostapd_iface *iface);
 
 void hostapd_get_hw_mode_any_channels(struct hostapd_data *hapd,
 				      struct hostapd_hw_modes *mode,
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
index 0dd043da8..bcb78aff3 100644
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -542,6 +542,8 @@ struct hostapd_iface {
 	const u8 *extended_capa, *extended_capa_mask;
 	unsigned int extended_capa_len;
 
+	u16 mld_eml_capa, mld_mld_capa;
+
 	unsigned int drv_max_acl_mac_addrs;
 
 	struct hostapd_hw_modes *hw_features;
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 12371a7d8..f6afd23f1 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -4854,6 +4854,18 @@ struct wpa_driver_ops {
 			     const u8 **ext_capab, const u8 **ext_capab_mask,
 			     unsigned int *ext_capab_len);
 
+	/**
+	 * get_mld_capab - Get MLD capabilities for the specified interface
+	 * @priv: Private driver interface data
+	 * @type: Interface type for which to get MLD capabilities
+	 * @eml_capa: EML capabilities
+	 * @mld_capa_and_ops: MLD Capabilities and Operations
+	 * Returns: 0 on success or -1 on failure
+	 */
+	int (*get_mld_capab)(void *priv, enum wpa_driver_if_type type,
+			     u16 *eml_capa,
+			     u16 *mld_capa_and_ops);
+
 	/**
 	 * p2p_lo_start - Start offloading P2P listen to device
 	 * @priv: Private driver interface data
-- 
2.39.2

