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)