Blame view

net/mac80211/debugfs_key.c 12.3 KB
d2912cb15   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
2
3
4
5
  /*
   * 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...
6
   * Copyright (C) 2015	Intel Deutschland GmbH
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
7
8
9
   */
  
  #include <linux/kobject.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
10
  #include <linux/slab.h>
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
11
  #include "ieee80211_i.h"
2c8dccc77   Johannes Berg   mac80211: rename ...
12
  #include "key.h"
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
13
14
  #include "debugfs.h"
  #include "debugfs_key.h"
07caf9d6c   Eliad Peller   mac80211: refacto...
15
  #define KEY_READ(name, prop, format_string)				\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
16
17
18
19
  static ssize_t key_##name##_read(struct file *file,			\
  				 char __user *userbuf,			\
  				 size_t count, loff_t *ppos)		\
  {									\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
20
  	struct ieee80211_key *key = file->private_data;			\
07caf9d6c   Eliad Peller   mac80211: refacto...
21
22
  	return mac80211_format_buffer(userbuf, count, ppos, 		\
  				      format_string, key->prop);	\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
23
  }
07caf9d6c   Eliad Peller   mac80211: refacto...
24
25
26
27
  #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...
28
29
30
31
  
  #define KEY_OPS(name)							\
  static const struct file_operations key_ ##name## _ops = {		\
  	.read = key_##name##_read,					\
234e34058   Stephen Boyd   simple_open: auto...
32
  	.open = simple_open,						\
2b18ab36c   Arnd Bergmann   net/wireless: use...
33
  	.llseek = generic_file_llseek,					\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
34
  }
d0a77c656   Johannes Berg   mac80211: allow w...
35
36
37
38
39
40
41
  #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...
42
43
44
  #define KEY_FILE(name, format)						\
  		 KEY_READ_##format(name)				\
  		 KEY_OPS(name)
07caf9d6c   Eliad Peller   mac80211: refacto...
45
46
47
48
  #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...
49
50
51
52
  
  #define KEY_CONF_OPS(name)						\
  static const struct file_operations key_ ##name## _ops = {		\
  	.read = key_conf_##name##_read,					\
234e34058   Stephen Boyd   simple_open: auto...
53
  	.open = simple_open,						\
2b18ab36c   Arnd Bergmann   net/wireless: use...
54
  	.llseek = generic_file_llseek,					\
8f20fc249   Johannes Berg   [MAC80211]: embed...
55
56
57
58
59
60
61
62
63
  }
  
  #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...
64
  KEY_FILE(flags, X);
07caf9d6c   Eliad Peller   mac80211: refacto...
65
66
  KEY_READ(ifindex, sdata->name, "%s
  ");
e7a64f12a   Johannes Berg   [MAC80211]: add i...
67
  KEY_OPS(ifindex);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
68
69
70
71
72
  
  static ssize_t key_algorithm_read(struct file *file,
  				  char __user *userbuf,
  				  size_t count, loff_t *ppos)
  {
97359d123   Johannes Berg   mac80211: use cip...
73
  	char buf[15];
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
74
  	struct ieee80211_key *key = file->private_data;
97359d123   Johannes Berg   mac80211: use cip...
75
  	u32 c = key->conf.cipher;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
76

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

8f20fc249   Johannes Berg   [MAC80211]: embed...
319
320
  	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...
321
322
323
324
325
326
327
328
329
  	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...
330
  	debugfs_create_file(#name, 0400, key->debugfs.dir, \
84674ef4d   Tom Rix   mac80211: remove ...
331
  			    key, &key_##name##_ops)
d0a77c656   Johannes Berg   mac80211: allow w...
332
333
334
  #define DEBUGFS_ADD_W(name) \
  	debugfs_create_file(#name, 0600, key->debugfs.dir, \
  			    key, &key_##name##_ops);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
335

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

3b96766f0   Johannes Berg   mac80211: fix key...
342
  	if (!key->local->debugfs.keys)
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
343
  		return;
50339a67e   Johannes Berg   [MAC80211]: fix k...
344
  	sprintf(buf, "%d", keycount);
d9c58f30b   Johannes Berg   mac80211: fix key...
345
  	key->debugfs.cnt = keycount;
50339a67e   Johannes Berg   [MAC80211]: fix k...
346
  	keycount++;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
347
  	key->debugfs.dir = debugfs_create_dir(buf,
3b96766f0   Johannes Berg   mac80211: fix key...
348
  					key->local->debugfs.keys);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
349

40b275b69   Johannes Berg   mac80211: sparse ...
350
351
  	sta = key->sta;
  	if (sta) {
9446f3efc   Johannes Berg   mac80211: fix deb...
352
353
  		sprintf(buf, "../../netdev:%s/stations/%pM",
  			sta->sdata->name, sta->sta.addr);
3b96766f0   Johannes Berg   mac80211: fix key...
354
355
  		key->debugfs.stalink =
  			debugfs_create_symlink("station", key->debugfs.dir, buf);
40b275b69   Johannes Berg   mac80211: sparse ...
356
  	}
3b96766f0   Johannes Berg   mac80211: fix key...
357

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

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

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

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

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

3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
412
413
414
415
  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...
416
  	if (!sdata->vif.debugfs_dir)
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
417
  		return;
40b275b69   Johannes Berg   mac80211: sparse ...
418
419
  	key = key_mtx_dereference(sdata->local,
  				  sdata->default_mgmt_key);
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
420
421
  	if (key) {
  		sprintf(buf, "../keys/%d", key->debugfs.cnt);
7bcfaf2f4   Johannes Berg   cfg80211/mac80211...
422
  		sdata->debugfs.default_mgmt_key =
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
423
  			debugfs_create_symlink("default_mgmt_key",
ddbfe860a   Stanislaw Gruszka   mac80211: move sd...
424
  					       sdata->vif.debugfs_dir, buf);
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
425
426
427
428
429
430
431
432
  	} 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...
433
434
  	debugfs_remove(sdata->debugfs.default_mgmt_key);
  	sdata->debugfs.default_mgmt_key = NULL;
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
435
  }
e5473e80d   Jouni Malinen   mac80211: Support...
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
  void
  ieee80211_debugfs_key_add_beacon_default(struct ieee80211_sub_if_data *sdata)
  {
  	char buf[50];
  	struct ieee80211_key *key;
  
  	if (!sdata->vif.debugfs_dir)
  		return;
  
  	key = key_mtx_dereference(sdata->local,
  				  sdata->default_beacon_key);
  	if (key) {
  		sprintf(buf, "../keys/%d", key->debugfs.cnt);
  		sdata->debugfs.default_beacon_key =
  			debugfs_create_symlink("default_beacon_key",
  					       sdata->vif.debugfs_dir, buf);
  	} else {
  		ieee80211_debugfs_key_remove_beacon_default(sdata);
  	}
  }
  
  void
  ieee80211_debugfs_key_remove_beacon_default(struct ieee80211_sub_if_data *sdata)
  {
  	if (!sdata)
  		return;
  
  	debugfs_remove(sdata->debugfs.default_beacon_key);
  	sdata->debugfs.default_beacon_key = NULL;
  }
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
466
467
468
469
470
471
  void ieee80211_debugfs_key_sta_del(struct ieee80211_key *key,
  				   struct sta_info *sta)
  {
  	debugfs_remove(key->debugfs.stalink);
  	key->debugfs.stalink = NULL;
  }