Allow AP mode deauth/disassoc reason code to be overridden
The optional "reason=<reason code>" parameter to the ctrl_iface deauthenticate and disassociate commands can now be used to change the reason code used in the disconnection frame. This can be used, e.g., by P2P GO to disconnect a single P2P client from the group by sending it an indication of the group getting terminated (Deauthentication frame with reason code 3). It needs to be noted that the peer device is still in possession on the PSK, so it can still reconnect to the group after this if it does not follow the group termination indication. Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
1a9f6509b3
commit
6917c9e829
1 changed files with 14 additions and 6 deletions
|
@ -189,6 +189,7 @@ int hostapd_ctrl_iface_deauthenticate(struct hostapd_data *hapd,
|
||||||
u8 addr[ETH_ALEN];
|
u8 addr[ETH_ALEN];
|
||||||
struct sta_info *sta;
|
struct sta_info *sta;
|
||||||
const char *pos;
|
const char *pos;
|
||||||
|
u16 reason = WLAN_REASON_PREV_AUTH_NOT_VALID;
|
||||||
|
|
||||||
wpa_dbg(hapd->msg_ctx, MSG_DEBUG, "CTRL_IFACE DEAUTHENTICATE %s",
|
wpa_dbg(hapd->msg_ctx, MSG_DEBUG, "CTRL_IFACE DEAUTHENTICATE %s",
|
||||||
txtaddr);
|
txtaddr);
|
||||||
|
@ -228,11 +229,14 @@ int hostapd_ctrl_iface_deauthenticate(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_P2P_MANAGER */
|
#endif /* CONFIG_P2P_MANAGER */
|
||||||
|
|
||||||
hostapd_drv_sta_deauth(hapd, addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
|
pos = os_strstr(txtaddr, " reason=");
|
||||||
|
if (pos)
|
||||||
|
reason = atoi(pos + 8);
|
||||||
|
|
||||||
|
hostapd_drv_sta_deauth(hapd, addr, reason);
|
||||||
sta = ap_get_sta(hapd, addr);
|
sta = ap_get_sta(hapd, addr);
|
||||||
if (sta)
|
if (sta)
|
||||||
ap_sta_deauthenticate(hapd, sta,
|
ap_sta_deauthenticate(hapd, sta, reason);
|
||||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
|
||||||
else if (addr[0] == 0xff)
|
else if (addr[0] == 0xff)
|
||||||
hostapd_free_stas(hapd);
|
hostapd_free_stas(hapd);
|
||||||
|
|
||||||
|
@ -246,6 +250,7 @@ int hostapd_ctrl_iface_disassociate(struct hostapd_data *hapd,
|
||||||
u8 addr[ETH_ALEN];
|
u8 addr[ETH_ALEN];
|
||||||
struct sta_info *sta;
|
struct sta_info *sta;
|
||||||
const char *pos;
|
const char *pos;
|
||||||
|
u16 reason = WLAN_REASON_PREV_AUTH_NOT_VALID;
|
||||||
|
|
||||||
wpa_dbg(hapd->msg_ctx, MSG_DEBUG, "CTRL_IFACE DISASSOCIATE %s",
|
wpa_dbg(hapd->msg_ctx, MSG_DEBUG, "CTRL_IFACE DISASSOCIATE %s",
|
||||||
txtaddr);
|
txtaddr);
|
||||||
|
@ -285,11 +290,14 @@ int hostapd_ctrl_iface_disassociate(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_P2P_MANAGER */
|
#endif /* CONFIG_P2P_MANAGER */
|
||||||
|
|
||||||
hostapd_drv_sta_disassoc(hapd, addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
|
pos = os_strstr(txtaddr, " reason=");
|
||||||
|
if (pos)
|
||||||
|
reason = atoi(pos + 8);
|
||||||
|
|
||||||
|
hostapd_drv_sta_disassoc(hapd, addr, reason);
|
||||||
sta = ap_get_sta(hapd, addr);
|
sta = ap_get_sta(hapd, addr);
|
||||||
if (sta)
|
if (sta)
|
||||||
ap_sta_disassociate(hapd, sta,
|
ap_sta_disassociate(hapd, sta, reason);
|
||||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
|
||||||
else if (addr[0] == 0xff)
|
else if (addr[0] == 0xff)
|
||||||
hostapd_free_stas(hapd);
|
hostapd_free_stas(hapd);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue