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:
Jouni Malinen 2013-01-04 12:19:02 +02:00 committed by Jouni Malinen
parent 1a9f6509b3
commit 6917c9e829

View file

@ -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);