18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hostapd / IEEE 802.11 MLME 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright 2003-2006, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright 2003-2004, Instant802 Networks, Inc. 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright 2005-2006, Devicescape Software, Inc. 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 7c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 8c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/includes.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ieee802_11.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpa_auth.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "sta_info.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ap_mlme.h" 19a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt#include "hostapd.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_HOSTAPD_LOGGER 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char * mlme_auth_alg_str(int alg) 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (alg) { 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_AUTH_OPEN: 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return "OPEN_SYSTEM"; 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_AUTH_SHARED_KEY: 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return "SHARED_KEY"; 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case WLAN_AUTH_FT: 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return "FT"; 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return "unknown"; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * mlme_authenticate_indication - Report the establishment of an authentication 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * relationship with a specific peer MAC entity 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @hapd: BSS data 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sta: peer STA data 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * MLME calls this function as a result of the establishment of an 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * authentication relationship with a specific peer MAC entity that 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * resulted from an authentication procedure that was initiated by 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * that specific peer MAC entity. 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * PeerSTAAddress = sta->addr 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * AuthenticationType = sta->auth_alg (WLAN_AUTH_OPEN / WLAN_AUTH_SHARED_KEY) 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid mlme_authenticate_indication(struct hostapd_data *hapd, 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sta_info *sta) 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_DEBUG, 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "MLME-AUTHENTICATE.indication(" MACSTR ", %s)", 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(sta->addr), mlme_auth_alg_str(sta->auth_alg)); 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sta->auth_alg != WLAN_AUTH_FT && !(sta->flags & WLAN_STA_MFP)) 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mlme_deletekeys_request(hapd, sta); 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * mlme_deauthenticate_indication - Report the invalidation of an 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * authentication relationship with a specific peer MAC entity 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @hapd: BSS data 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sta: Peer STA data 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @reason_code: ReasonCode from Deauthentication frame 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * MLME calls this function as a result of the invalidation of an 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * authentication relationship with a specific peer MAC entity. 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * PeerSTAAddress = sta->addr 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid mlme_deauthenticate_indication(struct hostapd_data *hapd, 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sta_info *sta, u16 reason_code) 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_DEBUG, 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "MLME-DEAUTHENTICATE.indication(" MACSTR ", %d)", 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(sta->addr), reason_code); 84a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt if (!hapd->iface->driver_ap_teardown) 85a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt mlme_deletekeys_request(hapd, sta); 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * mlme_associate_indication - Report the establishment of an association with 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * a specific peer MAC entity 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @hapd: BSS data 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sta: peer STA data 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * MLME calls this function as a result of the establishment of an 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * association with a specific peer MAC entity that resulted from an 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * association procedure that was initiated by that specific peer MAC entity. 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * PeerSTAAddress = sta->addr 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid mlme_associate_indication(struct hostapd_data *hapd, struct sta_info *sta) 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_DEBUG, 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "MLME-ASSOCIATE.indication(" MACSTR ")", 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(sta->addr)); 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sta->auth_alg != WLAN_AUTH_FT) 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mlme_deletekeys_request(hapd, sta); 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * mlme_reassociate_indication - Report the establishment of an reassociation 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with a specific peer MAC entity 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @hapd: BSS data 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sta: peer STA data 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * MLME calls this function as a result of the establishment of an 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * reassociation with a specific peer MAC entity that resulted from a 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * reassociation procedure that was initiated by that specific peer MAC entity. 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * PeerSTAAddress = sta->addr 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid mlme_reassociate_indication(struct hostapd_data *hapd, 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sta_info *sta) 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_DEBUG, 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "MLME-REASSOCIATE.indication(" MACSTR ")", 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(sta->addr)); 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sta->auth_alg != WLAN_AUTH_FT) 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mlme_deletekeys_request(hapd, sta); 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * mlme_disassociate_indication - Report disassociation with a specific peer 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * MAC entity 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @hapd: BSS data 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sta: Peer STA data 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @reason_code: ReasonCode from Disassociation frame 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * MLME calls this function as a result of the invalidation of an association 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * relationship with a specific peer MAC entity. 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * PeerSTAAddress = sta->addr 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid mlme_disassociate_indication(struct hostapd_data *hapd, 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sta_info *sta, u16 reason_code) 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_DEBUG, 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "MLME-DISASSOCIATE.indication(" MACSTR ", %d)", 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(sta->addr), reason_code); 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mlme_deletekeys_request(hapd, sta); 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid mlme_michaelmicfailure_indication(struct hostapd_data *hapd, 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *addr) 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_logger(hapd, addr, HOSTAPD_MODULE_MLME, 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_DEBUG, 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "MLME-MichaelMICFailure.indication(" MACSTR ")", 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(addr)); 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid mlme_deletekeys_request(struct hostapd_data *hapd, struct sta_info *sta) 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HOSTAPD_LEVEL_DEBUG, 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "MLME-DELETEKEYS.request(" MACSTR ")", 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(sta->addr)); 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sta->wpa_sm) 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_remove_ptk(sta->wpa_sm); 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 179