From: Ilan Peer <ilan.peer@xxxxxxxxx> 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@xxxxxxxxx> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@xxxxxxxxx> --- 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 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap