[PATCH 27/50] driver: Specify link ID for 'send_mlme' and 'sta_deauth' callbacks
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Wed Feb 15 15:08:41 PST 2023
From: Ilan Peer <ilan.peer at intel.com>
So the driver would know on which link it should transmit the frames.
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 | 20 ++++++++++++++++++--
src/drivers/driver.h | 9 ++++++---
src/drivers/driver_nl80211.c | 28 ++++++++++++++++------------
wpa_supplicant/driver_i.h | 4 ++--
4 files changed, 42 insertions(+), 19 deletions(-)
diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c
index 4aaed156d0..33b258e6fe 100644
--- a/src/ap/ap_drv_ops.c
+++ b/src/ap/ap_drv_ops.c
@@ -758,20 +758,36 @@ int hostapd_drv_send_mlme(struct hostapd_data *hapd,
const u16 *csa_offs, size_t csa_offs_len,
int no_encrypt)
{
+ int link_id = -1;
+
+#ifdef CONFIG_IEEE80211BE
+ if (hapd->conf->mld_ap)
+ link_id = hapd->conf->mld_link_id;
+#endif /* CONFIG_IEEE80211BE */
+
if (!hapd->driver || !hapd->driver->send_mlme || !hapd->drv_priv)
return 0;
return hapd->driver->send_mlme(hapd->drv_priv, msg, len, noack, 0,
- csa_offs, csa_offs_len, no_encrypt, 0);
+ csa_offs, csa_offs_len, no_encrypt, 0,
+ link_id);
}
int hostapd_drv_sta_deauth(struct hostapd_data *hapd,
const u8 *addr, int reason)
{
+ int link_id = -1;
+
+#ifdef CONFIG_IEEE80211BE
+ if (hapd->conf->mld_ap)
+ link_id = hapd->conf->mld_link_id;
+#endif /* CONFIG_IEEE80211BE */
+
+
if (!hapd->driver || !hapd->driver->sta_deauth || !hapd->drv_priv)
return 0;
return hapd->driver->sta_deauth(hapd->drv_priv, hapd->own_addr, addr,
- reason);
+ reason, link_id);
}
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 38722f5db4..e838b54ae0 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -3206,12 +3206,14 @@ struct wpa_driver_ops {
* @no_encrypt: Do not encrypt frame even if appropriate key exists
* (used only for testing purposes)
* @wait: Time to wait off-channel for a response (in ms), or zero
+ * @link_id: Link ID to use for TX, or -1 if not set
* Returns: 0 on success, -1 on failure
*/
int (*send_mlme)(void *priv, const u8 *data, size_t data_len,
int noack, unsigned int freq, const u16 *csa_offs,
size_t csa_offs_len, int no_encrypt,
- unsigned int wait);
+ unsigned int wait,
+ int link_id);
/**
* update_ft_ies - Update FT (IEEE 802.11r) IEs
@@ -3513,14 +3515,15 @@ struct wpa_driver_ops {
* @priv: Private driver interface data
* @own_addr: Source address and BSSID for the Deauthentication frame
* @addr: MAC address of the station to deauthenticate
- * @reason: Reason code for the Deauthentiation frame
+ * @reason: Reason code for the Deauthentication frame
+ * @link_id: Link ID to use for Deauthentication, or -1 if not set
* Returns: 0 on success, -1 on failure
*
* This function requests a specific station to be deauthenticated and
* a Deauthentication frame to be sent to it.
*/
int (*sta_deauth)(void *priv, const u8 *own_addr, const u8 *addr,
- u16 reason);
+ u16 reason, int link_id);
/**
* sta_disassoc - Disassociate a station (AP only)
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 0987f11677..a728799f64 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -4147,7 +4147,8 @@ static int wpa_driver_nl80211_send_mlme(struct i802_bss *bss, const u8 *data,
int offchanok,
unsigned int wait_time,
const u16 *csa_offs,
- size_t csa_offs_len, int no_encrypt)
+ size_t csa_offs_len, int no_encrypt,
+ int link_id)
{
struct wpa_driver_nl80211_data *drv = bss->drv;
struct ieee80211_mgmt *mgmt;
@@ -4155,6 +4156,7 @@ static int wpa_driver_nl80211_send_mlme(struct i802_bss *bss, const u8 *data,
u16 fc;
int use_cookie = 1;
int res;
+ struct i802_link *link = nl80211_get_link(bss, link_id);
mgmt = (struct ieee80211_mgmt *) data;
fc = le_to_host16(mgmt->frame_control);
@@ -4253,14 +4255,14 @@ static int wpa_driver_nl80211_send_mlme(struct i802_bss *bss, const u8 *data,
}
if (freq == 0) {
wpa_printf(MSG_DEBUG, "nl80211: send_mlme - Use bss->freq=%u",
- bss->flink->freq);
- freq = bss->flink->freq;
+ link->freq);
+ freq = link->freq;
}
if (drv->use_monitor && is_ap_interface(drv->nlmode)) {
wpa_printf(MSG_DEBUG,
"nl80211: send_frame(freq=%u bss->freq=%u) -> send_monitor",
- freq, bss->flink->freq);
+ freq, link->freq);
return nl80211_send_monitor(drv, data, data_len, encrypt,
noack);
}
@@ -7922,14 +7924,15 @@ static int i802_sta_clear_stats(void *priv, const u8 *addr)
static int i802_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
- u16 reason)
+ u16 reason, int link_id)
{
struct i802_bss *bss = priv;
struct wpa_driver_nl80211_data *drv = bss->drv;
struct ieee80211_mgmt mgmt;
u8 channel;
+ struct i802_link *link = nl80211_get_link(bss, link_id);
- if (ieee80211_freq_to_chan(bss->flink->freq, &channel) ==
+ if (ieee80211_freq_to_chan(link->freq, &channel) ==
HOSTAPD_MODE_IEEE80211AD) {
/* Deauthentication is not used in DMG/IEEE 802.11ad;
* disassociate the STA instead. */
@@ -7952,7 +7955,7 @@ static int i802_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
return wpa_driver_nl80211_send_mlme(bss, (u8 *) &mgmt,
IEEE80211_HDRLEN +
sizeof(mgmt.u.deauth), 0, 0, 0, 0,
- 0, NULL, 0, 0);
+ 0, NULL, 0, 0, -1);
}
@@ -7979,7 +7982,7 @@ static int i802_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
return wpa_driver_nl80211_send_mlme(bss, (u8 *) &mgmt,
IEEE80211_HDRLEN +
sizeof(mgmt.u.disassoc), 0, 0, 0, 0,
- 0, NULL, 0, 0);
+ 0, NULL, 0, 0, -1);
}
@@ -8851,7 +8854,7 @@ static int wpa_driver_nl80211_send_action(struct i802_bss *bss,
!drv->use_monitor))
ret = wpa_driver_nl80211_send_mlme(bss, buf, 24 + data_len,
0, freq, no_cck, offchanok,
- wait_time, NULL, 0, 0);
+ wait_time, NULL, 0, 0, -1);
else
ret = nl80211_send_frame_cmd(bss, freq, wait_time, buf,
24 + data_len,
@@ -9943,7 +9946,7 @@ static void nl80211_send_null_frame(struct i802_bss *bss, const u8 *own_addr,
os_memcpy(nulldata.hdr.IEEE80211_SA_FROMDS, own_addr, ETH_ALEN);
if (wpa_driver_nl80211_send_mlme(bss, (u8 *) &nulldata, size, 0, 0, 0,
- 0, 0, NULL, 0, 0) < 0)
+ 0, 0, NULL, 0, 0, -1) < 0)
wpa_printf(MSG_DEBUG, "nl80211_send_null_frame: Failed to "
"send poll frame");
}
@@ -10292,12 +10295,13 @@ static int driver_nl80211_send_mlme(void *priv, const u8 *data,
size_t data_len, int noack,
unsigned int freq,
const u16 *csa_offs, size_t csa_offs_len,
- int no_encrypt, unsigned int wait)
+ int no_encrypt, unsigned int wait,
+ int link_id)
{
struct i802_bss *bss = priv;
return wpa_driver_nl80211_send_mlme(bss, data, data_len, noack,
freq, 0, 0, wait, csa_offs,
- csa_offs_len, no_encrypt);
+ csa_offs_len, no_encrypt, link_id);
}
diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h
index dd9858d59e..f23f78064e 100644
--- a/wpa_supplicant/driver_i.h
+++ b/wpa_supplicant/driver_i.h
@@ -202,7 +202,7 @@ static inline int wpa_drv_sta_deauth(struct wpa_supplicant *wpa_s,
if (wpa_s->driver->sta_deauth) {
return wpa_s->driver->sta_deauth(wpa_s->drv_priv,
wpa_s->own_addr, addr,
- reason_code);
+ reason_code, -1);
}
return -1;
}
@@ -328,7 +328,7 @@ static inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
if (wpa_s->driver->send_mlme)
return wpa_s->driver->send_mlme(wpa_s->drv_priv,
data, data_len, noack,
- freq, NULL, 0, 0, wait);
+ freq, NULL, 0, 0, wait, -1);
return -1;
}
--
2.38.1
More information about the Hostap
mailing list