| Johannes Berg | eb063c1 | 2007-08-28 17:01:53 -0400 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright 2007	Johannes Berg <johannes@sipsolutions.net> | 
 | 3 |  * | 
 | 4 |  * This program is free software; you can redistribute it and/or modify | 
 | 5 |  * it under the terms of the GNU General Public License version 2 as | 
 | 6 |  * published by the Free Software Foundation. | 
 | 7 |  * | 
 | 8 |  * mac80211 - events | 
 | 9 |  */ | 
 | 10 |  | 
| Johannes Berg | eb063c1 | 2007-08-28 17:01:53 -0400 | [diff] [blame] | 11 | #include <net/iw_handler.h> | 
 | 12 | #include "ieee80211_i.h" | 
 | 13 |  | 
 | 14 | /* | 
| Jouni Malinen | a3b8b05 | 2009-03-27 21:59:49 +0200 | [diff] [blame] | 15 |  * Indicate a failed Michael MIC to userspace. If the caller knows the TSC of | 
 | 16 |  * the frame that generated the MIC failure (i.e., if it was provided by the | 
 | 17 |  * driver or is still in the frame), it should provide that information. | 
| Johannes Berg | eb063c1 | 2007-08-28 17:01:53 -0400 | [diff] [blame] | 18 |  */ | 
| Jasper Bryant-Greene | f698d85 | 2008-08-03 12:04:37 +1200 | [diff] [blame] | 19 | void mac80211_ev_michael_mic_failure(struct ieee80211_sub_if_data *sdata, int keyidx, | 
| Jouni Malinen | a3b8b05 | 2009-03-27 21:59:49 +0200 | [diff] [blame] | 20 | 				     struct ieee80211_hdr *hdr, const u8 *tsc) | 
| Johannes Berg | eb063c1 | 2007-08-28 17:01:53 -0400 | [diff] [blame] | 21 | { | 
 | 22 | 	union iwreq_data wrqu; | 
 | 23 | 	char *buf = kmalloc(128, GFP_ATOMIC); | 
 | 24 |  | 
 | 25 | 	if (buf) { | 
 | 26 | 		/* TODO: needed parameters: count, key type, TSC */ | 
 | 27 | 		sprintf(buf, "MLME-MICHAELMICFAILURE.indication(" | 
| Johannes Berg | 0c68ae26 | 2008-10-27 15:56:10 -0700 | [diff] [blame] | 28 | 			"keyid=%d %scast addr=%pM)", | 
| Johannes Berg | eb063c1 | 2007-08-28 17:01:53 -0400 | [diff] [blame] | 29 | 			keyidx, hdr->addr1[0] & 0x01 ? "broad" : "uni", | 
| Johannes Berg | 0c68ae26 | 2008-10-27 15:56:10 -0700 | [diff] [blame] | 30 | 			hdr->addr2); | 
| Johannes Berg | eb063c1 | 2007-08-28 17:01:53 -0400 | [diff] [blame] | 31 | 		memset(&wrqu, 0, sizeof(wrqu)); | 
 | 32 | 		wrqu.data.length = strlen(buf); | 
| Jasper Bryant-Greene | f698d85 | 2008-08-03 12:04:37 +1200 | [diff] [blame] | 33 | 		wireless_send_event(sdata->dev, IWEVCUSTOM, &wrqu, buf); | 
| Johannes Berg | eb063c1 | 2007-08-28 17:01:53 -0400 | [diff] [blame] | 34 | 		kfree(buf); | 
 | 35 | 	} | 
 | 36 |  | 
| Jouni Malinen | a3b8b05 | 2009-03-27 21:59:49 +0200 | [diff] [blame] | 37 | 	cfg80211_michael_mic_failure(sdata->dev, hdr->addr2, | 
 | 38 | 				     (hdr->addr1[0] & 0x01) ? | 
 | 39 | 				     NL80211_KEYTYPE_GROUP : | 
 | 40 | 				     NL80211_KEYTYPE_PAIRWISE, | 
 | 41 | 				     keyidx, tsc); | 
| Johannes Berg | eb063c1 | 2007-08-28 17:01:53 -0400 | [diff] [blame] | 42 | } |