Skip to content

Commit

Permalink
mac80211: add debug file for mic failure
Browse files Browse the repository at this point in the history
The mic failure count provides the number of mic failures that
have happened on a given key (without a countermeasure being
started, since that would remove the key).

Signed-off-by: Saravana <saravanad@posedge.com>
[fix NULL pointer issues]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Saravana authored and Johannes Berg committed Dec 5, 2012
1 parent a6662db commit b98ea05
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
17 changes: 17 additions & 0 deletions net/mac80211/debugfs_key.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,22 @@ static ssize_t key_icverrors_read(struct file *file, char __user *userbuf,
}
KEY_OPS(icverrors);

static ssize_t key_mic_failures_read(struct file *file, char __user *userbuf,
size_t count, loff_t *ppos)
{
struct ieee80211_key *key = file->private_data;
char buf[20];
int len;

if (key->conf.cipher != WLAN_CIPHER_SUITE_TKIP)
return -EINVAL;

len = scnprintf(buf, sizeof(buf), "%u\n", key->u.tkip.mic_failures);

return simple_read_from_buffer(userbuf, count, ppos, buf, len);
}
KEY_OPS(mic_failures);

static ssize_t key_key_read(struct file *file, char __user *userbuf,
size_t count, loff_t *ppos)
{
Expand Down Expand Up @@ -260,6 +276,7 @@ void ieee80211_debugfs_key_add(struct ieee80211_key *key)
DEBUGFS_ADD(rx_spec);
DEBUGFS_ADD(replays);
DEBUGFS_ADD(icverrors);
DEBUGFS_ADD(mic_failures);
DEBUGFS_ADD(key);
DEBUGFS_ADD(ifindex);
};
Expand Down
3 changes: 3 additions & 0 deletions net/mac80211/key.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ struct ieee80211_key {

/* last received RSC */
struct tkip_ctx rx[IEEE80211_NUM_TIDS];

/* number of mic failures */
u32 mic_failures;
} tkip;
struct {
atomic64_t tx_pn;
Expand Down
5 changes: 4 additions & 1 deletion net/mac80211/wpa.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
*/
if (status->flag & (RX_FLAG_MMIC_STRIPPED | RX_FLAG_IV_STRIPPED)) {
if (status->flag & RX_FLAG_MMIC_ERROR)
goto mic_fail;
goto mic_fail_no_key;

if (!(status->flag & RX_FLAG_IV_STRIPPED) && rx->key &&
rx->key->conf.cipher == WLAN_CIPHER_SUITE_TKIP)
Expand Down Expand Up @@ -161,6 +161,9 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
return RX_CONTINUE;

mic_fail:
rx->key->u.tkip.mic_failures++;

mic_fail_no_key:
/*
* In some cases the key can be unset - e.g. a multicast packet, in
* a driver that supports HW encryption. Send up the key idx only if
Expand Down

0 comments on commit b98ea05

Please sign in to comment.