debugfs_key.c revision 78520cad4b222d81fa18f2dcfa52394d8d1722b0
1e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc/* 2e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc * Copyright 2003-2005 Devicescape Software, Inc. 3e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc * Copyright (c) 2006 Jiri Benc <jbenc@suse.cz> 4e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc * Copyright 2007 Johannes Berg <johannes@sipsolutions.net> 5e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc * 6e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc * This program is free software; you can redistribute it and/or modify 7e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc * it under the terms of the GNU General Public License version 2 as 8e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc * published by the Free Software Foundation. 9e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc */ 10e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 11e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc#include <linux/kobject.h> 12e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc#include "ieee80211_i.h" 132c8dccc77420fb7433da5674818959d3499d35beJohannes Berg#include "key.h" 14e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc#include "debugfs.h" 15e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc#include "debugfs_key.h" 16e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 178f20fc24986a083228823d9b68adca20714b254eJohannes Berg#define KEY_READ(name, prop, buflen, format_string) \ 18e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Bencstatic ssize_t key_##name##_read(struct file *file, \ 19e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc char __user *userbuf, \ 20e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc size_t count, loff_t *ppos) \ 21e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc{ \ 22e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc char buf[buflen]; \ 23e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc struct ieee80211_key *key = file->private_data; \ 248f20fc24986a083228823d9b68adca20714b254eJohannes Berg int res = scnprintf(buf, buflen, format_string, key->prop); \ 25e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return simple_read_from_buffer(userbuf, count, ppos, buf, res); \ 26e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc} 278f20fc24986a083228823d9b68adca20714b254eJohannes Berg#define KEY_READ_D(name) KEY_READ(name, name, 20, "%d\n") 2811a843b7e16062389c53ba393c7913956e034eb2Johannes Berg#define KEY_READ_X(name) KEY_READ(name, name, 20, "0x%x\n") 29e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 30e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc#define KEY_OPS(name) \ 31e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Bencstatic const struct file_operations key_ ##name## _ops = { \ 32e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc .read = key_##name##_read, \ 33e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc .open = mac80211_open_file_generic, \ 34e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc} 35e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 36e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc#define KEY_FILE(name, format) \ 37e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc KEY_READ_##format(name) \ 38e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc KEY_OPS(name) 39e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 408f20fc24986a083228823d9b68adca20714b254eJohannes Berg#define KEY_CONF_READ(name, buflen, format_string) \ 418f20fc24986a083228823d9b68adca20714b254eJohannes Berg KEY_READ(conf_##name, conf.name, buflen, format_string) 428f20fc24986a083228823d9b68adca20714b254eJohannes Berg#define KEY_CONF_READ_D(name) KEY_CONF_READ(name, 20, "%d\n") 438f20fc24986a083228823d9b68adca20714b254eJohannes Berg 448f20fc24986a083228823d9b68adca20714b254eJohannes Berg#define KEY_CONF_OPS(name) \ 458f20fc24986a083228823d9b68adca20714b254eJohannes Bergstatic const struct file_operations key_ ##name## _ops = { \ 468f20fc24986a083228823d9b68adca20714b254eJohannes Berg .read = key_conf_##name##_read, \ 478f20fc24986a083228823d9b68adca20714b254eJohannes Berg .open = mac80211_open_file_generic, \ 488f20fc24986a083228823d9b68adca20714b254eJohannes Berg} 498f20fc24986a083228823d9b68adca20714b254eJohannes Berg 508f20fc24986a083228823d9b68adca20714b254eJohannes Berg#define KEY_CONF_FILE(name, format) \ 518f20fc24986a083228823d9b68adca20714b254eJohannes Berg KEY_CONF_READ_##format(name) \ 528f20fc24986a083228823d9b68adca20714b254eJohannes Berg KEY_CONF_OPS(name) 538f20fc24986a083228823d9b68adca20714b254eJohannes Berg 548f20fc24986a083228823d9b68adca20714b254eJohannes BergKEY_CONF_FILE(keylen, D); 558f20fc24986a083228823d9b68adca20714b254eJohannes BergKEY_CONF_FILE(keyidx, D); 568f20fc24986a083228823d9b68adca20714b254eJohannes BergKEY_CONF_FILE(hw_key_idx, D); 5711a843b7e16062389c53ba393c7913956e034eb2Johannes BergKEY_FILE(flags, X); 58e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri BencKEY_FILE(tx_rx_count, D); 59e7a64f12a452d39ab50e5580e93bc48b3b15f30cJohannes BergKEY_READ(ifindex, sdata->dev->ifindex, 20, "%d\n"); 60e7a64f12a452d39ab50e5580e93bc48b3b15f30cJohannes BergKEY_OPS(ifindex); 61e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 62e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Bencstatic ssize_t key_algorithm_read(struct file *file, 63e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc char __user *userbuf, 64e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc size_t count, loff_t *ppos) 65e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc{ 66e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc char *alg; 67e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc struct ieee80211_key *key = file->private_data; 68e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 698f20fc24986a083228823d9b68adca20714b254eJohannes Berg switch (key->conf.alg) { 70e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc case ALG_WEP: 71e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc alg = "WEP\n"; 72e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc break; 73e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc case ALG_TKIP: 74e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc alg = "TKIP\n"; 75e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc break; 76e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc case ALG_CCMP: 77e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc alg = "CCMP\n"; 78e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc break; 79e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc default: 80e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return 0; 81e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc } 82e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return simple_read_from_buffer(userbuf, count, ppos, alg, strlen(alg)); 83e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc} 84e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri BencKEY_OPS(algorithm); 85e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 86e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Bencstatic ssize_t key_tx_spec_read(struct file *file, char __user *userbuf, 87e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc size_t count, loff_t *ppos) 88e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc{ 89e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc const u8 *tpn; 90e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc char buf[20]; 91e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc int len; 92e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc struct ieee80211_key *key = file->private_data; 93e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 948f20fc24986a083228823d9b68adca20714b254eJohannes Berg switch (key->conf.alg) { 95e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc case ALG_WEP: 96e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc len = scnprintf(buf, sizeof(buf), "\n"); 9750339a67e2d4386d8919195989371579cab8649dJohannes Berg break; 98e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc case ALG_TKIP: 99e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc len = scnprintf(buf, sizeof(buf), "%08x %04x\n", 100e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc key->u.tkip.iv32, 101e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc key->u.tkip.iv16); 10250339a67e2d4386d8919195989371579cab8649dJohannes Berg break; 103e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc case ALG_CCMP: 104e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc tpn = key->u.ccmp.tx_pn; 105e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n", 106e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc tpn[0], tpn[1], tpn[2], tpn[3], tpn[4], tpn[5]); 10750339a67e2d4386d8919195989371579cab8649dJohannes Berg break; 108e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc default: 109e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return 0; 110e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc } 111e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return simple_read_from_buffer(userbuf, count, ppos, buf, len); 112e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc} 113e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri BencKEY_OPS(tx_spec); 114e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 115e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Bencstatic ssize_t key_rx_spec_read(struct file *file, char __user *userbuf, 116e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc size_t count, loff_t *ppos) 117e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc{ 118e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc struct ieee80211_key *key = file->private_data; 119e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc char buf[14*NUM_RX_DATA_QUEUES+1], *p = buf; 120e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc int i, len; 121e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc const u8 *rpn; 122e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 1238f20fc24986a083228823d9b68adca20714b254eJohannes Berg switch (key->conf.alg) { 124e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc case ALG_WEP: 125e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc len = scnprintf(buf, sizeof(buf), "\n"); 12650339a67e2d4386d8919195989371579cab8649dJohannes Berg break; 127e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc case ALG_TKIP: 128e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc for (i = 0; i < NUM_RX_DATA_QUEUES; i++) 129e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc p += scnprintf(p, sizeof(buf)+buf-p, 130e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc "%08x %04x\n", 131e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc key->u.tkip.iv32_rx[i], 132e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc key->u.tkip.iv16_rx[i]); 133e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc len = p - buf; 13450339a67e2d4386d8919195989371579cab8649dJohannes Berg break; 135e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc case ALG_CCMP: 136e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc for (i = 0; i < NUM_RX_DATA_QUEUES; i++) { 137e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc rpn = key->u.ccmp.rx_pn[i]; 138e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc p += scnprintf(p, sizeof(buf)+buf-p, 139e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc "%02x%02x%02x%02x%02x%02x\n", 140e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc rpn[0], rpn[1], rpn[2], 141e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc rpn[3], rpn[4], rpn[5]); 142e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc } 143e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc len = p - buf; 14450339a67e2d4386d8919195989371579cab8649dJohannes Berg break; 145e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc default: 146e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return 0; 147e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc } 148e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return simple_read_from_buffer(userbuf, count, ppos, buf, len); 149e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc} 150e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri BencKEY_OPS(rx_spec); 151e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 152e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Bencstatic ssize_t key_replays_read(struct file *file, char __user *userbuf, 153e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc size_t count, loff_t *ppos) 154e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc{ 155e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc struct ieee80211_key *key = file->private_data; 156e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc char buf[20]; 157e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc int len; 158e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 1598f20fc24986a083228823d9b68adca20714b254eJohannes Berg if (key->conf.alg != ALG_CCMP) 160e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return 0; 161e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc len = scnprintf(buf, sizeof(buf), "%u\n", key->u.ccmp.replays); 162e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return simple_read_from_buffer(userbuf, count, ppos, buf, len); 163e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc} 164e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri BencKEY_OPS(replays); 165e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 166e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Bencstatic ssize_t key_key_read(struct file *file, char __user *userbuf, 167e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc size_t count, loff_t *ppos) 168e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc{ 169e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc struct ieee80211_key *key = file->private_data; 1708f20fc24986a083228823d9b68adca20714b254eJohannes Berg int i, res, bufsize = 2 * key->conf.keylen + 2; 171e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc char *buf = kmalloc(bufsize, GFP_KERNEL); 172e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc char *p = buf; 173e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 1748f20fc24986a083228823d9b68adca20714b254eJohannes Berg for (i = 0; i < key->conf.keylen; i++) 1758f20fc24986a083228823d9b68adca20714b254eJohannes Berg p += scnprintf(p, bufsize + buf - p, "%02x", key->conf.key[i]); 176e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc p += scnprintf(p, bufsize+buf-p, "\n"); 177e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc res = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf); 178e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc kfree(buf); 179e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return res; 180e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc} 181e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri BencKEY_OPS(key); 182e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 183e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc#define DEBUGFS_ADD(name) \ 184e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc key->debugfs.name = debugfs_create_file(#name, 0400,\ 185e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc key->debugfs.dir, key, &key_##name##_ops); 186e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 1873b96766f0e643f52ae19e134664df6730c737e87Johannes Bergvoid ieee80211_debugfs_key_add(struct ieee80211_key *key) 1883b96766f0e643f52ae19e134664df6730c737e87Johannes Berg { 18950339a67e2d4386d8919195989371579cab8649dJohannes Berg static int keycount; 1903b96766f0e643f52ae19e134664df6730c737e87Johannes Berg char buf[50]; 1913b96766f0e643f52ae19e134664df6730c737e87Johannes Berg DECLARE_MAC_BUF(mac); 1923b96766f0e643f52ae19e134664df6730c737e87Johannes Berg struct sta_info *sta; 193e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 1943b96766f0e643f52ae19e134664df6730c737e87Johannes Berg if (!key->local->debugfs.keys) 195e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return; 196e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 19750339a67e2d4386d8919195989371579cab8649dJohannes Berg sprintf(buf, "%d", keycount); 198d9c58f30b08bfe1e689537af5bc855a76d0fae25Johannes Berg key->debugfs.cnt = keycount; 19950339a67e2d4386d8919195989371579cab8649dJohannes Berg keycount++; 200e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc key->debugfs.dir = debugfs_create_dir(buf, 2013b96766f0e643f52ae19e134664df6730c737e87Johannes Berg key->local->debugfs.keys); 202e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 203e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc if (!key->debugfs.dir) 204e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return; 205e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 2063b96766f0e643f52ae19e134664df6730c737e87Johannes Berg rcu_read_lock(); 2073b96766f0e643f52ae19e134664df6730c737e87Johannes Berg sta = rcu_dereference(key->sta); 2083b96766f0e643f52ae19e134664df6730c737e87Johannes Berg if (sta) 2093b96766f0e643f52ae19e134664df6730c737e87Johannes Berg sprintf(buf, "../../stations/%s", print_mac(mac, sta->addr)); 2103b96766f0e643f52ae19e134664df6730c737e87Johannes Berg rcu_read_unlock(); 2113b96766f0e643f52ae19e134664df6730c737e87Johannes Berg 2123b96766f0e643f52ae19e134664df6730c737e87Johannes Berg /* using sta as a boolean is fine outside RCU lock */ 2133b96766f0e643f52ae19e134664df6730c737e87Johannes Berg if (sta) 2143b96766f0e643f52ae19e134664df6730c737e87Johannes Berg key->debugfs.stalink = 2153b96766f0e643f52ae19e134664df6730c737e87Johannes Berg debugfs_create_symlink("station", key->debugfs.dir, buf); 2163b96766f0e643f52ae19e134664df6730c737e87Johannes Berg 217e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_ADD(keylen); 2188f20fc24986a083228823d9b68adca20714b254eJohannes Berg DEBUGFS_ADD(flags); 219e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_ADD(keyidx); 220e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_ADD(hw_key_idx); 221e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_ADD(tx_rx_count); 222e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_ADD(algorithm); 223e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_ADD(tx_spec); 224e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_ADD(rx_spec); 225e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_ADD(replays); 226e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_ADD(key); 227e7a64f12a452d39ab50e5580e93bc48b3b15f30cJohannes Berg DEBUGFS_ADD(ifindex); 228e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc}; 229e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 230e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc#define DEBUGFS_DEL(name) \ 231e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc debugfs_remove(key->debugfs.name); key->debugfs.name = NULL; 232e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 233e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Bencvoid ieee80211_debugfs_key_remove(struct ieee80211_key *key) 234e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc{ 235e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc if (!key) 236e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return; 237e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 238e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_DEL(keylen); 2398f20fc24986a083228823d9b68adca20714b254eJohannes Berg DEBUGFS_DEL(flags); 240e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_DEL(keyidx); 241e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_DEL(hw_key_idx); 242e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_DEL(tx_rx_count); 243e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_DEL(algorithm); 244e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_DEL(tx_spec); 245e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_DEL(rx_spec); 246e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_DEL(replays); 247e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc DEBUGFS_DEL(key); 248e7a64f12a452d39ab50e5580e93bc48b3b15f30cJohannes Berg DEBUGFS_DEL(ifindex); 249e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 250e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc debugfs_remove(key->debugfs.stalink); 251e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc key->debugfs.stalink = NULL; 252e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc debugfs_remove(key->debugfs.dir); 253e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc key->debugfs.dir = NULL; 254e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc} 255e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Bencvoid ieee80211_debugfs_key_add_default(struct ieee80211_sub_if_data *sdata) 256e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc{ 257e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc char buf[50]; 25878520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg struct ieee80211_key *key; 259e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 260e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc if (!sdata->debugfsdir) 261e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return; 262e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 26378520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg /* this is running under the key lock */ 26478520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg 26578520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg key = sdata->default_key; 26678520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg if (key) { 26778520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg sprintf(buf, "../keys/%d", key->debugfs.cnt); 26878520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg sdata->debugfs.default_key = 26978520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg debugfs_create_symlink("default_key", 27078520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg sdata->debugfsdir, buf); 27178520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg } else 27278520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg ieee80211_debugfs_key_remove_default(sdata); 273e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc} 27478520cad4b222d81fa18f2dcfa52394d8d1722b0Johannes Berg 275e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Bencvoid ieee80211_debugfs_key_remove_default(struct ieee80211_sub_if_data *sdata) 276e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc{ 277e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc if (!sdata) 278e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc return; 279e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 280e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc debugfs_remove(sdata->debugfs.default_key); 281e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc sdata->debugfs.default_key = NULL; 282e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc} 283e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc 284e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Bencvoid ieee80211_debugfs_key_sta_del(struct ieee80211_key *key, 285e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc struct sta_info *sta) 286e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc{ 287e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc debugfs_remove(key->debugfs.stalink); 288e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc key->debugfs.stalink = NULL; 289e9f207f0ff90bf60b825800d7450e6f2ff2eab88Jiri Benc} 290