aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/rx.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r--net/mac80211/rx.c41
1 files changed, 8 insertions, 33 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 08ca066246b9..5a66269d9435 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -13,7 +13,6 @@
13#include <linux/skbuff.h> 13#include <linux/skbuff.h>
14#include <linux/netdevice.h> 14#include <linux/netdevice.h>
15#include <linux/etherdevice.h> 15#include <linux/etherdevice.h>
16#include <net/iw_handler.h>
17#include <net/mac80211.h> 16#include <net/mac80211.h>
18#include <net/ieee80211_radiotap.h> 17#include <net/ieee80211_radiotap.h>
19 18
@@ -1206,20 +1205,17 @@ static void ieee80211_rx_michael_mic_report(struct net_device *dev,
1206 } 1205 }
1207 1206
1208 if ((rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV) && 1207 if ((rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV) &&
1209 rx->sdata->type == IEEE80211_IF_TYPE_AP) { 1208 rx->sdata->type == IEEE80211_IF_TYPE_AP && keyidx) {
1210 keyidx = ieee80211_wep_get_keyidx(rx->skb);
1211 /* AP with Pairwise keys support should never receive Michael 1209 /* AP with Pairwise keys support should never receive Michael
1212 * MIC errors for non-zero keyidx because these are reserved 1210 * MIC errors for non-zero keyidx because these are reserved
1213 * for group keys and only the AP is sending real multicast 1211 * for group keys and only the AP is sending real multicast
1214 * frames in BSS. */ 1212 * frames in BSS. */
1215 if (keyidx) { 1213 if (net_ratelimit())
1216 if (net_ratelimit()) 1214 printk(KERN_DEBUG "%s: ignored Michael MIC error for "
1217 printk(KERN_DEBUG "%s: ignored Michael MIC " 1215 "a frame with non-zero keyidx (%d)"
1218 "error for a frame with non-zero keyidx" 1216 " (src " MAC_FMT ")\n", dev->name, keyidx,
1219 " (%d) (src " MAC_FMT ")\n", dev->name, 1217 MAC_ARG(hdr->addr2));
1220 keyidx, MAC_ARG(hdr->addr2)); 1218 goto ignore;
1221 goto ignore;
1222 }
1223 } 1219 }
1224 1220
1225 if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA && 1221 if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA &&
@@ -1233,32 +1229,11 @@ static void ieee80211_rx_michael_mic_report(struct net_device *dev,
1233 goto ignore; 1229 goto ignore;
1234 } 1230 }
1235 1231
1236 do {
1237 union iwreq_data wrqu;
1238 char *buf = kmalloc(128, GFP_ATOMIC);
1239 if (!buf)
1240 break;
1241
1242 /* TODO: needed parameters: count, key type, TSC */
1243 sprintf(buf, "MLME-MICHAELMICFAILURE.indication("
1244 "keyid=%d %scast addr=" MAC_FMT ")",
1245 keyidx, hdr->addr1[0] & 0x01 ? "broad" : "uni",
1246 MAC_ARG(hdr->addr2));
1247 memset(&wrqu, 0, sizeof(wrqu));
1248 wrqu.data.length = strlen(buf);
1249 wireless_send_event(rx->dev, IWEVCUSTOM, &wrqu, buf);
1250 kfree(buf);
1251 } while (0);
1252
1253 /* TODO: consider verifying the MIC error report with software 1232 /* TODO: consider verifying the MIC error report with software
1254 * implementation if we get too many spurious reports from the 1233 * implementation if we get too many spurious reports from the
1255 * hardware. */ 1234 * hardware. */
1256 if (!rx->local->apdev)
1257 goto ignore;
1258 ieee80211_rx_mgmt(rx->local, rx->skb, rx->u.rx.status,
1259 ieee80211_msg_michael_mic_failure);
1260 return;
1261 1235
1236 mac80211_ev_michael_mic_failure(rx->dev, keyidx, hdr);
1262 ignore: 1237 ignore:
1263 dev_kfree_skb(rx->skb); 1238 dev_kfree_skb(rx->skb);
1264 rx->skb = NULL; 1239 rx->skb = NULL;