[PATCH 04/50] driver: Allow to provide a link ID when setting a channel
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Wed Feb 15 15:08:18 PST 2023
From: Ilan Peer <ilan.peer at intel.com>
This includes:
- Modifications of the driver API, to include the link ID as part
of 'struct hostapd_freq_params'.
- Modifications to nl80211 driver.
- Modifications for the driver wrappers.
Signed-off-by: Ilan Peer <ilan.peer at intel.com>
Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
---
src/ap/ap_drv_ops.c | 9 ++++++
src/drivers/driver.h | 5 ++++
src/drivers/driver_nl80211.c | 58 ++++++++++++++++++++++++++++++++++--
wpa_supplicant/driver_i.h | 7 +++++
4 files changed, 76 insertions(+), 3 deletions(-)
diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
index 1ffc37ff33..bd2cf7cea5 100644
--- a/src/ap/ap_drv_ops.c
+++ b/src/ap/ap_drv_ops.c
@@ -583,6 +583,15 @@ int hostapd_set_freq(struct hostapd_data *hapd, enum hostapd_hw_mode mode,
return 0;
if (hapd->driver->set_freq == NULL)
return 0;
+
+ data.link_id = -1;
+
+#ifdef CONFIG_IEEE80211BE
+ if (hapd->conf->mld_ap)
+ data.link_id = hapd->conf->mld_link_id;
+#endif /* CONFIG_IEEE80211BE */
+
+ wpa_printf(MSG_DEBUG, "hostapd_set_freq: link_id=%d", data.link_id);
return hapd->driver->set_freq(hapd->drv_priv, &data);
}
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 3c5f41b087..f2595b02a6 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -835,6 +835,11 @@ struct hostapd_freq_params {
* eht_enabled - Whether EHT is enabled
*/
bool eht_enabled;
+
+ /**
+ * if >=0 indicates the link of the MLD AP to configure.
+ */
+ int link_id;
};
/**
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 9a517aaa25..ea7d8bdf44 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -199,8 +199,6 @@ static int nl80211_put_mesh_config(struct nl_msg *msg,
#endif /* CONFIG_MESH */
static int i802_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
u16 reason);
-
-
/* Converts nl80211_chan_width to a common format */
enum chan_width convert2width(int width)
{
@@ -4075,6 +4073,29 @@ int wpa_driver_nl80211_authenticate_retry(struct wpa_driver_nl80211_data *drv)
}
+static struct i802_link *nl80211_get_link(struct i802_bss *bss, s8 link_id)
+{
+ unsigned int i;
+
+ for (i = 0; i < bss->n_links; i++) {
+ if (bss->links[i].link_id != link_id)
+ continue;
+
+ return &bss->links[i];
+ }
+
+ return bss->flink;
+}
+
+
+static void nl80211_link_set_freq(struct i802_bss *bss, s8 link_id, int freq)
+{
+ struct i802_link *link = nl80211_get_link(bss, link_id);
+
+ link->freq = freq;
+}
+
+
static int wpa_driver_nl80211_send_mlme(struct i802_bss *bss, const u8 *data,
size_t data_len, int noack,
unsigned int freq, int no_cck,
@@ -5161,6 +5182,26 @@ static int nl80211_put_freq_params(struct nl_msg *msg,
return 0;
}
+static bool nl80211_link_valid(struct i802_bss *bss, s8 link_id)
+{
+ u32 i;
+
+ if (link_id < 0)
+ return false;
+
+ for (i = 0; i < bss->n_links; i++) {
+ wpa_printf(MSG_DEBUG, "nl80211: i=%u, link_Id=%u",
+ i, bss->links[i].link_id);
+ if (bss->links[i].link_id == NL80211_DRV_LINK_ID_NA)
+ continue;
+
+ if (bss->links[i].link_id == link_id)
+ return true;
+ }
+
+ return false;
+}
+
static int nl80211_set_channel(struct i802_bss *bss,
struct hostapd_freq_params *freq, int set_chan)
@@ -5182,9 +5223,20 @@ static int nl80211_set_channel(struct i802_bss *bss,
return -1;
}
+ if (nl80211_link_valid(bss, freq->link_id)) {
+ wpa_printf(MSG_DEBUG, "nl80211: Set link_id=%u for freq",
+ freq->link_id);
+
+ if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID,
+ freq->link_id)) {
+ nlmsg_free(msg);
+ return -ENOBUFS;
+ }
+ }
+
ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
if (ret == 0) {
- bss->flink->freq = freq->freq;
+ nl80211_link_set_freq(bss, freq->link_id, freq->freq);
return 0;
}
wpa_printf(MSG_DEBUG, "nl80211: Failed to set channel (freq=%d): "
diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h
index 5dd2a514cc..7fc9b270a8 100644
--- a/wpa_supplicant/driver_i.h
+++ b/wpa_supplicant/driver_i.h
@@ -60,6 +60,9 @@ static inline int wpa_drv_associate(struct wpa_supplicant *wpa_s,
struct wpa_driver_associate_params *params)
{
if (wpa_s->driver->associate) {
+ if (params)
+ params->freq.link_id = -1;
+
return wpa_s->driver->associate(wpa_s->drv_priv, params);
}
return -1;
@@ -1087,6 +1090,10 @@ static inline int wpa_drv_update_connect_params(
{
if (!wpa_s->driver->update_connect_params)
return -1;
+
+ if (params)
+ params->freq.link_id = -1;
+
return wpa_s->driver->update_connect_params(wpa_s->drv_priv, params,
mask);
}
--
2.38.1
More information about the Hostap
mailing list