Blame view

net/mac80211/debugfs_key.c 11.8 KB
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
1
2
3
4
  /*
   * Copyright 2003-2005	Devicescape Software, Inc.
   * Copyright (c) 2006	Jiri Benc <jbenc@suse.cz>
   * Copyright 2007	Johannes Berg <johannes@sipsolutions.net>
d0a77c656   Johannes Berg   mac80211: allow w...
5
   * Copyright (C) 2015	Intel Deutschland GmbH
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
6
7
8
9
10
11
12
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
  
  #include <linux/kobject.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
13
  #include <linux/slab.h>
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
14
  #include "ieee80211_i.h"
2c8dccc77   Johannes Berg   mac80211: rename ...
15
  #include "key.h"
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
16
17
  #include "debugfs.h"
  #include "debugfs_key.h"
07caf9d6c   Eliad Peller   mac80211: refacto...
18
  #define KEY_READ(name, prop, format_string)				\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
19
20
21
22
  static ssize_t key_##name##_read(struct file *file,			\
  				 char __user *userbuf,			\
  				 size_t count, loff_t *ppos)		\
  {									\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
23
  	struct ieee80211_key *key = file->private_data;			\
07caf9d6c   Eliad Peller   mac80211: refacto...
24
25
  	return mac80211_format_buffer(userbuf, count, ppos, 		\
  				      format_string, key->prop);	\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
26
  }
07caf9d6c   Eliad Peller   mac80211: refacto...
27
28
29
30
  #define KEY_READ_D(name) KEY_READ(name, name, "%d
  ")
  #define KEY_READ_X(name) KEY_READ(name, name, "0x%x
  ")
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
31
32
33
34
  
  #define KEY_OPS(name)							\
  static const struct file_operations key_ ##name## _ops = {		\
  	.read = key_##name##_read,					\
234e34058   Stephen Boyd   simple_open: auto...
35
  	.open = simple_open,						\
2b18ab36c   Arnd Bergmann   net/wireless: use...
36
  	.llseek = generic_file_llseek,					\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
37
  }
d0a77c656   Johannes Berg   mac80211: allow w...
38
39
40
41
42
43
44
  #define KEY_OPS_W(name)							\
  static const struct file_operations key_ ##name## _ops = {		\
  	.read = key_##name##_read,					\
  	.write = key_##name##_write,					\
  	.open = simple_open,						\
  	.llseek = generic_file_llseek,					\
  }
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
45
46
47
  #define KEY_FILE(name, format)						\
  		 KEY_READ_##format(name)				\
  		 KEY_OPS(name)
07caf9d6c   Eliad Peller   mac80211: refacto...
48
49
50
51
  #define KEY_CONF_READ(name, format_string)				\
  	KEY_READ(conf_##name, conf.name, format_string)
  #define KEY_CONF_READ_D(name) KEY_CONF_READ(name, "%d
  ")
8f20fc249   Johannes Berg   [MAC80211]: embed...
52
53
54
55
  
  #define KEY_CONF_OPS(name)						\
  static const struct file_operations key_ ##name## _ops = {		\
  	.read = key_conf_##name##_read,					\
234e34058   Stephen Boyd   simple_open: auto...
56
  	.open = simple_open,						\
2b18ab36c   Arnd Bergmann   net/wireless: use...
57
  	.llseek = generic_file_llseek,					\
8f20fc249   Johannes Berg   [MAC80211]: embed...
58
59
60
61
62
63
64
65
66
  }
  
  #define KEY_CONF_FILE(name, format)					\
  		 KEY_CONF_READ_##format(name)				\
  		 KEY_CONF_OPS(name)
  
  KEY_CONF_FILE(keylen, D);
  KEY_CONF_FILE(keyidx, D);
  KEY_CONF_FILE(hw_key_idx, D);
11a843b7e   Johannes Berg   [MAC80211]: rewor...
67
  KEY_FILE(flags, X);
07caf9d6c   Eliad Peller   mac80211: refacto...
68
69
  KEY_READ(ifindex, sdata->name, "%s
  ");
e7a64f12a   Johannes Berg   [MAC80211]: add i...
70
  KEY_OPS(ifindex);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
71
72
73
74
75
  
  static ssize_t key_algorithm_read(struct file *file,
  				  char __user *userbuf,
  				  size_t count, loff_t *ppos)
  {
97359d123   Johannes Berg   mac80211: use cip...
76
  	char buf[15];
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
77
  	struct ieee80211_key *key = file->private_data;
97359d123   Johannes Berg   mac80211: use cip...
78
  	u32 c = key->conf.cipher;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
79

97359d123   Johannes Berg   mac80211: use cip...
80
81
82
83
  	sprintf(buf, "%.2x-%.2x-%.2x:%d
  ",
  		c >> 24, (c >> 16) & 0xff, (c >> 8) & 0xff, c & 0xff);
  	return simple_read_from_buffer(userbuf, count, ppos, buf, strlen(buf));
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
84
85
  }
  KEY_OPS(algorithm);
d0a77c656   Johannes Berg   mac80211: allow w...
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
  static ssize_t key_tx_spec_write(struct file *file, const char __user *userbuf,
  				 size_t count, loff_t *ppos)
  {
  	struct ieee80211_key *key = file->private_data;
  	u64 pn;
  	int ret;
  
  	switch (key->conf.cipher) {
  	case WLAN_CIPHER_SUITE_WEP40:
  	case WLAN_CIPHER_SUITE_WEP104:
  		return -EINVAL;
  	case WLAN_CIPHER_SUITE_TKIP:
  		/* not supported yet */
  		return -EOPNOTSUPP;
  	case WLAN_CIPHER_SUITE_CCMP:
  	case WLAN_CIPHER_SUITE_CCMP_256:
  	case WLAN_CIPHER_SUITE_AES_CMAC:
  	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
  	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
  	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
  	case WLAN_CIPHER_SUITE_GCMP:
  	case WLAN_CIPHER_SUITE_GCMP_256:
  		ret = kstrtou64_from_user(userbuf, count, 16, &pn);
  		if (ret)
  			return ret;
  		/* PN is a 48-bit counter */
  		if (pn >= (1ULL << 48))
  			return -ERANGE;
  		atomic64_set(&key->conf.tx_pn, pn);
  		return count;
  	default:
  		return 0;
  	}
  }
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
120
121
122
  static ssize_t key_tx_spec_read(struct file *file, char __user *userbuf,
  				size_t count, loff_t *ppos)
  {
aba83a0b3   Johannes Berg   mac80211: fix CCM...
123
  	u64 pn;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
124
125
126
  	char buf[20];
  	int len;
  	struct ieee80211_key *key = file->private_data;
97359d123   Johannes Berg   mac80211: use cip...
127
128
129
  	switch (key->conf.cipher) {
  	case WLAN_CIPHER_SUITE_WEP40:
  	case WLAN_CIPHER_SUITE_WEP104:
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
130
131
  		len = scnprintf(buf, sizeof(buf), "
  ");
50339a67e   Johannes Berg   [MAC80211]: fix k...
132
  		break;
97359d123   Johannes Berg   mac80211: use cip...
133
  	case WLAN_CIPHER_SUITE_TKIP:
f8079d43c   Eliad Peller   mac80211: move TK...
134
  		pn = atomic64_read(&key->conf.tx_pn);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
135
136
  		len = scnprintf(buf, sizeof(buf), "%08x %04x
  ",
f8079d43c   Eliad Peller   mac80211: move TK...
137
138
  				TKIP_PN_TO_IV32(pn),
  				TKIP_PN_TO_IV16(pn));
50339a67e   Johannes Berg   [MAC80211]: fix k...
139
  		break;
97359d123   Johannes Berg   mac80211: use cip...
140
  	case WLAN_CIPHER_SUITE_CCMP:
2b2ba0db1   Jouni Malinen   mac80111: Add CCM...
141
  	case WLAN_CIPHER_SUITE_CCMP_256:
97359d123   Johannes Berg   mac80211: use cip...
142
  	case WLAN_CIPHER_SUITE_AES_CMAC:
56c52da2d   Jouni Malinen   mac80111: Add BIP...
143
  	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
8ade538bf   Jouni Malinen   mac80111: Add BIP...
144
145
  	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
  	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
00b9cfa3f   Jouni Malinen   mac80111: Add GCM...
146
147
  	case WLAN_CIPHER_SUITE_GCMP:
  	case WLAN_CIPHER_SUITE_GCMP_256:
db388a567   Johannes Berg   mac80211: move TX...
148
  		pn = atomic64_read(&key->conf.tx_pn);
00b9cfa3f   Jouni Malinen   mac80111: Add GCM...
149
150
151
152
153
  		len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x
  ",
  				(u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24),
  				(u8)(pn >> 16), (u8)(pn >> 8), (u8)pn);
  		break;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
154
155
156
157
158
  	default:
  		return 0;
  	}
  	return simple_read_from_buffer(userbuf, count, ppos, buf, len);
  }
d0a77c656   Johannes Berg   mac80211: allow w...
159
  KEY_OPS_W(tx_spec);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
160
161
162
163
164
  
  static ssize_t key_rx_spec_read(struct file *file, char __user *userbuf,
  				size_t count, loff_t *ppos)
  {
  	struct ieee80211_key *key = file->private_data;
5a306f588   Johannes Berg   mac80211: introdu...
165
  	char buf[14*IEEE80211_NUM_TIDS+1], *p = buf;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
166
167
  	int i, len;
  	const u8 *rpn;
97359d123   Johannes Berg   mac80211: use cip...
168
169
170
  	switch (key->conf.cipher) {
  	case WLAN_CIPHER_SUITE_WEP40:
  	case WLAN_CIPHER_SUITE_WEP104:
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
171
172
  		len = scnprintf(buf, sizeof(buf), "
  ");
50339a67e   Johannes Berg   [MAC80211]: fix k...
173
  		break;
97359d123   Johannes Berg   mac80211: use cip...
174
  	case WLAN_CIPHER_SUITE_TKIP:
5a306f588   Johannes Berg   mac80211: introdu...
175
  		for (i = 0; i < IEEE80211_NUM_TIDS; i++)
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
176
177
178
  			p += scnprintf(p, sizeof(buf)+buf-p,
  				       "%08x %04x
  ",
b0f76b335   Harvey Harrison   mac80211: add a s...
179
180
  				       key->u.tkip.rx[i].iv32,
  				       key->u.tkip.rx[i].iv16);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
181
  		len = p - buf;
50339a67e   Johannes Berg   [MAC80211]: fix k...
182
  		break;
97359d123   Johannes Berg   mac80211: use cip...
183
  	case WLAN_CIPHER_SUITE_CCMP:
2b2ba0db1   Jouni Malinen   mac80111: Add CCM...
184
  	case WLAN_CIPHER_SUITE_CCMP_256:
5a306f588   Johannes Berg   mac80211: introdu...
185
  		for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++) {
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
186
187
188
189
190
191
192
193
  			rpn = key->u.ccmp.rx_pn[i];
  			p += scnprintf(p, sizeof(buf)+buf-p,
  				       "%02x%02x%02x%02x%02x%02x
  ",
  				       rpn[0], rpn[1], rpn[2],
  				       rpn[3], rpn[4], rpn[5]);
  		}
  		len = p - buf;
50339a67e   Johannes Berg   [MAC80211]: fix k...
194
  		break;
97359d123   Johannes Berg   mac80211: use cip...
195
  	case WLAN_CIPHER_SUITE_AES_CMAC:
56c52da2d   Jouni Malinen   mac80111: Add BIP...
196
  	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
197
198
199
200
201
202
203
204
  		rpn = key->u.aes_cmac.rx_pn;
  		p += scnprintf(p, sizeof(buf)+buf-p,
  			       "%02x%02x%02x%02x%02x%02x
  ",
  			       rpn[0], rpn[1], rpn[2],
  			       rpn[3], rpn[4], rpn[5]);
  		len = p - buf;
  		break;
8ade538bf   Jouni Malinen   mac80111: Add BIP...
205
206
207
208
209
210
211
212
213
214
  	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
  	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
  		rpn = key->u.aes_gmac.rx_pn;
  		p += scnprintf(p, sizeof(buf)+buf-p,
  			       "%02x%02x%02x%02x%02x%02x
  ",
  			       rpn[0], rpn[1], rpn[2],
  			       rpn[3], rpn[4], rpn[5]);
  		len = p - buf;
  		break;
00b9cfa3f   Jouni Malinen   mac80111: Add GCM...
215
216
217
218
219
220
221
222
223
224
225
226
  	case WLAN_CIPHER_SUITE_GCMP:
  	case WLAN_CIPHER_SUITE_GCMP_256:
  		for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++) {
  			rpn = key->u.gcmp.rx_pn[i];
  			p += scnprintf(p, sizeof(buf)+buf-p,
  				       "%02x%02x%02x%02x%02x%02x
  ",
  				       rpn[0], rpn[1], rpn[2],
  				       rpn[3], rpn[4], rpn[5]);
  		}
  		len = p - buf;
  		break;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
227
228
229
230
231
232
233
234
235
236
237
238
239
  	default:
  		return 0;
  	}
  	return simple_read_from_buffer(userbuf, count, ppos, buf, len);
  }
  KEY_OPS(rx_spec);
  
  static ssize_t key_replays_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;
97359d123   Johannes Berg   mac80211: use cip...
240
241
  	switch (key->conf.cipher) {
  	case WLAN_CIPHER_SUITE_CCMP:
2b2ba0db1   Jouni Malinen   mac80111: Add CCM...
242
  	case WLAN_CIPHER_SUITE_CCMP_256:
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
243
244
245
  		len = scnprintf(buf, sizeof(buf), "%u
  ", key->u.ccmp.replays);
  		break;
97359d123   Johannes Berg   mac80211: use cip...
246
  	case WLAN_CIPHER_SUITE_AES_CMAC:
56c52da2d   Jouni Malinen   mac80111: Add BIP...
247
  	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
248
249
250
251
  		len = scnprintf(buf, sizeof(buf), "%u
  ",
  				key->u.aes_cmac.replays);
  		break;
8ade538bf   Jouni Malinen   mac80111: Add BIP...
252
253
254
255
256
257
  	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
  	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
  		len = scnprintf(buf, sizeof(buf), "%u
  ",
  				key->u.aes_gmac.replays);
  		break;
00b9cfa3f   Jouni Malinen   mac80111: Add GCM...
258
259
260
261
262
  	case WLAN_CIPHER_SUITE_GCMP:
  	case WLAN_CIPHER_SUITE_GCMP_256:
  		len = scnprintf(buf, sizeof(buf), "%u
  ", key->u.gcmp.replays);
  		break;
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
263
  	default:
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
264
  		return 0;
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
265
  	}
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
266
267
268
  	return simple_read_from_buffer(userbuf, count, ppos, buf, len);
  }
  KEY_OPS(replays);
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
269
270
271
272
273
274
  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;
97359d123   Johannes Berg   mac80211: use cip...
275
276
  	switch (key->conf.cipher) {
  	case WLAN_CIPHER_SUITE_AES_CMAC:
56c52da2d   Jouni Malinen   mac80111: Add BIP...
277
  	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
278
279
280
281
  		len = scnprintf(buf, sizeof(buf), "%u
  ",
  				key->u.aes_cmac.icverrors);
  		break;
8ade538bf   Jouni Malinen   mac80111: Add BIP...
282
283
284
285
286
287
  	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
  	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
  		len = scnprintf(buf, sizeof(buf), "%u
  ",
  				key->u.aes_gmac.icverrors);
  		break;
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
288
289
290
291
292
293
  	default:
  		return 0;
  	}
  	return simple_read_from_buffer(userbuf, count, ppos, buf, len);
  }
  KEY_OPS(icverrors);
b98ea0586   Saravana   mac80211: add deb...
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
  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
  ", key->u.tkip.mic_failures);
  
  	return simple_read_from_buffer(userbuf, count, ppos, buf, len);
  }
  KEY_OPS(mic_failures);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
310
311
312
313
  static ssize_t key_key_read(struct file *file, char __user *userbuf,
  			    size_t count, loff_t *ppos)
  {
  	struct ieee80211_key *key = file->private_data;
520efd1ac   Jesper Juhl   mac80211: fix fai...
314
  	int i, bufsize = 2 * key->conf.keylen + 2;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
315
316
  	char *buf = kmalloc(bufsize, GFP_KERNEL);
  	char *p = buf;
520efd1ac   Jesper Juhl   mac80211: fix fai...
317
318
319
320
  	ssize_t res;
  
  	if (!buf)
  		return -ENOMEM;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
321

8f20fc249   Johannes Berg   [MAC80211]: embed...
322
323
  	for (i = 0; i < key->conf.keylen; i++)
  		p += scnprintf(p, bufsize + buf - p, "%02x", key->conf.key[i]);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
324
325
326
327
328
329
330
331
332
  	p += scnprintf(p, bufsize+buf-p, "
  ");
  	res = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
  	kfree(buf);
  	return res;
  }
  KEY_OPS(key);
  
  #define DEBUGFS_ADD(name) \
7bcfaf2f4   Johannes Berg   cfg80211/mac80211...
333
334
  	debugfs_create_file(#name, 0400, key->debugfs.dir, \
  			    key, &key_##name##_ops);
d0a77c656   Johannes Berg   mac80211: allow w...
335
336
337
  #define DEBUGFS_ADD_W(name) \
  	debugfs_create_file(#name, 0600, key->debugfs.dir, \
  			    key, &key_##name##_ops);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
338

3b96766f0   Johannes Berg   mac80211: fix key...
339
  void ieee80211_debugfs_key_add(struct ieee80211_key *key)
9446f3efc   Johannes Berg   mac80211: fix deb...
340
  {
50339a67e   Johannes Berg   [MAC80211]: fix k...
341
  	static int keycount;
9446f3efc   Johannes Berg   mac80211: fix deb...
342
  	char buf[100];
3b96766f0   Johannes Berg   mac80211: fix key...
343
  	struct sta_info *sta;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
344

3b96766f0   Johannes Berg   mac80211: fix key...
345
  	if (!key->local->debugfs.keys)
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
346
  		return;
50339a67e   Johannes Berg   [MAC80211]: fix k...
347
  	sprintf(buf, "%d", keycount);
d9c58f30b   Johannes Berg   mac80211: fix key...
348
  	key->debugfs.cnt = keycount;
50339a67e   Johannes Berg   [MAC80211]: fix k...
349
  	keycount++;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
350
  	key->debugfs.dir = debugfs_create_dir(buf,
3b96766f0   Johannes Berg   mac80211: fix key...
351
  					key->local->debugfs.keys);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
352
353
354
  
  	if (!key->debugfs.dir)
  		return;
40b275b69   Johannes Berg   mac80211: sparse ...
355
356
  	sta = key->sta;
  	if (sta) {
9446f3efc   Johannes Berg   mac80211: fix deb...
357
358
  		sprintf(buf, "../../netdev:%s/stations/%pM",
  			sta->sdata->name, sta->sta.addr);
3b96766f0   Johannes Berg   mac80211: fix key...
359
360
  		key->debugfs.stalink =
  			debugfs_create_symlink("station", key->debugfs.dir, buf);
40b275b69   Johannes Berg   mac80211: sparse ...
361
  	}
3b96766f0   Johannes Berg   mac80211: fix key...
362

e9f207f0f   Jiri Benc   [MAC80211]: Add d...
363
  	DEBUGFS_ADD(keylen);
8f20fc249   Johannes Berg   [MAC80211]: embed...
364
  	DEBUGFS_ADD(flags);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
365
366
  	DEBUGFS_ADD(keyidx);
  	DEBUGFS_ADD(hw_key_idx);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
367
  	DEBUGFS_ADD(algorithm);
d0a77c656   Johannes Berg   mac80211: allow w...
368
  	DEBUGFS_ADD_W(tx_spec);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
369
370
  	DEBUGFS_ADD(rx_spec);
  	DEBUGFS_ADD(replays);
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
371
  	DEBUGFS_ADD(icverrors);
b98ea0586   Saravana   mac80211: add deb...
372
  	DEBUGFS_ADD(mic_failures);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
373
  	DEBUGFS_ADD(key);
e7a64f12a   Johannes Berg   [MAC80211]: add i...
374
  	DEBUGFS_ADD(ifindex);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
375
  };
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
376
377
378
379
  void ieee80211_debugfs_key_remove(struct ieee80211_key *key)
  {
  	if (!key)
  		return;
7bcfaf2f4   Johannes Berg   cfg80211/mac80211...
380
  	debugfs_remove_recursive(key->debugfs.dir);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
381
382
  	key->debugfs.dir = NULL;
  }
f7e0104c1   Johannes Berg   mac80211: support...
383
384
  
  void ieee80211_debugfs_key_update_default(struct ieee80211_sub_if_data *sdata)
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
385
386
  {
  	char buf[50];
78520cad4   Johannes Berg   mac80211: fix deb...
387
  	struct ieee80211_key *key;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
388

ddbfe860a   Stanislaw Gruszka   mac80211: move sd...
389
  	if (!sdata->vif.debugfs_dir)
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
390
  		return;
f7e0104c1   Johannes Berg   mac80211: support...
391
  	lockdep_assert_held(&sdata->local->key_mtx);
78520cad4   Johannes Berg   mac80211: fix deb...
392

5c6761adc   Fabian Frederick   mac80211: remove ...
393
394
  	debugfs_remove(sdata->debugfs.default_unicast_key);
  	sdata->debugfs.default_unicast_key = NULL;
135792ec2   Johannes Berg   mac80211: fix deb...
395

f7e0104c1   Johannes Berg   mac80211: support...
396
  	if (sdata->default_unicast_key) {
40b275b69   Johannes Berg   mac80211: sparse ...
397
398
  		key = key_mtx_dereference(sdata->local,
  					  sdata->default_unicast_key);
78520cad4   Johannes Berg   mac80211: fix deb...
399
  		sprintf(buf, "../keys/%d", key->debugfs.cnt);
f7e0104c1   Johannes Berg   mac80211: support...
400
401
  		sdata->debugfs.default_unicast_key =
  			debugfs_create_symlink("default_unicast_key",
ddbfe860a   Stanislaw Gruszka   mac80211: move sd...
402
  					       sdata->vif.debugfs_dir, buf);
135792ec2   Johannes Berg   mac80211: fix deb...
403
  	}
5c6761adc   Fabian Frederick   mac80211: remove ...
404
405
  	debugfs_remove(sdata->debugfs.default_multicast_key);
  	sdata->debugfs.default_multicast_key = NULL;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
406

f7e0104c1   Johannes Berg   mac80211: support...
407
  	if (sdata->default_multicast_key) {
40b275b69   Johannes Berg   mac80211: sparse ...
408
409
  		key = key_mtx_dereference(sdata->local,
  					  sdata->default_multicast_key);
f7e0104c1   Johannes Berg   mac80211: support...
410
411
412
  		sprintf(buf, "../keys/%d", key->debugfs.cnt);
  		sdata->debugfs.default_multicast_key =
  			debugfs_create_symlink("default_multicast_key",
ddbfe860a   Stanislaw Gruszka   mac80211: move sd...
413
  					       sdata->vif.debugfs_dir, buf);
f7e0104c1   Johannes Berg   mac80211: support...
414
  	}
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
415
  }
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
416

3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
417
418
419
420
  void ieee80211_debugfs_key_add_mgmt_default(struct ieee80211_sub_if_data *sdata)
  {
  	char buf[50];
  	struct ieee80211_key *key;
ddbfe860a   Stanislaw Gruszka   mac80211: move sd...
421
  	if (!sdata->vif.debugfs_dir)
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
422
  		return;
40b275b69   Johannes Berg   mac80211: sparse ...
423
424
  	key = key_mtx_dereference(sdata->local,
  				  sdata->default_mgmt_key);
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
425
426
  	if (key) {
  		sprintf(buf, "../keys/%d", key->debugfs.cnt);
7bcfaf2f4   Johannes Berg   cfg80211/mac80211...
427
  		sdata->debugfs.default_mgmt_key =
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
428
  			debugfs_create_symlink("default_mgmt_key",
ddbfe860a   Stanislaw Gruszka   mac80211: move sd...
429
  					       sdata->vif.debugfs_dir, buf);
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
430
431
432
433
434
435
436
437
  	} else
  		ieee80211_debugfs_key_remove_mgmt_default(sdata);
  }
  
  void ieee80211_debugfs_key_remove_mgmt_default(struct ieee80211_sub_if_data *sdata)
  {
  	if (!sdata)
  		return;
7bcfaf2f4   Johannes Berg   cfg80211/mac80211...
438
439
  	debugfs_remove(sdata->debugfs.default_mgmt_key);
  	sdata->debugfs.default_mgmt_key = NULL;
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
440
  }
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
441
442
443
444
445
446
  void ieee80211_debugfs_key_sta_del(struct ieee80211_key *key,
  				   struct sta_info *sta)
  {
  	debugfs_remove(key->debugfs.stalink);
  	key->debugfs.stalink = NULL;
  }