mac80211: add debug file for mic failure
authorSaravana <saravanad@posedge.com>
Tue, 4 Dec 2012 14:17:42 +0000 (19:47 +0530)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 5 Dec 2012 08:44:41 +0000 (09:44 +0100)
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>
net/mac80211/debugfs_key.c
net/mac80211/key.h
net/mac80211/wpa.c

index 2d4235497f1be90e6a8f59229368c34716563aaf..c3a3082b72e5cde611b5fb89a63829c7fb4eee27 100644 (file)
@@ -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)
 {
@@ -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);
 };
index 7cff0d3a519c081b586b6a3cc93fc5d69ea39f3b..382dc44ed330a9921764431bc88345728b0eab49 100644 (file)
@@ -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;
index 8bd2f5c6a56edfa26193de6da2560c88d5ac75ce..c175ee866ff4ab8eb70b72a6b281ddcffc591ff1 100644 (file)
@@ -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)
@@ -161,6 +161,9 @@ update_iv:
        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