ap_mlme.c revision 337817
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)); 60214501Srpaulo if (sta->auth_alg != WLAN_AUTH_FT && !(sta->flags & WLAN_STA_MFP)) 61214501Srpaulo mlme_deletekeys_request(hapd, sta); 62337817Scy ap_sta_clear_disconnect_timeouts(hapd, sta); 63214501Srpaulo} 64214501Srpaulo 65214501Srpaulo 66214501Srpaulo/** 67214501Srpaulo * mlme_deauthenticate_indication - Report the invalidation of an 68214501Srpaulo * authentication relationship with a specific peer MAC entity 69214501Srpaulo * @hapd: BSS data 70214501Srpaulo * @sta: Peer STA data 71214501Srpaulo * @reason_code: ReasonCode from Deauthentication frame 72214501Srpaulo * 73214501Srpaulo * MLME calls this function as a result of the invalidation of an 74214501Srpaulo * authentication relationship with a specific peer MAC entity. 75214501Srpaulo * 76214501Srpaulo * PeerSTAAddress = sta->addr 77214501Srpaulo */ 78214501Srpaulovoid mlme_deauthenticate_indication(struct hostapd_data *hapd, 79214501Srpaulo struct sta_info *sta, u16 reason_code) 80214501Srpaulo{ 81214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 82214501Srpaulo HOSTAPD_LEVEL_DEBUG, 83214501Srpaulo "MLME-DEAUTHENTICATE.indication(" MACSTR ", %d)", 84214501Srpaulo MAC2STR(sta->addr), reason_code); 85281806Srpaulo if (!hapd->iface->driver_ap_teardown) 86281806Srpaulo mlme_deletekeys_request(hapd, sta); 87214501Srpaulo} 88214501Srpaulo 89214501Srpaulo 90214501Srpaulo/** 91214501Srpaulo * mlme_associate_indication - Report the establishment of an association with 92214501Srpaulo * a specific peer MAC entity 93214501Srpaulo * @hapd: BSS data 94214501Srpaulo * @sta: peer STA data 95214501Srpaulo * 96214501Srpaulo * MLME calls this function as a result of the establishment of an 97214501Srpaulo * association with a specific peer MAC entity that resulted from an 98214501Srpaulo * association procedure that was initiated by that specific peer MAC entity. 99214501Srpaulo * 100214501Srpaulo * PeerSTAAddress = sta->addr 101214501Srpaulo */ 102214501Srpaulovoid mlme_associate_indication(struct hostapd_data *hapd, struct sta_info *sta) 103214501Srpaulo{ 104214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 105214501Srpaulo HOSTAPD_LEVEL_DEBUG, 106214501Srpaulo "MLME-ASSOCIATE.indication(" MACSTR ")", 107214501Srpaulo MAC2STR(sta->addr)); 108214501Srpaulo if (sta->auth_alg != WLAN_AUTH_FT) 109214501Srpaulo mlme_deletekeys_request(hapd, sta); 110337817Scy ap_sta_clear_disconnect_timeouts(hapd, sta); 111214501Srpaulo} 112214501Srpaulo 113214501Srpaulo 114214501Srpaulo/** 115214501Srpaulo * mlme_reassociate_indication - Report the establishment of an reassociation 116214501Srpaulo * with a specific peer MAC entity 117214501Srpaulo * @hapd: BSS data 118214501Srpaulo * @sta: peer STA data 119214501Srpaulo * 120214501Srpaulo * MLME calls this function as a result of the establishment of an 121214501Srpaulo * reassociation with a specific peer MAC entity that resulted from a 122214501Srpaulo * reassociation procedure that was initiated by that specific peer MAC entity. 123214501Srpaulo * 124214501Srpaulo * PeerSTAAddress = sta->addr 125214501Srpaulo */ 126214501Srpaulovoid mlme_reassociate_indication(struct hostapd_data *hapd, 127214501Srpaulo struct sta_info *sta) 128214501Srpaulo{ 129214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 130214501Srpaulo HOSTAPD_LEVEL_DEBUG, 131214501Srpaulo "MLME-REASSOCIATE.indication(" MACSTR ")", 132214501Srpaulo MAC2STR(sta->addr)); 133214501Srpaulo if (sta->auth_alg != WLAN_AUTH_FT) 134214501Srpaulo mlme_deletekeys_request(hapd, sta); 135337817Scy ap_sta_clear_disconnect_timeouts(hapd, sta); 136214501Srpaulo} 137214501Srpaulo 138214501Srpaulo 139214501Srpaulo/** 140214501Srpaulo * mlme_disassociate_indication - Report disassociation with a specific peer 141214501Srpaulo * MAC entity 142214501Srpaulo * @hapd: BSS data 143214501Srpaulo * @sta: Peer STA data 144214501Srpaulo * @reason_code: ReasonCode from Disassociation frame 145214501Srpaulo * 146214501Srpaulo * MLME calls this function as a result of the invalidation of an association 147214501Srpaulo * relationship with a specific peer MAC entity. 148214501Srpaulo * 149214501Srpaulo * PeerSTAAddress = sta->addr 150214501Srpaulo */ 151214501Srpaulovoid mlme_disassociate_indication(struct hostapd_data *hapd, 152214501Srpaulo struct sta_info *sta, u16 reason_code) 153214501Srpaulo{ 154214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 155214501Srpaulo HOSTAPD_LEVEL_DEBUG, 156214501Srpaulo "MLME-DISASSOCIATE.indication(" MACSTR ", %d)", 157214501Srpaulo MAC2STR(sta->addr), reason_code); 158214501Srpaulo mlme_deletekeys_request(hapd, sta); 159214501Srpaulo} 160214501Srpaulo 161214501Srpaulo 162214501Srpaulovoid mlme_michaelmicfailure_indication(struct hostapd_data *hapd, 163214501Srpaulo const u8 *addr) 164214501Srpaulo{ 165214501Srpaulo hostapd_logger(hapd, addr, HOSTAPD_MODULE_MLME, 166214501Srpaulo HOSTAPD_LEVEL_DEBUG, 167214501Srpaulo "MLME-MichaelMICFailure.indication(" MACSTR ")", 168214501Srpaulo MAC2STR(addr)); 169214501Srpaulo} 170214501Srpaulo 171214501Srpaulo 172214501Srpaulovoid mlme_deletekeys_request(struct hostapd_data *hapd, struct sta_info *sta) 173214501Srpaulo{ 174214501Srpaulo hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 175214501Srpaulo HOSTAPD_LEVEL_DEBUG, 176214501Srpaulo "MLME-DELETEKEYS.request(" MACSTR ")", 177214501Srpaulo MAC2STR(sta->addr)); 178214501Srpaulo 179214501Srpaulo if (sta->wpa_sm) 180214501Srpaulo wpa_remove_ptk(sta->wpa_sm); 181214501Srpaulo} 182