1e5b75505Sopenharmony_ci/* 2e5b75505Sopenharmony_ci * hostapd / IEEE 802.11 MLME 3e5b75505Sopenharmony_ci * Copyright 2003-2006, Jouni Malinen <j@w1.fi> 4e5b75505Sopenharmony_ci * Copyright 2003-2004, Instant802 Networks, Inc. 5e5b75505Sopenharmony_ci * Copyright 2005-2006, Devicescape Software, Inc. 6e5b75505Sopenharmony_ci * 7e5b75505Sopenharmony_ci * This software may be distributed under the terms of the BSD license. 8e5b75505Sopenharmony_ci * See README for more details. 9e5b75505Sopenharmony_ci */ 10e5b75505Sopenharmony_ci 11e5b75505Sopenharmony_ci#include "utils/includes.h" 12e5b75505Sopenharmony_ci 13e5b75505Sopenharmony_ci#include "utils/common.h" 14e5b75505Sopenharmony_ci#include "common/ieee802_11_defs.h" 15e5b75505Sopenharmony_ci#include "ieee802_11.h" 16e5b75505Sopenharmony_ci#include "wpa_auth.h" 17e5b75505Sopenharmony_ci#include "sta_info.h" 18e5b75505Sopenharmony_ci#include "ap_mlme.h" 19e5b75505Sopenharmony_ci#include "hostapd.h" 20e5b75505Sopenharmony_ci 21e5b75505Sopenharmony_ci 22e5b75505Sopenharmony_ci#ifndef CONFIG_NO_HOSTAPD_LOGGER 23e5b75505Sopenharmony_cistatic const char * mlme_auth_alg_str(int alg) 24e5b75505Sopenharmony_ci{ 25e5b75505Sopenharmony_ci switch (alg) { 26e5b75505Sopenharmony_ci case WLAN_AUTH_OPEN: 27e5b75505Sopenharmony_ci return "OPEN_SYSTEM"; 28e5b75505Sopenharmony_ci case WLAN_AUTH_SHARED_KEY: 29e5b75505Sopenharmony_ci return "SHARED_KEY"; 30e5b75505Sopenharmony_ci case WLAN_AUTH_FT: 31e5b75505Sopenharmony_ci return "FT"; 32e5b75505Sopenharmony_ci } 33e5b75505Sopenharmony_ci 34e5b75505Sopenharmony_ci return "unknown"; 35e5b75505Sopenharmony_ci} 36e5b75505Sopenharmony_ci#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 37e5b75505Sopenharmony_ci 38e5b75505Sopenharmony_ci 39e5b75505Sopenharmony_ci/** 40e5b75505Sopenharmony_ci * mlme_authenticate_indication - Report the establishment of an authentication 41e5b75505Sopenharmony_ci * relationship with a specific peer MAC entity 42e5b75505Sopenharmony_ci * @hapd: BSS data 43e5b75505Sopenharmony_ci * @sta: peer STA data 44e5b75505Sopenharmony_ci * 45e5b75505Sopenharmony_ci * MLME calls this function as a result of the establishment of an 46e5b75505Sopenharmony_ci * authentication relationship with a specific peer MAC entity that 47e5b75505Sopenharmony_ci * resulted from an authentication procedure that was initiated by 48e5b75505Sopenharmony_ci * that specific peer MAC entity. 49e5b75505Sopenharmony_ci * 50e5b75505Sopenharmony_ci * PeerSTAAddress = sta->addr 51e5b75505Sopenharmony_ci * AuthenticationType = sta->auth_alg (WLAN_AUTH_OPEN / WLAN_AUTH_SHARED_KEY) 52e5b75505Sopenharmony_ci */ 53e5b75505Sopenharmony_civoid mlme_authenticate_indication(struct hostapd_data *hapd, 54e5b75505Sopenharmony_ci struct sta_info *sta) 55e5b75505Sopenharmony_ci{ 56e5b75505Sopenharmony_ci hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 57e5b75505Sopenharmony_ci HOSTAPD_LEVEL_DEBUG, 58e5b75505Sopenharmony_ci "MLME-AUTHENTICATE.indication(" MACSTR ", %s)", 59e5b75505Sopenharmony_ci MAC2STR(sta->addr), mlme_auth_alg_str(sta->auth_alg)); 60e5b75505Sopenharmony_ci if (sta->auth_alg != WLAN_AUTH_FT && 61e5b75505Sopenharmony_ci sta->auth_alg != WLAN_AUTH_FILS_SK && 62e5b75505Sopenharmony_ci sta->auth_alg != WLAN_AUTH_FILS_SK_PFS && 63e5b75505Sopenharmony_ci sta->auth_alg != WLAN_AUTH_FILS_PK && 64e5b75505Sopenharmony_ci !(sta->flags & WLAN_STA_MFP)) 65e5b75505Sopenharmony_ci mlme_deletekeys_request(hapd, sta); 66e5b75505Sopenharmony_ci ap_sta_clear_disconnect_timeouts(hapd, sta); 67e5b75505Sopenharmony_ci} 68e5b75505Sopenharmony_ci 69e5b75505Sopenharmony_ci 70e5b75505Sopenharmony_ci/** 71e5b75505Sopenharmony_ci * mlme_deauthenticate_indication - Report the invalidation of an 72e5b75505Sopenharmony_ci * authentication relationship with a specific peer MAC entity 73e5b75505Sopenharmony_ci * @hapd: BSS data 74e5b75505Sopenharmony_ci * @sta: Peer STA data 75e5b75505Sopenharmony_ci * @reason_code: ReasonCode from Deauthentication frame 76e5b75505Sopenharmony_ci * 77e5b75505Sopenharmony_ci * MLME calls this function as a result of the invalidation of an 78e5b75505Sopenharmony_ci * authentication relationship with a specific peer MAC entity. 79e5b75505Sopenharmony_ci * 80e5b75505Sopenharmony_ci * PeerSTAAddress = sta->addr 81e5b75505Sopenharmony_ci */ 82e5b75505Sopenharmony_civoid mlme_deauthenticate_indication(struct hostapd_data *hapd, 83e5b75505Sopenharmony_ci struct sta_info *sta, u16 reason_code) 84e5b75505Sopenharmony_ci{ 85e5b75505Sopenharmony_ci hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 86e5b75505Sopenharmony_ci HOSTAPD_LEVEL_DEBUG, 87e5b75505Sopenharmony_ci "MLME-DEAUTHENTICATE.indication(" MACSTR ", %d)", 88e5b75505Sopenharmony_ci MAC2STR(sta->addr), reason_code); 89e5b75505Sopenharmony_ci if (!hapd->iface->driver_ap_teardown) 90e5b75505Sopenharmony_ci mlme_deletekeys_request(hapd, sta); 91e5b75505Sopenharmony_ci} 92e5b75505Sopenharmony_ci 93e5b75505Sopenharmony_ci 94e5b75505Sopenharmony_ci/** 95e5b75505Sopenharmony_ci * mlme_associate_indication - Report the establishment of an association with 96e5b75505Sopenharmony_ci * a specific peer MAC entity 97e5b75505Sopenharmony_ci * @hapd: BSS data 98e5b75505Sopenharmony_ci * @sta: peer STA data 99e5b75505Sopenharmony_ci * 100e5b75505Sopenharmony_ci * MLME calls this function as a result of the establishment of an 101e5b75505Sopenharmony_ci * association with a specific peer MAC entity that resulted from an 102e5b75505Sopenharmony_ci * association procedure that was initiated by that specific peer MAC entity. 103e5b75505Sopenharmony_ci * 104e5b75505Sopenharmony_ci * PeerSTAAddress = sta->addr 105e5b75505Sopenharmony_ci */ 106e5b75505Sopenharmony_civoid mlme_associate_indication(struct hostapd_data *hapd, struct sta_info *sta) 107e5b75505Sopenharmony_ci{ 108e5b75505Sopenharmony_ci hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 109e5b75505Sopenharmony_ci HOSTAPD_LEVEL_DEBUG, 110e5b75505Sopenharmony_ci "MLME-ASSOCIATE.indication(" MACSTR ")", 111e5b75505Sopenharmony_ci MAC2STR(sta->addr)); 112e5b75505Sopenharmony_ci if (sta->auth_alg != WLAN_AUTH_FT && 113e5b75505Sopenharmony_ci sta->auth_alg != WLAN_AUTH_FILS_SK && 114e5b75505Sopenharmony_ci sta->auth_alg != WLAN_AUTH_FILS_SK_PFS && 115e5b75505Sopenharmony_ci sta->auth_alg != WLAN_AUTH_FILS_PK) 116e5b75505Sopenharmony_ci mlme_deletekeys_request(hapd, sta); 117e5b75505Sopenharmony_ci ap_sta_clear_disconnect_timeouts(hapd, sta); 118e5b75505Sopenharmony_ci} 119e5b75505Sopenharmony_ci 120e5b75505Sopenharmony_ci 121e5b75505Sopenharmony_ci/** 122e5b75505Sopenharmony_ci * mlme_reassociate_indication - Report the establishment of an reassociation 123e5b75505Sopenharmony_ci * with a specific peer MAC entity 124e5b75505Sopenharmony_ci * @hapd: BSS data 125e5b75505Sopenharmony_ci * @sta: peer STA data 126e5b75505Sopenharmony_ci * 127e5b75505Sopenharmony_ci * MLME calls this function as a result of the establishment of an 128e5b75505Sopenharmony_ci * reassociation with a specific peer MAC entity that resulted from a 129e5b75505Sopenharmony_ci * reassociation procedure that was initiated by that specific peer MAC entity. 130e5b75505Sopenharmony_ci * 131e5b75505Sopenharmony_ci * PeerSTAAddress = sta->addr 132e5b75505Sopenharmony_ci */ 133e5b75505Sopenharmony_civoid mlme_reassociate_indication(struct hostapd_data *hapd, 134e5b75505Sopenharmony_ci struct sta_info *sta) 135e5b75505Sopenharmony_ci{ 136e5b75505Sopenharmony_ci hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 137e5b75505Sopenharmony_ci HOSTAPD_LEVEL_DEBUG, 138e5b75505Sopenharmony_ci "MLME-REASSOCIATE.indication(" MACSTR ")", 139e5b75505Sopenharmony_ci MAC2STR(sta->addr)); 140e5b75505Sopenharmony_ci if (sta->auth_alg != WLAN_AUTH_FT && 141e5b75505Sopenharmony_ci sta->auth_alg != WLAN_AUTH_FILS_SK && 142e5b75505Sopenharmony_ci sta->auth_alg != WLAN_AUTH_FILS_SK_PFS && 143e5b75505Sopenharmony_ci sta->auth_alg != WLAN_AUTH_FILS_PK) 144e5b75505Sopenharmony_ci mlme_deletekeys_request(hapd, sta); 145e5b75505Sopenharmony_ci ap_sta_clear_disconnect_timeouts(hapd, sta); 146e5b75505Sopenharmony_ci} 147e5b75505Sopenharmony_ci 148e5b75505Sopenharmony_ci 149e5b75505Sopenharmony_ci/** 150e5b75505Sopenharmony_ci * mlme_disassociate_indication - Report disassociation with a specific peer 151e5b75505Sopenharmony_ci * MAC entity 152e5b75505Sopenharmony_ci * @hapd: BSS data 153e5b75505Sopenharmony_ci * @sta: Peer STA data 154e5b75505Sopenharmony_ci * @reason_code: ReasonCode from Disassociation frame 155e5b75505Sopenharmony_ci * 156e5b75505Sopenharmony_ci * MLME calls this function as a result of the invalidation of an association 157e5b75505Sopenharmony_ci * relationship with a specific peer MAC entity. 158e5b75505Sopenharmony_ci * 159e5b75505Sopenharmony_ci * PeerSTAAddress = sta->addr 160e5b75505Sopenharmony_ci */ 161e5b75505Sopenharmony_civoid mlme_disassociate_indication(struct hostapd_data *hapd, 162e5b75505Sopenharmony_ci struct sta_info *sta, u16 reason_code) 163e5b75505Sopenharmony_ci{ 164e5b75505Sopenharmony_ci hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 165e5b75505Sopenharmony_ci HOSTAPD_LEVEL_DEBUG, 166e5b75505Sopenharmony_ci "MLME-DISASSOCIATE.indication(" MACSTR ", %d)", 167e5b75505Sopenharmony_ci MAC2STR(sta->addr), reason_code); 168e5b75505Sopenharmony_ci mlme_deletekeys_request(hapd, sta); 169e5b75505Sopenharmony_ci} 170e5b75505Sopenharmony_ci 171e5b75505Sopenharmony_ci 172e5b75505Sopenharmony_civoid mlme_michaelmicfailure_indication(struct hostapd_data *hapd, 173e5b75505Sopenharmony_ci const u8 *addr) 174e5b75505Sopenharmony_ci{ 175e5b75505Sopenharmony_ci hostapd_logger(hapd, addr, HOSTAPD_MODULE_MLME, 176e5b75505Sopenharmony_ci HOSTAPD_LEVEL_DEBUG, 177e5b75505Sopenharmony_ci "MLME-MichaelMICFailure.indication(" MACSTR ")", 178e5b75505Sopenharmony_ci MAC2STR(addr)); 179e5b75505Sopenharmony_ci} 180e5b75505Sopenharmony_ci 181e5b75505Sopenharmony_ci 182e5b75505Sopenharmony_civoid mlme_deletekeys_request(struct hostapd_data *hapd, struct sta_info *sta) 183e5b75505Sopenharmony_ci{ 184e5b75505Sopenharmony_ci hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 185e5b75505Sopenharmony_ci HOSTAPD_LEVEL_DEBUG, 186e5b75505Sopenharmony_ci "MLME-DELETEKEYS.request(" MACSTR ")", 187e5b75505Sopenharmony_ci MAC2STR(sta->addr)); 188e5b75505Sopenharmony_ci 189e5b75505Sopenharmony_ci if (sta->wpa_sm) 190e5b75505Sopenharmony_ci wpa_remove_ptk(sta->wpa_sm); 191e5b75505Sopenharmony_ci} 192