const u8 *addr, int reason)
{
const u8 *own_addr = hapd->own_addr;
+ int link_id = -1;
#ifdef CONFIG_IEEE80211BE
if (hapd->conf->mld_ap) {
struct sta_info *sta = ap_get_sta(hapd, addr);
- if (ap_sta_is_mld(hapd, sta))
+ if (ap_sta_is_mld(hapd, sta)) {
own_addr = hapd->mld->mld_addr;
+ link_id = hapd->mld_link_id;
+ }
}
#endif /* CONFIG_IEEE80211BE */
if (!hapd->driver || !hapd->driver->sta_disassoc || !hapd->drv_priv)
return 0;
return hapd->driver->sta_disassoc(hapd->drv_priv, own_addr, addr,
- reason);
+ reason, link_id);
}
* @own_addr: Source address and BSSID for the Disassociation frame
* @addr: MAC address of the station to disassociate
* @reason: Reason code for the Disassociation frame
+ * @link_id: Link ID to use for Disassociation frame, or -1 if not set
* Returns: 0 on success, -1 on failure
*
* This function requests a specific station to be disassociated and
* a Disassociation frame to be sent to it.
*/
int (*sta_disassoc)(void *priv, const u8 *own_addr, const u8 *addr,
- u16 reason);
+ u16 reason, int link_id);
/**
* sta_remove - Remove a station entry (AP only)
static int
atheros_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
- u16 reason_code)
+ u16 reason_code, int link_id)
{
struct atheros_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
static int
bsd_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
- u16 reason_code)
+ u16 reason_code, int link_id)
{
return bsd_send_mlme_param(priv, IEEE80211_MLME_DISASSOC, reason_code,
addr);
static int hostap_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
- u16 reason)
+ u16 reason, int link_id)
{
struct hostap_driver_data *drv = priv;
struct ieee80211_mgmt mgmt;
struct wpa_driver_mesh_bss_params *params);
#endif /* CONFIG_MESH */
static int i802_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
- u16 reason);
+ u16 reason, int link_id);
/* Converts nl80211_chan_width to a common format */
HOSTAPD_MODE_IEEE80211AD) {
/* Deauthentication is not used in DMG/IEEE 802.11ad;
* disassociate the STA instead. */
- return i802_sta_disassoc(priv, own_addr, addr, reason);
+ return i802_sta_disassoc(priv, own_addr, addr, reason,
+ link_id);
}
if (is_mesh_interface(drv->nlmode))
static int i802_sta_disassoc(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;
return wpa_driver_nl80211_send_mlme(bss, (u8 *) &mgmt,
IEEE80211_HDRLEN +
sizeof(mgmt.u.disassoc), 0, 0, 0, 0,
- 0, NULL, 0, 0, -1);
+ 0, NULL, 0, 0, link_id);
}