ap_mlme.c revision 252726
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" 19214501Srpaulo 20214501Srpaulo 21214501Srpaulo#ifndef CONFIG_NO_HOSTAPD_LOGGER 22214501Srpaulostatic const char * mlme_auth_alg_str(int alg) 23214501Srpaulo{ 24214501Srpaulo switch (alg) { 25214501Srpaulo case WLAN_AUTH_OPEN: 26214501Srpaulo return "OPEN_SYSTEM"; 27214501Srpaulo case WLAN_AUTH_SHARED_KEY: 28214501Srpaulo return "SHARED_KEY"; 29214501Srpaulo case WLAN_AUTH_FT: 30214501Srpaulo return "FT"; 31214501Srpaulo } 32214501Srpaulo 33214501Srpaulo return "unknown"; 34214501Srpaulo} 35214501Srpaulo#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 36214501Srpaulo 37214501Srpaulo 38214501Srpaulo/** 39214501Srpaulo * mlme_authenticate_indication - Report the establishment of an authentication 40214501Srpaulo * relationship with a specific peer MAC entity 41214501Srpaulo * @hapd: BSS data 42214501Srpaulo * @sta: peer STA data 43214501Srpaulo * 44214501Srpaulo * MLME calls this function as a result of the establishment of an 45214501Srpaulo * authentication relationship with a specific peer MAC entity that 46214501Srpaulo * resulted from an authentication procedure that was initiated by 47214501Srpaulo * that specific peer MAC entity. 48214501Srpaulo * 49214501Srpaulo * PeerSTAAddress = sta->addr 50214501Srpaulo * AuthenticationType = sta->auth_alg (WLAN_AUTH_OPEN / WLAN_AUTH_SHARED_KEY) 51214501Srpaulo */ 52214501Srpaulovoid mlme_authenticate_indication(struct hostapd_data *hapd, 53214501Srpaulo struct sta_info *sta) 54214501Srpaulo{ 55214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 56214501Srpaulo HOSTAPD_LEVEL_DEBUG, 57214501Srpaulo "MLME-AUTHENTICATE.indication(" MACSTR ", %s)", 58214501Srpaulo MAC2STR(sta->addr), mlme_auth_alg_str(sta->auth_alg)); 59214501Srpaulo if (sta->auth_alg != WLAN_AUTH_FT && !(sta->flags & WLAN_STA_MFP)) 60214501Srpaulo mlme_deletekeys_request(hapd, sta); 61214501Srpaulo} 62214501Srpaulo 63214501Srpaulo 64214501Srpaulo/** 65214501Srpaulo * mlme_deauthenticate_indication - Report the invalidation of an 66214501Srpaulo * authentication relationship with a specific peer MAC entity 67214501Srpaulo * @hapd: BSS data 68214501Srpaulo * @sta: Peer STA data 69214501Srpaulo * @reason_code: ReasonCode from Deauthentication frame 70214501Srpaulo * 71214501Srpaulo * MLME calls this function as a result of the invalidation of an 72214501Srpaulo * authentication relationship with a specific peer MAC entity. 73214501Srpaulo * 74214501Srpaulo * PeerSTAAddress = sta->addr 75214501Srpaulo */ 76214501Srpaulovoid mlme_deauthenticate_indication(struct hostapd_data *hapd, 77214501Srpaulo struct sta_info *sta, u16 reason_code) 78214501Srpaulo{ 79214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 80214501Srpaulo HOSTAPD_LEVEL_DEBUG, 81214501Srpaulo "MLME-DEAUTHENTICATE.indication(" MACSTR ", %d)", 82214501Srpaulo MAC2STR(sta->addr), reason_code); 83214501Srpaulo mlme_deletekeys_request(hapd, sta); 84214501Srpaulo} 85214501Srpaulo 86214501Srpaulo 87214501Srpaulo/** 88214501Srpaulo * mlme_associate_indication - Report the establishment of an association with 89214501Srpaulo * a specific peer MAC entity 90214501Srpaulo * @hapd: BSS data 91214501Srpaulo * @sta: peer STA data 92214501Srpaulo * 93214501Srpaulo * MLME calls this function as a result of the establishment of an 94214501Srpaulo * association with a specific peer MAC entity that resulted from an 95214501Srpaulo * association procedure that was initiated by that specific peer MAC entity. 96214501Srpaulo * 97214501Srpaulo * PeerSTAAddress = sta->addr 98214501Srpaulo */ 99214501Srpaulovoid mlme_associate_indication(struct hostapd_data *hapd, struct sta_info *sta) 100214501Srpaulo{ 101214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 102214501Srpaulo HOSTAPD_LEVEL_DEBUG, 103214501Srpaulo "MLME-ASSOCIATE.indication(" MACSTR ")", 104214501Srpaulo MAC2STR(sta->addr)); 105214501Srpaulo if (sta->auth_alg != WLAN_AUTH_FT) 106214501Srpaulo mlme_deletekeys_request(hapd, sta); 107214501Srpaulo} 108214501Srpaulo 109214501Srpaulo 110214501Srpaulo/** 111214501Srpaulo * mlme_reassociate_indication - Report the establishment of an reassociation 112214501Srpaulo * with a specific peer MAC entity 113214501Srpaulo * @hapd: BSS data 114214501Srpaulo * @sta: peer STA data 115214501Srpaulo * 116214501Srpaulo * MLME calls this function as a result of the establishment of an 117214501Srpaulo * reassociation with a specific peer MAC entity that resulted from a 118214501Srpaulo * reassociation procedure that was initiated by that specific peer MAC entity. 119214501Srpaulo * 120214501Srpaulo * PeerSTAAddress = sta->addr 121214501Srpaulo * 122214501Srpaulo * sta->previous_ap contains the "Current AP" information from ReassocReq. 123214501Srpaulo */ 124214501Srpaulovoid mlme_reassociate_indication(struct hostapd_data *hapd, 125214501Srpaulo struct sta_info *sta) 126214501Srpaulo{ 127214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 128214501Srpaulo HOSTAPD_LEVEL_DEBUG, 129214501Srpaulo "MLME-REASSOCIATE.indication(" MACSTR ")", 130214501Srpaulo MAC2STR(sta->addr)); 131214501Srpaulo if (sta->auth_alg != WLAN_AUTH_FT) 132214501Srpaulo mlme_deletekeys_request(hapd, sta); 133214501Srpaulo} 134214501Srpaulo 135214501Srpaulo 136214501Srpaulo/** 137214501Srpaulo * mlme_disassociate_indication - Report disassociation with a specific peer 138214501Srpaulo * MAC entity 139214501Srpaulo * @hapd: BSS data 140214501Srpaulo * @sta: Peer STA data 141214501Srpaulo * @reason_code: ReasonCode from Disassociation frame 142214501Srpaulo * 143214501Srpaulo * MLME calls this function as a result of the invalidation of an association 144214501Srpaulo * relationship with a specific peer MAC entity. 145214501Srpaulo * 146214501Srpaulo * PeerSTAAddress = sta->addr 147214501Srpaulo */ 148214501Srpaulovoid mlme_disassociate_indication(struct hostapd_data *hapd, 149214501Srpaulo struct sta_info *sta, u16 reason_code) 150214501Srpaulo{ 151214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 152214501Srpaulo HOSTAPD_LEVEL_DEBUG, 153214501Srpaulo "MLME-DISASSOCIATE.indication(" MACSTR ", %d)", 154214501Srpaulo MAC2STR(sta->addr), reason_code); 155214501Srpaulo mlme_deletekeys_request(hapd, sta); 156214501Srpaulo} 157214501Srpaulo 158214501Srpaulo 159214501Srpaulovoid mlme_michaelmicfailure_indication(struct hostapd_data *hapd, 160214501Srpaulo const u8 *addr) 161214501Srpaulo{ 162214501Srpaulo hostapd_logger(hapd, addr, HOSTAPD_MODULE_MLME, 163214501Srpaulo HOSTAPD_LEVEL_DEBUG, 164214501Srpaulo "MLME-MichaelMICFailure.indication(" MACSTR ")", 165214501Srpaulo MAC2STR(addr)); 166214501Srpaulo} 167214501Srpaulo 168214501Srpaulo 169214501Srpaulovoid mlme_deletekeys_request(struct hostapd_data *hapd, struct sta_info *sta) 170214501Srpaulo{ 171214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 172214501Srpaulo HOSTAPD_LEVEL_DEBUG, 173214501Srpaulo "MLME-DELETEKEYS.request(" MACSTR ")", 174214501Srpaulo MAC2STR(sta->addr)); 175214501Srpaulo 176214501Srpaulo if (sta->wpa_sm) 177214501Srpaulo wpa_remove_ptk(sta->wpa_sm); 178214501Srpaulo} 179