1214501Srpaulo/* 2214501Srpaulo * hostapd / IEEE 802.11 MLME 3214501Srpaulo * Copyright 2003-2006, Jouni Malinen <j@w1.fi> 4214501Srpaulo * Copyright 2003-2004, Instant802 Networks, Inc. 5214501Srpaulo * Copyright 2005-2006, Devicescape Software, Inc. 6214501Srpaulo * 7252726Srpaulo * This software may be distributed under the terms of the BSD license. 8252726Srpaulo * See README for more details. 9214501Srpaulo */ 10214501Srpaulo 11214501Srpaulo#include "utils/includes.h" 12214501Srpaulo 13214501Srpaulo#include "utils/common.h" 14214501Srpaulo#include "common/ieee802_11_defs.h" 15214501Srpaulo#include "ieee802_11.h" 16214501Srpaulo#include "wpa_auth.h" 17214501Srpaulo#include "sta_info.h" 18214501Srpaulo#include "ap_mlme.h" 19281806Srpaulo#include "hostapd.h" 20214501Srpaulo 21214501Srpaulo 22214501Srpaulo#ifndef CONFIG_NO_HOSTAPD_LOGGER 23214501Srpaulostatic const char * mlme_auth_alg_str(int alg) 24214501Srpaulo{ 25214501Srpaulo switch (alg) { 26214501Srpaulo case WLAN_AUTH_OPEN: 27214501Srpaulo return "OPEN_SYSTEM"; 28214501Srpaulo case WLAN_AUTH_SHARED_KEY: 29214501Srpaulo return "SHARED_KEY"; 30214501Srpaulo case WLAN_AUTH_FT: 31214501Srpaulo return "FT"; 32214501Srpaulo } 33214501Srpaulo 34214501Srpaulo return "unknown"; 35214501Srpaulo} 36214501Srpaulo#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 37214501Srpaulo 38214501Srpaulo 39214501Srpaulo/** 40214501Srpaulo * mlme_authenticate_indication - Report the establishment of an authentication 41214501Srpaulo * relationship with a specific peer MAC entity 42214501Srpaulo * @hapd: BSS data 43214501Srpaulo * @sta: peer STA data 44214501Srpaulo * 45214501Srpaulo * MLME calls this function as a result of the establishment of an 46214501Srpaulo * authentication relationship with a specific peer MAC entity that 47214501Srpaulo * resulted from an authentication procedure that was initiated by 48214501Srpaulo * that specific peer MAC entity. 49214501Srpaulo * 50214501Srpaulo * PeerSTAAddress = sta->addr 51214501Srpaulo * AuthenticationType = sta->auth_alg (WLAN_AUTH_OPEN / WLAN_AUTH_SHARED_KEY) 52214501Srpaulo */ 53214501Srpaulovoid mlme_authenticate_indication(struct hostapd_data *hapd, 54214501Srpaulo struct sta_info *sta) 55214501Srpaulo{ 56214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 57214501Srpaulo HOSTAPD_LEVEL_DEBUG, 58214501Srpaulo "MLME-AUTHENTICATE.indication(" MACSTR ", %s)", 59214501Srpaulo MAC2STR(sta->addr), mlme_auth_alg_str(sta->auth_alg)); 60346981Scy if (sta->auth_alg != WLAN_AUTH_FT && 61346981Scy sta->auth_alg != WLAN_AUTH_FILS_SK && 62346981Scy sta->auth_alg != WLAN_AUTH_FILS_SK_PFS && 63346981Scy sta->auth_alg != WLAN_AUTH_FILS_PK && 64346981Scy !(sta->flags & WLAN_STA_MFP)) 65214501Srpaulo mlme_deletekeys_request(hapd, sta); 66337817Scy ap_sta_clear_disconnect_timeouts(hapd, sta); 67214501Srpaulo} 68214501Srpaulo 69214501Srpaulo 70214501Srpaulo/** 71214501Srpaulo * mlme_deauthenticate_indication - Report the invalidation of an 72214501Srpaulo * authentication relationship with a specific peer MAC entity 73214501Srpaulo * @hapd: BSS data 74214501Srpaulo * @sta: Peer STA data 75214501Srpaulo * @reason_code: ReasonCode from Deauthentication frame 76214501Srpaulo * 77214501Srpaulo * MLME calls this function as a result of the invalidation of an 78214501Srpaulo * authentication relationship with a specific peer MAC entity. 79214501Srpaulo * 80214501Srpaulo * PeerSTAAddress = sta->addr 81214501Srpaulo */ 82214501Srpaulovoid mlme_deauthenticate_indication(struct hostapd_data *hapd, 83214501Srpaulo struct sta_info *sta, u16 reason_code) 84214501Srpaulo{ 85214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 86214501Srpaulo HOSTAPD_LEVEL_DEBUG, 87214501Srpaulo "MLME-DEAUTHENTICATE.indication(" MACSTR ", %d)", 88214501Srpaulo MAC2STR(sta->addr), reason_code); 89281806Srpaulo if (!hapd->iface->driver_ap_teardown) 90281806Srpaulo mlme_deletekeys_request(hapd, sta); 91214501Srpaulo} 92214501Srpaulo 93214501Srpaulo 94214501Srpaulo/** 95214501Srpaulo * mlme_associate_indication - Report the establishment of an association with 96214501Srpaulo * a specific peer MAC entity 97214501Srpaulo * @hapd: BSS data 98214501Srpaulo * @sta: peer STA data 99214501Srpaulo * 100214501Srpaulo * MLME calls this function as a result of the establishment of an 101214501Srpaulo * association with a specific peer MAC entity that resulted from an 102214501Srpaulo * association procedure that was initiated by that specific peer MAC entity. 103214501Srpaulo * 104214501Srpaulo * PeerSTAAddress = sta->addr 105214501Srpaulo */ 106214501Srpaulovoid mlme_associate_indication(struct hostapd_data *hapd, struct sta_info *sta) 107214501Srpaulo{ 108214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 109214501Srpaulo HOSTAPD_LEVEL_DEBUG, 110214501Srpaulo "MLME-ASSOCIATE.indication(" MACSTR ")", 111214501Srpaulo MAC2STR(sta->addr)); 112346981Scy if (sta->auth_alg != WLAN_AUTH_FT && 113346981Scy sta->auth_alg != WLAN_AUTH_FILS_SK && 114346981Scy sta->auth_alg != WLAN_AUTH_FILS_SK_PFS && 115346981Scy sta->auth_alg != WLAN_AUTH_FILS_PK) 116214501Srpaulo mlme_deletekeys_request(hapd, sta); 117337817Scy ap_sta_clear_disconnect_timeouts(hapd, sta); 118214501Srpaulo} 119214501Srpaulo 120214501Srpaulo 121214501Srpaulo/** 122214501Srpaulo * mlme_reassociate_indication - Report the establishment of an reassociation 123214501Srpaulo * with a specific peer MAC entity 124214501Srpaulo * @hapd: BSS data 125214501Srpaulo * @sta: peer STA data 126214501Srpaulo * 127214501Srpaulo * MLME calls this function as a result of the establishment of an 128214501Srpaulo * reassociation with a specific peer MAC entity that resulted from a 129214501Srpaulo * reassociation procedure that was initiated by that specific peer MAC entity. 130214501Srpaulo * 131214501Srpaulo * PeerSTAAddress = sta->addr 132214501Srpaulo */ 133214501Srpaulovoid mlme_reassociate_indication(struct hostapd_data *hapd, 134214501Srpaulo struct sta_info *sta) 135214501Srpaulo{ 136214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 137214501Srpaulo HOSTAPD_LEVEL_DEBUG, 138214501Srpaulo "MLME-REASSOCIATE.indication(" MACSTR ")", 139214501Srpaulo MAC2STR(sta->addr)); 140346981Scy if (sta->auth_alg != WLAN_AUTH_FT && 141346981Scy sta->auth_alg != WLAN_AUTH_FILS_SK && 142346981Scy sta->auth_alg != WLAN_AUTH_FILS_SK_PFS && 143346981Scy sta->auth_alg != WLAN_AUTH_FILS_PK) 144214501Srpaulo mlme_deletekeys_request(hapd, sta); 145337817Scy ap_sta_clear_disconnect_timeouts(hapd, sta); 146214501Srpaulo} 147214501Srpaulo 148214501Srpaulo 149214501Srpaulo/** 150214501Srpaulo * mlme_disassociate_indication - Report disassociation with a specific peer 151214501Srpaulo * MAC entity 152214501Srpaulo * @hapd: BSS data 153214501Srpaulo * @sta: Peer STA data 154214501Srpaulo * @reason_code: ReasonCode from Disassociation frame 155214501Srpaulo * 156214501Srpaulo * MLME calls this function as a result of the invalidation of an association 157214501Srpaulo * relationship with a specific peer MAC entity. 158214501Srpaulo * 159214501Srpaulo * PeerSTAAddress = sta->addr 160214501Srpaulo */ 161214501Srpaulovoid mlme_disassociate_indication(struct hostapd_data *hapd, 162214501Srpaulo struct sta_info *sta, u16 reason_code) 163214501Srpaulo{ 164214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 165214501Srpaulo HOSTAPD_LEVEL_DEBUG, 166214501Srpaulo "MLME-DISASSOCIATE.indication(" MACSTR ", %d)", 167214501Srpaulo MAC2STR(sta->addr), reason_code); 168214501Srpaulo mlme_deletekeys_request(hapd, sta); 169214501Srpaulo} 170214501Srpaulo 171214501Srpaulo 172214501Srpaulovoid mlme_michaelmicfailure_indication(struct hostapd_data *hapd, 173214501Srpaulo const u8 *addr) 174214501Srpaulo{ 175214501Srpaulo hostapd_logger(hapd, addr, HOSTAPD_MODULE_MLME, 176214501Srpaulo HOSTAPD_LEVEL_DEBUG, 177214501Srpaulo "MLME-MichaelMICFailure.indication(" MACSTR ")", 178214501Srpaulo MAC2STR(addr)); 179214501Srpaulo} 180214501Srpaulo 181214501Srpaulo 182214501Srpaulovoid mlme_deletekeys_request(struct hostapd_data *hapd, struct sta_info *sta) 183214501Srpaulo{ 184214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 185214501Srpaulo HOSTAPD_LEVEL_DEBUG, 186214501Srpaulo "MLME-DELETEKEYS.request(" MACSTR ")", 187214501Srpaulo MAC2STR(sta->addr)); 188214501Srpaulo 189214501Srpaulo if (sta->wpa_sm) 190214501Srpaulo wpa_remove_ptk(sta->wpa_sm); 191214501Srpaulo} 192