ap_mlme.c revision 214501
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 * 7214501Srpaulo * This program is free software; you can redistribute it and/or modify 8214501Srpaulo * it under the terms of the GNU General Public License version 2 as 9214501Srpaulo * published by the Free Software Foundation. 10214501Srpaulo * 11214501Srpaulo * Alternatively, this software may be distributed under the terms of BSD 12214501Srpaulo * license. 13214501Srpaulo * 14214501Srpaulo * See README and COPYING for more details. 15214501Srpaulo */ 16214501Srpaulo 17214501Srpaulo#include "utils/includes.h" 18214501Srpaulo 19214501Srpaulo#include "utils/common.h" 20214501Srpaulo#include "common/ieee802_11_defs.h" 21214501Srpaulo#include "ieee802_11.h" 22214501Srpaulo#include "wpa_auth.h" 23214501Srpaulo#include "sta_info.h" 24214501Srpaulo#include "ap_mlme.h" 25214501Srpaulo 26214501Srpaulo 27214501Srpaulo#ifndef CONFIG_NO_HOSTAPD_LOGGER 28214501Srpaulostatic const char * mlme_auth_alg_str(int alg) 29214501Srpaulo{ 30214501Srpaulo switch (alg) { 31214501Srpaulo case WLAN_AUTH_OPEN: 32214501Srpaulo return "OPEN_SYSTEM"; 33214501Srpaulo case WLAN_AUTH_SHARED_KEY: 34214501Srpaulo return "SHARED_KEY"; 35214501Srpaulo case WLAN_AUTH_FT: 36214501Srpaulo return "FT"; 37214501Srpaulo } 38214501Srpaulo 39214501Srpaulo return "unknown"; 40214501Srpaulo} 41214501Srpaulo#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 42214501Srpaulo 43214501Srpaulo 44214501Srpaulo/** 45214501Srpaulo * mlme_authenticate_indication - Report the establishment of an authentication 46214501Srpaulo * relationship with a specific peer MAC entity 47214501Srpaulo * @hapd: BSS data 48214501Srpaulo * @sta: peer STA data 49214501Srpaulo * 50214501Srpaulo * MLME calls this function as a result of the establishment of an 51214501Srpaulo * authentication relationship with a specific peer MAC entity that 52214501Srpaulo * resulted from an authentication procedure that was initiated by 53214501Srpaulo * that specific peer MAC entity. 54214501Srpaulo * 55214501Srpaulo * PeerSTAAddress = sta->addr 56214501Srpaulo * AuthenticationType = sta->auth_alg (WLAN_AUTH_OPEN / WLAN_AUTH_SHARED_KEY) 57214501Srpaulo */ 58214501Srpaulovoid mlme_authenticate_indication(struct hostapd_data *hapd, 59214501Srpaulo struct sta_info *sta) 60214501Srpaulo{ 61214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 62214501Srpaulo HOSTAPD_LEVEL_DEBUG, 63214501Srpaulo "MLME-AUTHENTICATE.indication(" MACSTR ", %s)", 64214501Srpaulo MAC2STR(sta->addr), mlme_auth_alg_str(sta->auth_alg)); 65214501Srpaulo if (sta->auth_alg != WLAN_AUTH_FT && !(sta->flags & WLAN_STA_MFP)) 66214501Srpaulo mlme_deletekeys_request(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); 89214501Srpaulo mlme_deletekeys_request(hapd, sta); 90214501Srpaulo} 91214501Srpaulo 92214501Srpaulo 93214501Srpaulo/** 94214501Srpaulo * mlme_associate_indication - Report the establishment of an association with 95214501Srpaulo * a specific peer MAC entity 96214501Srpaulo * @hapd: BSS data 97214501Srpaulo * @sta: peer STA data 98214501Srpaulo * 99214501Srpaulo * MLME calls this function as a result of the establishment of an 100214501Srpaulo * association with a specific peer MAC entity that resulted from an 101214501Srpaulo * association procedure that was initiated by that specific peer MAC entity. 102214501Srpaulo * 103214501Srpaulo * PeerSTAAddress = sta->addr 104214501Srpaulo */ 105214501Srpaulovoid mlme_associate_indication(struct hostapd_data *hapd, struct sta_info *sta) 106214501Srpaulo{ 107214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 108214501Srpaulo HOSTAPD_LEVEL_DEBUG, 109214501Srpaulo "MLME-ASSOCIATE.indication(" MACSTR ")", 110214501Srpaulo MAC2STR(sta->addr)); 111214501Srpaulo if (sta->auth_alg != WLAN_AUTH_FT) 112214501Srpaulo mlme_deletekeys_request(hapd, sta); 113214501Srpaulo} 114214501Srpaulo 115214501Srpaulo 116214501Srpaulo/** 117214501Srpaulo * mlme_reassociate_indication - Report the establishment of an reassociation 118214501Srpaulo * with a specific peer MAC entity 119214501Srpaulo * @hapd: BSS data 120214501Srpaulo * @sta: peer STA data 121214501Srpaulo * 122214501Srpaulo * MLME calls this function as a result of the establishment of an 123214501Srpaulo * reassociation with a specific peer MAC entity that resulted from a 124214501Srpaulo * reassociation procedure that was initiated by that specific peer MAC entity. 125214501Srpaulo * 126214501Srpaulo * PeerSTAAddress = sta->addr 127214501Srpaulo * 128214501Srpaulo * sta->previous_ap contains the "Current AP" information from ReassocReq. 129214501Srpaulo */ 130214501Srpaulovoid mlme_reassociate_indication(struct hostapd_data *hapd, 131214501Srpaulo struct sta_info *sta) 132214501Srpaulo{ 133214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 134214501Srpaulo HOSTAPD_LEVEL_DEBUG, 135214501Srpaulo "MLME-REASSOCIATE.indication(" MACSTR ")", 136214501Srpaulo MAC2STR(sta->addr)); 137214501Srpaulo if (sta->auth_alg != WLAN_AUTH_FT) 138214501Srpaulo mlme_deletekeys_request(hapd, sta); 139214501Srpaulo} 140214501Srpaulo 141214501Srpaulo 142214501Srpaulo/** 143214501Srpaulo * mlme_disassociate_indication - Report disassociation with a specific peer 144214501Srpaulo * MAC entity 145214501Srpaulo * @hapd: BSS data 146214501Srpaulo * @sta: Peer STA data 147214501Srpaulo * @reason_code: ReasonCode from Disassociation frame 148214501Srpaulo * 149214501Srpaulo * MLME calls this function as a result of the invalidation of an association 150214501Srpaulo * relationship with a specific peer MAC entity. 151214501Srpaulo * 152214501Srpaulo * PeerSTAAddress = sta->addr 153214501Srpaulo */ 154214501Srpaulovoid mlme_disassociate_indication(struct hostapd_data *hapd, 155214501Srpaulo struct sta_info *sta, u16 reason_code) 156214501Srpaulo{ 157214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 158214501Srpaulo HOSTAPD_LEVEL_DEBUG, 159214501Srpaulo "MLME-DISASSOCIATE.indication(" MACSTR ", %d)", 160214501Srpaulo MAC2STR(sta->addr), reason_code); 161214501Srpaulo mlme_deletekeys_request(hapd, sta); 162214501Srpaulo} 163214501Srpaulo 164214501Srpaulo 165214501Srpaulovoid mlme_michaelmicfailure_indication(struct hostapd_data *hapd, 166214501Srpaulo const u8 *addr) 167214501Srpaulo{ 168214501Srpaulo hostapd_logger(hapd, addr, HOSTAPD_MODULE_MLME, 169214501Srpaulo HOSTAPD_LEVEL_DEBUG, 170214501Srpaulo "MLME-MichaelMICFailure.indication(" MACSTR ")", 171214501Srpaulo MAC2STR(addr)); 172214501Srpaulo} 173214501Srpaulo 174214501Srpaulo 175214501Srpaulovoid mlme_deletekeys_request(struct hostapd_data *hapd, struct sta_info *sta) 176214501Srpaulo{ 177214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 178214501Srpaulo HOSTAPD_LEVEL_DEBUG, 179214501Srpaulo "MLME-DELETEKEYS.request(" MACSTR ")", 180214501Srpaulo MAC2STR(sta->addr)); 181214501Srpaulo 182214501Srpaulo if (sta->wpa_sm) 183214501Srpaulo wpa_remove_ptk(sta->wpa_sm); 184214501Srpaulo} 185