diff options
Diffstat (limited to 'net/mac80211/debugfs_key.c')
| -rw-r--r-- | net/mac80211/debugfs_key.c | 79 | 
1 files changed, 77 insertions, 2 deletions
diff --git a/net/mac80211/debugfs_key.c b/net/mac80211/debugfs_key.c index 6424ac565ae..99c752588b3 100644 --- a/net/mac80211/debugfs_key.c +++ b/net/mac80211/debugfs_key.c @@ -76,6 +76,9 @@ static ssize_t key_algorithm_read(struct file *file,  	case ALG_CCMP:  		alg = "CCMP\n";  		break; +	case ALG_AES_CMAC: +		alg = "AES-128-CMAC\n"; +		break;  	default:  		return 0;  	} @@ -105,6 +108,12 @@ static ssize_t key_tx_spec_read(struct file *file, char __user *userbuf,  		len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",  				tpn[0], tpn[1], tpn[2], tpn[3], tpn[4], tpn[5]);  		break; +	case ALG_AES_CMAC: +		tpn = key->u.aes_cmac.tx_pn; +		len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n", +				tpn[0], tpn[1], tpn[2], tpn[3], tpn[4], +				tpn[5]); +		break;  	default:  		return 0;  	} @@ -142,6 +151,14 @@ static ssize_t key_rx_spec_read(struct file *file, char __user *userbuf,  		}  		len = p - buf;  		break; +	case ALG_AES_CMAC: +		rpn = key->u.aes_cmac.rx_pn; +		p += scnprintf(p, sizeof(buf)+buf-p, +			       "%02x%02x%02x%02x%02x%02x\n", +			       rpn[0], rpn[1], rpn[2], +			       rpn[3], rpn[4], rpn[5]); +		len = p - buf; +		break;  	default:  		return 0;  	} @@ -156,13 +173,40 @@ static ssize_t key_replays_read(struct file *file, char __user *userbuf,  	char buf[20];  	int len; -	if (key->conf.alg != ALG_CCMP) +	switch (key->conf.alg) { +	case ALG_CCMP: +		len = scnprintf(buf, sizeof(buf), "%u\n", key->u.ccmp.replays); +		break; +	case ALG_AES_CMAC: +		len = scnprintf(buf, sizeof(buf), "%u\n", +				key->u.aes_cmac.replays); +		break; +	default:  		return 0; -	len = scnprintf(buf, sizeof(buf), "%u\n", key->u.ccmp.replays); +	}  	return simple_read_from_buffer(userbuf, count, ppos, buf, len);  }  KEY_OPS(replays); +static ssize_t key_icverrors_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; + +	switch (key->conf.alg) { +	case ALG_AES_CMAC: +		len = scnprintf(buf, sizeof(buf), "%u\n", +				key->u.aes_cmac.icverrors); +		break; +	default: +		return 0; +	} +	return simple_read_from_buffer(userbuf, count, ppos, buf, len); +} +KEY_OPS(icverrors); +  static ssize_t key_key_read(struct file *file, char __user *userbuf,  			    size_t count, loff_t *ppos)  { @@ -222,6 +266,7 @@ void ieee80211_debugfs_key_add(struct ieee80211_key *key)  	DEBUGFS_ADD(tx_spec);  	DEBUGFS_ADD(rx_spec);  	DEBUGFS_ADD(replays); +	DEBUGFS_ADD(icverrors);  	DEBUGFS_ADD(key);  	DEBUGFS_ADD(ifindex);  }; @@ -243,6 +288,7 @@ void ieee80211_debugfs_key_remove(struct ieee80211_key *key)  	DEBUGFS_DEL(tx_spec);  	DEBUGFS_DEL(rx_spec);  	DEBUGFS_DEL(replays); +	DEBUGFS_DEL(icverrors);  	DEBUGFS_DEL(key);  	DEBUGFS_DEL(ifindex); @@ -280,6 +326,35 @@ void ieee80211_debugfs_key_remove_default(struct ieee80211_sub_if_data *sdata)  	sdata->common_debugfs.default_key = NULL;  } +void ieee80211_debugfs_key_add_mgmt_default(struct ieee80211_sub_if_data *sdata) +{ +	char buf[50]; +	struct ieee80211_key *key; + +	if (!sdata->debugfsdir) +		return; + +	/* this is running under the key lock */ + +	key = sdata->default_mgmt_key; +	if (key) { +		sprintf(buf, "../keys/%d", key->debugfs.cnt); +		sdata->common_debugfs.default_mgmt_key = +			debugfs_create_symlink("default_mgmt_key", +					       sdata->debugfsdir, buf); +	} else +		ieee80211_debugfs_key_remove_mgmt_default(sdata); +} + +void ieee80211_debugfs_key_remove_mgmt_default(struct ieee80211_sub_if_data *sdata) +{ +	if (!sdata) +		return; + +	debugfs_remove(sdata->common_debugfs.default_mgmt_key); +	sdata->common_debugfs.default_mgmt_key = NULL; +} +  void ieee80211_debugfs_key_sta_del(struct ieee80211_key *key,  				   struct sta_info *sta)  {  |