ap_mlme.c revision a38abf9af7bec7e89dbfb39ac7bb77223fe47c72
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * hostapd / IEEE 802.11 MLME 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2003-2006, Jouni Malinen <j@w1.fi> 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2003-2004, Instant802 Networks, Inc. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2005-2006, Devicescape Software, Inc. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This software may be distributed under the terms of the BSD license. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See README for more details. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "utils/includes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "utils/common.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "common/ieee802_11_defs.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ieee802_11.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "wpa_auth.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sta_info.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ap_mlme.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "hostapd.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#ifndef CONFIG_NO_HOSTAPD_LOGGER 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const char * mlme_auth_alg_str(int alg) 240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles){ 250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) switch (alg) { 260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) case WLAN_AUTH_OPEN: 270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return "OPEN_SYSTEM"; 280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) case WLAN_AUTH_SHARED_KEY: 29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return "SHARED_KEY"; 30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case WLAN_AUTH_FT: 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "FT"; 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "unknown"; 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* CONFIG_NO_HOSTAPD_LOGGER */ 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * mlme_authenticate_indication - Report the establishment of an authentication 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * relationship with a specific peer MAC entity 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @hapd: BSS data 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @sta: peer STA data 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MLME calls this function as a result of the establishment of an 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * authentication relationship with a specific peer MAC entity that 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * resulted from an authentication procedure that was initiated by 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that specific peer MAC entity. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * PeerSTAAddress = sta->addr 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * AuthenticationType = sta->auth_alg (WLAN_AUTH_OPEN / WLAN_AUTH_SHARED_KEY) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid mlme_authenticate_indication(struct hostapd_data *hapd, 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch struct sta_info *sta) 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch{ 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HOSTAPD_LEVEL_DEBUG, 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "MLME-AUTHENTICATE.indication(" MACSTR ", %s)", 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MAC2STR(sta->addr), mlme_auth_alg_str(sta->auth_alg)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sta->auth_alg != WLAN_AUTH_FT && !(sta->flags & WLAN_STA_MFP)) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mlme_deletekeys_request(hapd, sta); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/** 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * mlme_deauthenticate_indication - Report the invalidation of an 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * authentication relationship with a specific peer MAC entity 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @hapd: BSS data 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @sta: Peer STA data 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @reason_code: ReasonCode from Deauthentication frame 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MLME calls this function as a result of the invalidation of an 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * authentication relationship with a specific peer MAC entity. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PeerSTAAddress = sta->addr 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void mlme_deauthenticate_indication(struct hostapd_data *hapd, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct sta_info *sta, u16 reason_code) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HOSTAPD_LEVEL_DEBUG, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "MLME-DEAUTHENTICATE.indication(" MACSTR ", %d)", 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MAC2STR(sta->addr), reason_code); 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!hapd->iface->driver_ap_teardown) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mlme_deletekeys_request(hapd, sta); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * mlme_associate_indication - Report the establishment of an association with 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a specific peer MAC entity 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @hapd: BSS data 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sta: peer STA data 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MLME calls this function as a result of the establishment of an 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * association with a specific peer MAC entity that resulted from an 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * association procedure that was initiated by that specific peer MAC entity. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PeerSTAAddress = sta->addr 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void mlme_associate_indication(struct hostapd_data *hapd, struct sta_info *sta) 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HOSTAPD_LEVEL_DEBUG, 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "MLME-ASSOCIATE.indication(" MACSTR ")", 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MAC2STR(sta->addr)); 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (sta->auth_alg != WLAN_AUTH_FT) 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu mlme_deletekeys_request(hapd, sta); 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu/** 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * mlme_reassociate_indication - Report the establishment of an reassociation 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * with a specific peer MAC entity 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @hapd: BSS data 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @sta: peer STA data 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * MLME calls this function as a result of the establishment of an 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * reassociation with a specific peer MAC entity that resulted from a 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * reassociation procedure that was initiated by that specific peer MAC entity. 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * PeerSTAAddress = sta->addr 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * sta->previous_ap contains the "Current AP" information from ReassocReq. 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu */ 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid mlme_reassociate_indication(struct hostapd_data *hapd, 1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu struct sta_info *sta) 1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu{ 1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) HOSTAPD_LEVEL_DEBUG, 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "MLME-REASSOCIATE.indication(" MACSTR ")", 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MAC2STR(sta->addr)); 1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (sta->auth_alg != WLAN_AUTH_FT) 1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu mlme_deletekeys_request(hapd, sta); 1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu/** 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * mlme_disassociate_indication - Report disassociation with a specific peer 1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * MAC entity 1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @hapd: BSS data 1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @sta: Peer STA data 1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @reason_code: ReasonCode from Disassociation frame 1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * 1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * MLME calls this function as a result of the invalidation of an association 1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * relationship with a specific peer MAC entity. 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * 1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * PeerSTAAddress = sta->addr 1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu */ 1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid mlme_disassociate_indication(struct hostapd_data *hapd, 1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu struct sta_info *sta, u16 reason_code) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HOSTAPD_LEVEL_DEBUG, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "MLME-DISASSOCIATE.indication(" MACSTR ", %d)", 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAC2STR(sta->addr), reason_code); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mlme_deletekeys_request(hapd, sta); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void mlme_michaelmicfailure_indication(struct hostapd_data *hapd, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const u8 *addr) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) hostapd_logger(hapd, addr, HOSTAPD_MODULE_MLME, 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) HOSTAPD_LEVEL_DEBUG, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "MLME-MichaelMICFailure.indication(" MACSTR ")", 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MAC2STR(addr)); 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void mlme_deletekeys_request(struct hostapd_data *hapd, struct sta_info *sta) 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME, 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) HOSTAPD_LEVEL_DEBUG, 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "MLME-DELETEKEYS.request(" MACSTR ")", 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MAC2STR(sta->addr)); 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (sta->wpa_sm) 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wpa_remove_ptk(sta->wpa_sm); 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)