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