2 * hostapd / TKIP countermeasures
3 * Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
15 #include "utils/includes.h"
17 #include "utils/common.h"
18 #include "utils/eloop.h"
19 #include "common/ieee802_11_defs.h"
24 #include "tkip_countermeasures.h"
27 static void ieee80211_tkip_countermeasures_stop(void *eloop_ctx
,
30 struct hostapd_data
*hapd
= eloop_ctx
;
31 hapd
->tkip_countermeasures
= 0;
32 hapd
->drv
.set_countermeasures(hapd
, 0);
33 hostapd_logger(hapd
, NULL
, HOSTAPD_MODULE_IEEE80211
,
34 HOSTAPD_LEVEL_INFO
, "TKIP countermeasures ended");
38 static void ieee80211_tkip_countermeasures_start(struct hostapd_data
*hapd
)
42 hostapd_logger(hapd
, NULL
, HOSTAPD_MODULE_IEEE80211
,
43 HOSTAPD_LEVEL_INFO
, "TKIP countermeasures initiated");
45 wpa_auth_countermeasures_start(hapd
->wpa_auth
);
46 hapd
->tkip_countermeasures
= 1;
47 hapd
->drv
.set_countermeasures(hapd
, 1);
48 wpa_gtk_rekey(hapd
->wpa_auth
);
49 eloop_cancel_timeout(ieee80211_tkip_countermeasures_stop
, hapd
, NULL
);
50 eloop_register_timeout(60, 0, ieee80211_tkip_countermeasures_stop
,
52 for (sta
= hapd
->sta_list
; sta
!= NULL
; sta
= sta
->next
) {
53 hapd
->drv
.sta_deauth(hapd
, sta
->addr
,
54 WLAN_REASON_MICHAEL_MIC_FAILURE
);
55 sta
->flags
&= ~(WLAN_STA_AUTH
| WLAN_STA_ASSOC
|
57 hapd
->drv
.sta_remove(hapd
, sta
->addr
);
62 void michael_mic_failure(struct hostapd_data
*hapd
, const u8
*addr
, int local
)
67 struct sta_info
*sta
= ap_get_sta(hapd
, addr
);
69 wpa_auth_sta_local_mic_failure_report(sta
->wpa_sm
);
70 hostapd_logger(hapd
, addr
, HOSTAPD_MODULE_IEEE80211
,
72 "Michael MIC failure detected in "
74 mlme_michaelmicfailure_indication(hapd
, addr
);
77 "MLME-MICHAELMICFAILURE.indication "
78 "for not associated STA (" MACSTR
79 ") ignored", MAC2STR(addr
));
85 if (now
> hapd
->michael_mic_failure
+ 60) {
86 hapd
->michael_mic_failures
= 1;
88 hapd
->michael_mic_failures
++;
89 if (hapd
->michael_mic_failures
> 1)
90 ieee80211_tkip_countermeasures_start(hapd
);
92 hapd
->michael_mic_failure
= now
;