2007-08-28 14:01:53 -07:00
|
|
|
/*
|
|
|
|
* Copyright 2007 Johannes Berg <johannes@sipsolutions.net>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
|
|
* published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* mac80211 - events
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <net/iw_handler.h>
|
|
|
|
#include "ieee80211_i.h"
|
|
|
|
|
|
|
|
/*
|
2009-03-27 12:59:49 -07:00
|
|
|
* Indicate a failed Michael MIC to userspace. If the caller knows the TSC of
|
|
|
|
* the frame that generated the MIC failure (i.e., if it was provided by the
|
|
|
|
* driver or is still in the frame), it should provide that information.
|
2007-08-28 14:01:53 -07:00
|
|
|
*/
|
2008-08-02 17:04:37 -07:00
|
|
|
void mac80211_ev_michael_mic_failure(struct ieee80211_sub_if_data *sdata, int keyidx,
|
2009-03-27 12:59:49 -07:00
|
|
|
struct ieee80211_hdr *hdr, const u8 *tsc)
|
2007-08-28 14:01:53 -07:00
|
|
|
{
|
|
|
|
union iwreq_data wrqu;
|
|
|
|
char *buf = kmalloc(128, GFP_ATOMIC);
|
|
|
|
|
|
|
|
if (buf) {
|
|
|
|
/* TODO: needed parameters: count, key type, TSC */
|
|
|
|
sprintf(buf, "MLME-MICHAELMICFAILURE.indication("
|
2008-10-27 15:56:10 -07:00
|
|
|
"keyid=%d %scast addr=%pM)",
|
2007-08-28 14:01:53 -07:00
|
|
|
keyidx, hdr->addr1[0] & 0x01 ? "broad" : "uni",
|
2008-10-27 15:56:10 -07:00
|
|
|
hdr->addr2);
|
2007-08-28 14:01:53 -07:00
|
|
|
memset(&wrqu, 0, sizeof(wrqu));
|
|
|
|
wrqu.data.length = strlen(buf);
|
2008-08-02 17:04:37 -07:00
|
|
|
wireless_send_event(sdata->dev, IWEVCUSTOM, &wrqu, buf);
|
2007-08-28 14:01:53 -07:00
|
|
|
kfree(buf);
|
|
|
|
}
|
|
|
|
|
2009-03-27 12:59:49 -07:00
|
|
|
cfg80211_michael_mic_failure(sdata->dev, hdr->addr2,
|
|
|
|
(hdr->addr1[0] & 0x01) ?
|
|
|
|
NL80211_KEYTYPE_GROUP :
|
|
|
|
NL80211_KEYTYPE_PAIRWISE,
|
|
|
|
keyidx, tsc);
|
2007-08-28 14:01:53 -07:00
|
|
|
}
|