diff options
| -rw-r--r-- | net/mac80211/debugfs_key.c | 17 | ||||
| -rw-r--r-- | net/mac80211/key.h | 3 | ||||
| -rw-r--r-- | net/mac80211/wpa.c | 5 | 
3 files changed, 24 insertions, 1 deletions
diff --git a/net/mac80211/debugfs_key.c b/net/mac80211/debugfs_key.c index 2d4235497f1..c3a3082b72e 100644 --- a/net/mac80211/debugfs_key.c +++ b/net/mac80211/debugfs_key.c @@ -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);  }; diff --git a/net/mac80211/key.h b/net/mac80211/key.h index 7cff0d3a519..382dc44ed33 100644 --- a/net/mac80211/key.h +++ b/net/mac80211/key.h @@ -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; diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c index 8bd2f5c6a56..c175ee866ff 100644 --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c @@ -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  |