1e5b75505Sopenharmony_ci/*
2e5b75505Sopenharmony_ci * hostapd / IEEE 802.11 MLME
3e5b75505Sopenharmony_ci * Copyright 2003-2006, Jouni Malinen <j@w1.fi>
4e5b75505Sopenharmony_ci * Copyright 2003-2004, Instant802 Networks, Inc.
5e5b75505Sopenharmony_ci * Copyright 2005-2006, Devicescape Software, Inc.
6e5b75505Sopenharmony_ci *
7e5b75505Sopenharmony_ci * This software may be distributed under the terms of the BSD license.
8e5b75505Sopenharmony_ci * See README for more details.
9e5b75505Sopenharmony_ci */
10e5b75505Sopenharmony_ci
11e5b75505Sopenharmony_ci#include "utils/includes.h"
12e5b75505Sopenharmony_ci
13e5b75505Sopenharmony_ci#include "utils/common.h"
14e5b75505Sopenharmony_ci#include "common/ieee802_11_defs.h"
15e5b75505Sopenharmony_ci#include "ieee802_11.h"
16e5b75505Sopenharmony_ci#include "wpa_auth.h"
17e5b75505Sopenharmony_ci#include "sta_info.h"
18e5b75505Sopenharmony_ci#include "ap_mlme.h"
19e5b75505Sopenharmony_ci#include "hostapd.h"
20e5b75505Sopenharmony_ci
21e5b75505Sopenharmony_ci
22e5b75505Sopenharmony_ci#ifndef CONFIG_NO_HOSTAPD_LOGGER
23e5b75505Sopenharmony_cistatic const char * mlme_auth_alg_str(int alg)
24e5b75505Sopenharmony_ci{
25e5b75505Sopenharmony_ci	switch (alg) {
26e5b75505Sopenharmony_ci	case WLAN_AUTH_OPEN:
27e5b75505Sopenharmony_ci		return "OPEN_SYSTEM";
28e5b75505Sopenharmony_ci	case WLAN_AUTH_SHARED_KEY:
29e5b75505Sopenharmony_ci		return "SHARED_KEY";
30e5b75505Sopenharmony_ci	case WLAN_AUTH_FT:
31e5b75505Sopenharmony_ci		return "FT";
32e5b75505Sopenharmony_ci	}
33e5b75505Sopenharmony_ci
34e5b75505Sopenharmony_ci	return "unknown";
35e5b75505Sopenharmony_ci}
36e5b75505Sopenharmony_ci#endif /* CONFIG_NO_HOSTAPD_LOGGER */
37e5b75505Sopenharmony_ci
38e5b75505Sopenharmony_ci
39e5b75505Sopenharmony_ci/**
40e5b75505Sopenharmony_ci * mlme_authenticate_indication - Report the establishment of an authentication
41e5b75505Sopenharmony_ci * relationship with a specific peer MAC entity
42e5b75505Sopenharmony_ci * @hapd: BSS data
43e5b75505Sopenharmony_ci * @sta: peer STA data
44e5b75505Sopenharmony_ci *
45e5b75505Sopenharmony_ci * MLME calls this function as a result of the establishment of an
46e5b75505Sopenharmony_ci * authentication relationship with a specific peer MAC entity that
47e5b75505Sopenharmony_ci * resulted from an authentication procedure that was initiated by
48e5b75505Sopenharmony_ci * that specific peer MAC entity.
49e5b75505Sopenharmony_ci *
50e5b75505Sopenharmony_ci * PeerSTAAddress = sta->addr
51e5b75505Sopenharmony_ci * AuthenticationType = sta->auth_alg (WLAN_AUTH_OPEN / WLAN_AUTH_SHARED_KEY)
52e5b75505Sopenharmony_ci */
53e5b75505Sopenharmony_civoid mlme_authenticate_indication(struct hostapd_data *hapd,
54e5b75505Sopenharmony_ci				  struct sta_info *sta)
55e5b75505Sopenharmony_ci{
56e5b75505Sopenharmony_ci	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
57e5b75505Sopenharmony_ci		       HOSTAPD_LEVEL_DEBUG,
58e5b75505Sopenharmony_ci		       "MLME-AUTHENTICATE.indication(" MACSTR ", %s)",
59e5b75505Sopenharmony_ci		       MAC2STR(sta->addr), mlme_auth_alg_str(sta->auth_alg));
60e5b75505Sopenharmony_ci	if (sta->auth_alg != WLAN_AUTH_FT &&
61e5b75505Sopenharmony_ci	    sta->auth_alg != WLAN_AUTH_FILS_SK &&
62e5b75505Sopenharmony_ci	    sta->auth_alg != WLAN_AUTH_FILS_SK_PFS &&
63e5b75505Sopenharmony_ci	    sta->auth_alg != WLAN_AUTH_FILS_PK &&
64e5b75505Sopenharmony_ci	    !(sta->flags & WLAN_STA_MFP))
65e5b75505Sopenharmony_ci		mlme_deletekeys_request(hapd, sta);
66e5b75505Sopenharmony_ci	ap_sta_clear_disconnect_timeouts(hapd, sta);
67e5b75505Sopenharmony_ci}
68e5b75505Sopenharmony_ci
69e5b75505Sopenharmony_ci
70e5b75505Sopenharmony_ci/**
71e5b75505Sopenharmony_ci * mlme_deauthenticate_indication - Report the invalidation of an
72e5b75505Sopenharmony_ci * authentication relationship with a specific peer MAC entity
73e5b75505Sopenharmony_ci * @hapd: BSS data
74e5b75505Sopenharmony_ci * @sta: Peer STA data
75e5b75505Sopenharmony_ci * @reason_code: ReasonCode from Deauthentication frame
76e5b75505Sopenharmony_ci *
77e5b75505Sopenharmony_ci * MLME calls this function as a result of the invalidation of an
78e5b75505Sopenharmony_ci * authentication relationship with a specific peer MAC entity.
79e5b75505Sopenharmony_ci *
80e5b75505Sopenharmony_ci * PeerSTAAddress = sta->addr
81e5b75505Sopenharmony_ci */
82e5b75505Sopenharmony_civoid mlme_deauthenticate_indication(struct hostapd_data *hapd,
83e5b75505Sopenharmony_ci				    struct sta_info *sta, u16 reason_code)
84e5b75505Sopenharmony_ci{
85e5b75505Sopenharmony_ci	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
86e5b75505Sopenharmony_ci		       HOSTAPD_LEVEL_DEBUG,
87e5b75505Sopenharmony_ci		       "MLME-DEAUTHENTICATE.indication(" MACSTR ", %d)",
88e5b75505Sopenharmony_ci		       MAC2STR(sta->addr), reason_code);
89e5b75505Sopenharmony_ci	if (!hapd->iface->driver_ap_teardown)
90e5b75505Sopenharmony_ci		mlme_deletekeys_request(hapd, sta);
91e5b75505Sopenharmony_ci}
92e5b75505Sopenharmony_ci
93e5b75505Sopenharmony_ci
94e5b75505Sopenharmony_ci/**
95e5b75505Sopenharmony_ci * mlme_associate_indication - Report the establishment of an association with
96e5b75505Sopenharmony_ci * a specific peer MAC entity
97e5b75505Sopenharmony_ci * @hapd: BSS data
98e5b75505Sopenharmony_ci * @sta: peer STA data
99e5b75505Sopenharmony_ci *
100e5b75505Sopenharmony_ci * MLME calls this function as a result of the establishment of an
101e5b75505Sopenharmony_ci * association with a specific peer MAC entity that resulted from an
102e5b75505Sopenharmony_ci * association procedure that was initiated by that specific peer MAC entity.
103e5b75505Sopenharmony_ci *
104e5b75505Sopenharmony_ci * PeerSTAAddress = sta->addr
105e5b75505Sopenharmony_ci */
106e5b75505Sopenharmony_civoid mlme_associate_indication(struct hostapd_data *hapd, struct sta_info *sta)
107e5b75505Sopenharmony_ci{
108e5b75505Sopenharmony_ci	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
109e5b75505Sopenharmony_ci		       HOSTAPD_LEVEL_DEBUG,
110e5b75505Sopenharmony_ci		       "MLME-ASSOCIATE.indication(" MACSTR ")",
111e5b75505Sopenharmony_ci		       MAC2STR(sta->addr));
112e5b75505Sopenharmony_ci	if (sta->auth_alg != WLAN_AUTH_FT &&
113e5b75505Sopenharmony_ci	    sta->auth_alg != WLAN_AUTH_FILS_SK &&
114e5b75505Sopenharmony_ci	    sta->auth_alg != WLAN_AUTH_FILS_SK_PFS &&
115e5b75505Sopenharmony_ci	    sta->auth_alg != WLAN_AUTH_FILS_PK)
116e5b75505Sopenharmony_ci		mlme_deletekeys_request(hapd, sta);
117e5b75505Sopenharmony_ci	ap_sta_clear_disconnect_timeouts(hapd, sta);
118e5b75505Sopenharmony_ci}
119e5b75505Sopenharmony_ci
120e5b75505Sopenharmony_ci
121e5b75505Sopenharmony_ci/**
122e5b75505Sopenharmony_ci * mlme_reassociate_indication - Report the establishment of an reassociation
123e5b75505Sopenharmony_ci * with a specific peer MAC entity
124e5b75505Sopenharmony_ci * @hapd: BSS data
125e5b75505Sopenharmony_ci * @sta: peer STA data
126e5b75505Sopenharmony_ci *
127e5b75505Sopenharmony_ci * MLME calls this function as a result of the establishment of an
128e5b75505Sopenharmony_ci * reassociation with a specific peer MAC entity that resulted from a
129e5b75505Sopenharmony_ci * reassociation procedure that was initiated by that specific peer MAC entity.
130e5b75505Sopenharmony_ci *
131e5b75505Sopenharmony_ci * PeerSTAAddress = sta->addr
132e5b75505Sopenharmony_ci */
133e5b75505Sopenharmony_civoid mlme_reassociate_indication(struct hostapd_data *hapd,
134e5b75505Sopenharmony_ci				 struct sta_info *sta)
135e5b75505Sopenharmony_ci{
136e5b75505Sopenharmony_ci	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
137e5b75505Sopenharmony_ci		       HOSTAPD_LEVEL_DEBUG,
138e5b75505Sopenharmony_ci		       "MLME-REASSOCIATE.indication(" MACSTR ")",
139e5b75505Sopenharmony_ci		       MAC2STR(sta->addr));
140e5b75505Sopenharmony_ci	if (sta->auth_alg != WLAN_AUTH_FT &&
141e5b75505Sopenharmony_ci	    sta->auth_alg != WLAN_AUTH_FILS_SK &&
142e5b75505Sopenharmony_ci	    sta->auth_alg != WLAN_AUTH_FILS_SK_PFS &&
143e5b75505Sopenharmony_ci	    sta->auth_alg != WLAN_AUTH_FILS_PK)
144e5b75505Sopenharmony_ci		mlme_deletekeys_request(hapd, sta);
145e5b75505Sopenharmony_ci	ap_sta_clear_disconnect_timeouts(hapd, sta);
146e5b75505Sopenharmony_ci}
147e5b75505Sopenharmony_ci
148e5b75505Sopenharmony_ci
149e5b75505Sopenharmony_ci/**
150e5b75505Sopenharmony_ci * mlme_disassociate_indication - Report disassociation with a specific peer
151e5b75505Sopenharmony_ci * MAC entity
152e5b75505Sopenharmony_ci * @hapd: BSS data
153e5b75505Sopenharmony_ci * @sta: Peer STA data
154e5b75505Sopenharmony_ci * @reason_code: ReasonCode from Disassociation frame
155e5b75505Sopenharmony_ci *
156e5b75505Sopenharmony_ci * MLME calls this function as a result of the invalidation of an association
157e5b75505Sopenharmony_ci * relationship with a specific peer MAC entity.
158e5b75505Sopenharmony_ci *
159e5b75505Sopenharmony_ci * PeerSTAAddress = sta->addr
160e5b75505Sopenharmony_ci */
161e5b75505Sopenharmony_civoid mlme_disassociate_indication(struct hostapd_data *hapd,
162e5b75505Sopenharmony_ci				  struct sta_info *sta, u16 reason_code)
163e5b75505Sopenharmony_ci{
164e5b75505Sopenharmony_ci	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
165e5b75505Sopenharmony_ci		       HOSTAPD_LEVEL_DEBUG,
166e5b75505Sopenharmony_ci		       "MLME-DISASSOCIATE.indication(" MACSTR ", %d)",
167e5b75505Sopenharmony_ci		       MAC2STR(sta->addr), reason_code);
168e5b75505Sopenharmony_ci	mlme_deletekeys_request(hapd, sta);
169e5b75505Sopenharmony_ci}
170e5b75505Sopenharmony_ci
171e5b75505Sopenharmony_ci
172e5b75505Sopenharmony_civoid mlme_michaelmicfailure_indication(struct hostapd_data *hapd,
173e5b75505Sopenharmony_ci				       const u8 *addr)
174e5b75505Sopenharmony_ci{
175e5b75505Sopenharmony_ci	hostapd_logger(hapd, addr, HOSTAPD_MODULE_MLME,
176e5b75505Sopenharmony_ci		       HOSTAPD_LEVEL_DEBUG,
177e5b75505Sopenharmony_ci		       "MLME-MichaelMICFailure.indication(" MACSTR ")",
178e5b75505Sopenharmony_ci		       MAC2STR(addr));
179e5b75505Sopenharmony_ci}
180e5b75505Sopenharmony_ci
181e5b75505Sopenharmony_ci
182e5b75505Sopenharmony_civoid mlme_deletekeys_request(struct hostapd_data *hapd, struct sta_info *sta)
183e5b75505Sopenharmony_ci{
184e5b75505Sopenharmony_ci	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_MLME,
185e5b75505Sopenharmony_ci		       HOSTAPD_LEVEL_DEBUG,
186e5b75505Sopenharmony_ci		       "MLME-DELETEKEYS.request(" MACSTR ")",
187e5b75505Sopenharmony_ci		       MAC2STR(sta->addr));
188e5b75505Sopenharmony_ci
189e5b75505Sopenharmony_ci	if (sta->wpa_sm)
190e5b75505Sopenharmony_ci		wpa_remove_ptk(sta->wpa_sm);
191e5b75505Sopenharmony_ci}
192