This source file includes following definitions.
- features_show
- device_id_show
- device_list_show
- blacklist_show
- uuids_show
- remote_oob_show
- conn_info_min_age_set
- conn_info_min_age_get
- conn_info_max_age_set
- conn_info_max_age_get
- use_debug_keys_read
- sc_only_mode_read
- hci_debugfs_create_common
- inquiry_cache_show
- link_keys_show
- dev_class_show
- voice_setting_get
- ssp_debug_mode_read
- auto_accept_delay_set
- min_encrypt_key_size_set
- min_encrypt_key_size_get
- auto_accept_delay_get
- idle_timeout_set
- idle_timeout_get
- sniff_min_interval_set
- sniff_min_interval_get
- sniff_max_interval_set
- sniff_max_interval_get
- hci_debugfs_create_bredr
- identity_show
- rpa_timeout_set
- rpa_timeout_get
- random_address_show
- static_address_show
- force_static_address_read
- force_static_address_write
- white_list_show
- resolv_list_show
- identity_resolving_keys_show
- long_term_keys_show
- conn_min_interval_set
- conn_min_interval_get
- conn_max_interval_set
- conn_max_interval_get
- conn_latency_set
- conn_latency_get
- supervision_timeout_set
- supervision_timeout_get
- adv_channel_map_set
- adv_channel_map_get
- adv_min_interval_set
- adv_min_interval_get
- adv_max_interval_set
- adv_max_interval_get
- auth_payload_timeout_set
- auth_payload_timeout_get
- hci_debugfs_create_le
- hci_debugfs_create_conn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include <linux/debugfs.h>
25
26 #include <net/bluetooth/bluetooth.h>
27 #include <net/bluetooth/hci_core.h>
28
29 #include "hci_debugfs.h"
30
31 #define DEFINE_QUIRK_ATTRIBUTE(__name, __quirk) \
32 static ssize_t __name ## _read(struct file *file, \
33 char __user *user_buf, \
34 size_t count, loff_t *ppos) \
35 { \
36 struct hci_dev *hdev = file->private_data; \
37 char buf[3]; \
38 \
39 buf[0] = test_bit(__quirk, &hdev->quirks) ? 'Y' : 'N'; \
40 buf[1] = '\n'; \
41 buf[2] = '\0'; \
42 return simple_read_from_buffer(user_buf, count, ppos, buf, 2); \
43 } \
44 \
45 static ssize_t __name ## _write(struct file *file, \
46 const char __user *user_buf, \
47 size_t count, loff_t *ppos) \
48 { \
49 struct hci_dev *hdev = file->private_data; \
50 bool enable; \
51 int err; \
52 \
53 if (test_bit(HCI_UP, &hdev->flags)) \
54 return -EBUSY; \
55 \
56 err = kstrtobool_from_user(user_buf, count, &enable); \
57 if (err) \
58 return err; \
59 \
60 if (enable == test_bit(__quirk, &hdev->quirks)) \
61 return -EALREADY; \
62 \
63 change_bit(__quirk, &hdev->quirks); \
64 \
65 return count; \
66 } \
67 \
68 static const struct file_operations __name ## _fops = { \
69 .open = simple_open, \
70 .read = __name ## _read, \
71 .write = __name ## _write, \
72 .llseek = default_llseek, \
73 } \
74
75 #define DEFINE_INFO_ATTRIBUTE(__name, __field) \
76 static int __name ## _show(struct seq_file *f, void *ptr) \
77 { \
78 struct hci_dev *hdev = f->private; \
79 \
80 hci_dev_lock(hdev); \
81 seq_printf(f, "%s\n", hdev->__field ? : ""); \
82 hci_dev_unlock(hdev); \
83 \
84 return 0; \
85 } \
86 \
87 DEFINE_SHOW_ATTRIBUTE(__name)
88
89 static int features_show(struct seq_file *f, void *ptr)
90 {
91 struct hci_dev *hdev = f->private;
92 u8 p;
93
94 hci_dev_lock(hdev);
95 for (p = 0; p < HCI_MAX_PAGES && p <= hdev->max_page; p++)
96 seq_printf(f, "%2u: %8ph\n", p, hdev->features[p]);
97 if (lmp_le_capable(hdev))
98 seq_printf(f, "LE: %8ph\n", hdev->le_features);
99 hci_dev_unlock(hdev);
100
101 return 0;
102 }
103
104 DEFINE_SHOW_ATTRIBUTE(features);
105
106 static int device_id_show(struct seq_file *f, void *ptr)
107 {
108 struct hci_dev *hdev = f->private;
109
110 hci_dev_lock(hdev);
111 seq_printf(f, "%4.4x:%4.4x:%4.4x:%4.4x\n", hdev->devid_source,
112 hdev->devid_vendor, hdev->devid_product, hdev->devid_version);
113 hci_dev_unlock(hdev);
114
115 return 0;
116 }
117
118 DEFINE_SHOW_ATTRIBUTE(device_id);
119
120 static int device_list_show(struct seq_file *f, void *ptr)
121 {
122 struct hci_dev *hdev = f->private;
123 struct hci_conn_params *p;
124 struct bdaddr_list *b;
125
126 hci_dev_lock(hdev);
127 list_for_each_entry(b, &hdev->whitelist, list)
128 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
129 list_for_each_entry(p, &hdev->le_conn_params, list) {
130 seq_printf(f, "%pMR (type %u) %u\n", &p->addr, p->addr_type,
131 p->auto_connect);
132 }
133 hci_dev_unlock(hdev);
134
135 return 0;
136 }
137
138 DEFINE_SHOW_ATTRIBUTE(device_list);
139
140 static int blacklist_show(struct seq_file *f, void *p)
141 {
142 struct hci_dev *hdev = f->private;
143 struct bdaddr_list *b;
144
145 hci_dev_lock(hdev);
146 list_for_each_entry(b, &hdev->blacklist, list)
147 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
148 hci_dev_unlock(hdev);
149
150 return 0;
151 }
152
153 DEFINE_SHOW_ATTRIBUTE(blacklist);
154
155 static int uuids_show(struct seq_file *f, void *p)
156 {
157 struct hci_dev *hdev = f->private;
158 struct bt_uuid *uuid;
159
160 hci_dev_lock(hdev);
161 list_for_each_entry(uuid, &hdev->uuids, list) {
162 u8 i, val[16];
163
164
165
166
167
168 for (i = 0; i < 16; i++)
169 val[i] = uuid->uuid[15 - i];
170
171 seq_printf(f, "%pUb\n", val);
172 }
173 hci_dev_unlock(hdev);
174
175 return 0;
176 }
177
178 DEFINE_SHOW_ATTRIBUTE(uuids);
179
180 static int remote_oob_show(struct seq_file *f, void *ptr)
181 {
182 struct hci_dev *hdev = f->private;
183 struct oob_data *data;
184
185 hci_dev_lock(hdev);
186 list_for_each_entry(data, &hdev->remote_oob_data, list) {
187 seq_printf(f, "%pMR (type %u) %u %*phN %*phN %*phN %*phN\n",
188 &data->bdaddr, data->bdaddr_type, data->present,
189 16, data->hash192, 16, data->rand192,
190 16, data->hash256, 16, data->rand256);
191 }
192 hci_dev_unlock(hdev);
193
194 return 0;
195 }
196
197 DEFINE_SHOW_ATTRIBUTE(remote_oob);
198
199 static int conn_info_min_age_set(void *data, u64 val)
200 {
201 struct hci_dev *hdev = data;
202
203 if (val == 0 || val > hdev->conn_info_max_age)
204 return -EINVAL;
205
206 hci_dev_lock(hdev);
207 hdev->conn_info_min_age = val;
208 hci_dev_unlock(hdev);
209
210 return 0;
211 }
212
213 static int conn_info_min_age_get(void *data, u64 *val)
214 {
215 struct hci_dev *hdev = data;
216
217 hci_dev_lock(hdev);
218 *val = hdev->conn_info_min_age;
219 hci_dev_unlock(hdev);
220
221 return 0;
222 }
223
224 DEFINE_SIMPLE_ATTRIBUTE(conn_info_min_age_fops, conn_info_min_age_get,
225 conn_info_min_age_set, "%llu\n");
226
227 static int conn_info_max_age_set(void *data, u64 val)
228 {
229 struct hci_dev *hdev = data;
230
231 if (val == 0 || val < hdev->conn_info_min_age)
232 return -EINVAL;
233
234 hci_dev_lock(hdev);
235 hdev->conn_info_max_age = val;
236 hci_dev_unlock(hdev);
237
238 return 0;
239 }
240
241 static int conn_info_max_age_get(void *data, u64 *val)
242 {
243 struct hci_dev *hdev = data;
244
245 hci_dev_lock(hdev);
246 *val = hdev->conn_info_max_age;
247 hci_dev_unlock(hdev);
248
249 return 0;
250 }
251
252 DEFINE_SIMPLE_ATTRIBUTE(conn_info_max_age_fops, conn_info_max_age_get,
253 conn_info_max_age_set, "%llu\n");
254
255 static ssize_t use_debug_keys_read(struct file *file, char __user *user_buf,
256 size_t count, loff_t *ppos)
257 {
258 struct hci_dev *hdev = file->private_data;
259 char buf[3];
260
261 buf[0] = hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS) ? 'Y': 'N';
262 buf[1] = '\n';
263 buf[2] = '\0';
264 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
265 }
266
267 static const struct file_operations use_debug_keys_fops = {
268 .open = simple_open,
269 .read = use_debug_keys_read,
270 .llseek = default_llseek,
271 };
272
273 static ssize_t sc_only_mode_read(struct file *file, char __user *user_buf,
274 size_t count, loff_t *ppos)
275 {
276 struct hci_dev *hdev = file->private_data;
277 char buf[3];
278
279 buf[0] = hci_dev_test_flag(hdev, HCI_SC_ONLY) ? 'Y': 'N';
280 buf[1] = '\n';
281 buf[2] = '\0';
282 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
283 }
284
285 static const struct file_operations sc_only_mode_fops = {
286 .open = simple_open,
287 .read = sc_only_mode_read,
288 .llseek = default_llseek,
289 };
290
291 DEFINE_INFO_ATTRIBUTE(hardware_info, hw_info);
292 DEFINE_INFO_ATTRIBUTE(firmware_info, fw_info);
293
294 void hci_debugfs_create_common(struct hci_dev *hdev)
295 {
296 debugfs_create_file("features", 0444, hdev->debugfs, hdev,
297 &features_fops);
298 debugfs_create_u16("manufacturer", 0444, hdev->debugfs,
299 &hdev->manufacturer);
300 debugfs_create_u8("hci_version", 0444, hdev->debugfs, &hdev->hci_ver);
301 debugfs_create_u16("hci_revision", 0444, hdev->debugfs, &hdev->hci_rev);
302 debugfs_create_u8("hardware_error", 0444, hdev->debugfs,
303 &hdev->hw_error_code);
304 debugfs_create_file("device_id", 0444, hdev->debugfs, hdev,
305 &device_id_fops);
306
307 debugfs_create_file("device_list", 0444, hdev->debugfs, hdev,
308 &device_list_fops);
309 debugfs_create_file("blacklist", 0444, hdev->debugfs, hdev,
310 &blacklist_fops);
311 debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops);
312 debugfs_create_file("remote_oob", 0400, hdev->debugfs, hdev,
313 &remote_oob_fops);
314
315 debugfs_create_file("conn_info_min_age", 0644, hdev->debugfs, hdev,
316 &conn_info_min_age_fops);
317 debugfs_create_file("conn_info_max_age", 0644, hdev->debugfs, hdev,
318 &conn_info_max_age_fops);
319
320 if (lmp_ssp_capable(hdev) || lmp_le_capable(hdev))
321 debugfs_create_file("use_debug_keys", 0444, hdev->debugfs,
322 hdev, &use_debug_keys_fops);
323
324 if (lmp_sc_capable(hdev) || lmp_le_capable(hdev))
325 debugfs_create_file("sc_only_mode", 0444, hdev->debugfs,
326 hdev, &sc_only_mode_fops);
327
328 if (hdev->hw_info)
329 debugfs_create_file("hardware_info", 0444, hdev->debugfs,
330 hdev, &hardware_info_fops);
331
332 if (hdev->fw_info)
333 debugfs_create_file("firmware_info", 0444, hdev->debugfs,
334 hdev, &firmware_info_fops);
335 }
336
337 static int inquiry_cache_show(struct seq_file *f, void *p)
338 {
339 struct hci_dev *hdev = f->private;
340 struct discovery_state *cache = &hdev->discovery;
341 struct inquiry_entry *e;
342
343 hci_dev_lock(hdev);
344
345 list_for_each_entry(e, &cache->all, all) {
346 struct inquiry_data *data = &e->data;
347 seq_printf(f, "%pMR %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
348 &data->bdaddr,
349 data->pscan_rep_mode, data->pscan_period_mode,
350 data->pscan_mode, data->dev_class[2],
351 data->dev_class[1], data->dev_class[0],
352 __le16_to_cpu(data->clock_offset),
353 data->rssi, data->ssp_mode, e->timestamp);
354 }
355
356 hci_dev_unlock(hdev);
357
358 return 0;
359 }
360
361 DEFINE_SHOW_ATTRIBUTE(inquiry_cache);
362
363 static int link_keys_show(struct seq_file *f, void *ptr)
364 {
365 struct hci_dev *hdev = f->private;
366 struct link_key *key;
367
368 rcu_read_lock();
369 list_for_each_entry_rcu(key, &hdev->link_keys, list)
370 seq_printf(f, "%pMR %u %*phN %u\n", &key->bdaddr, key->type,
371 HCI_LINK_KEY_SIZE, key->val, key->pin_len);
372 rcu_read_unlock();
373
374 return 0;
375 }
376
377 DEFINE_SHOW_ATTRIBUTE(link_keys);
378
379 static int dev_class_show(struct seq_file *f, void *ptr)
380 {
381 struct hci_dev *hdev = f->private;
382
383 hci_dev_lock(hdev);
384 seq_printf(f, "0x%.2x%.2x%.2x\n", hdev->dev_class[2],
385 hdev->dev_class[1], hdev->dev_class[0]);
386 hci_dev_unlock(hdev);
387
388 return 0;
389 }
390
391 DEFINE_SHOW_ATTRIBUTE(dev_class);
392
393 static int voice_setting_get(void *data, u64 *val)
394 {
395 struct hci_dev *hdev = data;
396
397 hci_dev_lock(hdev);
398 *val = hdev->voice_setting;
399 hci_dev_unlock(hdev);
400
401 return 0;
402 }
403
404 DEFINE_SIMPLE_ATTRIBUTE(voice_setting_fops, voice_setting_get,
405 NULL, "0x%4.4llx\n");
406
407 static ssize_t ssp_debug_mode_read(struct file *file, char __user *user_buf,
408 size_t count, loff_t *ppos)
409 {
410 struct hci_dev *hdev = file->private_data;
411 char buf[3];
412
413 buf[0] = hdev->ssp_debug_mode ? 'Y': 'N';
414 buf[1] = '\n';
415 buf[2] = '\0';
416 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
417 }
418
419 static const struct file_operations ssp_debug_mode_fops = {
420 .open = simple_open,
421 .read = ssp_debug_mode_read,
422 .llseek = default_llseek,
423 };
424
425 static int auto_accept_delay_set(void *data, u64 val)
426 {
427 struct hci_dev *hdev = data;
428
429 hci_dev_lock(hdev);
430 hdev->auto_accept_delay = val;
431 hci_dev_unlock(hdev);
432
433 return 0;
434 }
435
436 static int min_encrypt_key_size_set(void *data, u64 val)
437 {
438 struct hci_dev *hdev = data;
439
440 if (val < 1 || val > 16)
441 return -EINVAL;
442
443 hci_dev_lock(hdev);
444 hdev->min_enc_key_size = val;
445 hci_dev_unlock(hdev);
446
447 return 0;
448 }
449
450 static int min_encrypt_key_size_get(void *data, u64 *val)
451 {
452 struct hci_dev *hdev = data;
453
454 hci_dev_lock(hdev);
455 *val = hdev->min_enc_key_size;
456 hci_dev_unlock(hdev);
457
458 return 0;
459 }
460
461 DEFINE_SIMPLE_ATTRIBUTE(min_encrypt_key_size_fops,
462 min_encrypt_key_size_get,
463 min_encrypt_key_size_set, "%llu\n");
464
465 static int auto_accept_delay_get(void *data, u64 *val)
466 {
467 struct hci_dev *hdev = data;
468
469 hci_dev_lock(hdev);
470 *val = hdev->auto_accept_delay;
471 hci_dev_unlock(hdev);
472
473 return 0;
474 }
475
476 DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get,
477 auto_accept_delay_set, "%llu\n");
478
479 static int idle_timeout_set(void *data, u64 val)
480 {
481 struct hci_dev *hdev = data;
482
483 if (val != 0 && (val < 500 || val > 3600000))
484 return -EINVAL;
485
486 hci_dev_lock(hdev);
487 hdev->idle_timeout = val;
488 hci_dev_unlock(hdev);
489
490 return 0;
491 }
492
493 static int idle_timeout_get(void *data, u64 *val)
494 {
495 struct hci_dev *hdev = data;
496
497 hci_dev_lock(hdev);
498 *val = hdev->idle_timeout;
499 hci_dev_unlock(hdev);
500
501 return 0;
502 }
503
504 DEFINE_SIMPLE_ATTRIBUTE(idle_timeout_fops, idle_timeout_get,
505 idle_timeout_set, "%llu\n");
506
507 static int sniff_min_interval_set(void *data, u64 val)
508 {
509 struct hci_dev *hdev = data;
510
511 if (val == 0 || val % 2 || val > hdev->sniff_max_interval)
512 return -EINVAL;
513
514 hci_dev_lock(hdev);
515 hdev->sniff_min_interval = val;
516 hci_dev_unlock(hdev);
517
518 return 0;
519 }
520
521 static int sniff_min_interval_get(void *data, u64 *val)
522 {
523 struct hci_dev *hdev = data;
524
525 hci_dev_lock(hdev);
526 *val = hdev->sniff_min_interval;
527 hci_dev_unlock(hdev);
528
529 return 0;
530 }
531
532 DEFINE_SIMPLE_ATTRIBUTE(sniff_min_interval_fops, sniff_min_interval_get,
533 sniff_min_interval_set, "%llu\n");
534
535 static int sniff_max_interval_set(void *data, u64 val)
536 {
537 struct hci_dev *hdev = data;
538
539 if (val == 0 || val % 2 || val < hdev->sniff_min_interval)
540 return -EINVAL;
541
542 hci_dev_lock(hdev);
543 hdev->sniff_max_interval = val;
544 hci_dev_unlock(hdev);
545
546 return 0;
547 }
548
549 static int sniff_max_interval_get(void *data, u64 *val)
550 {
551 struct hci_dev *hdev = data;
552
553 hci_dev_lock(hdev);
554 *val = hdev->sniff_max_interval;
555 hci_dev_unlock(hdev);
556
557 return 0;
558 }
559
560 DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get,
561 sniff_max_interval_set, "%llu\n");
562
563 void hci_debugfs_create_bredr(struct hci_dev *hdev)
564 {
565 debugfs_create_file("inquiry_cache", 0444, hdev->debugfs, hdev,
566 &inquiry_cache_fops);
567 debugfs_create_file("link_keys", 0400, hdev->debugfs, hdev,
568 &link_keys_fops);
569 debugfs_create_file("dev_class", 0444, hdev->debugfs, hdev,
570 &dev_class_fops);
571 debugfs_create_file("voice_setting", 0444, hdev->debugfs, hdev,
572 &voice_setting_fops);
573
574 if (lmp_ssp_capable(hdev)) {
575 debugfs_create_file("ssp_debug_mode", 0444, hdev->debugfs,
576 hdev, &ssp_debug_mode_fops);
577 debugfs_create_file("min_encrypt_key_size", 0644, hdev->debugfs,
578 hdev, &min_encrypt_key_size_fops);
579 debugfs_create_file("auto_accept_delay", 0644, hdev->debugfs,
580 hdev, &auto_accept_delay_fops);
581 }
582
583 if (lmp_sniff_capable(hdev)) {
584 debugfs_create_file("idle_timeout", 0644, hdev->debugfs,
585 hdev, &idle_timeout_fops);
586 debugfs_create_file("sniff_min_interval", 0644, hdev->debugfs,
587 hdev, &sniff_min_interval_fops);
588 debugfs_create_file("sniff_max_interval", 0644, hdev->debugfs,
589 hdev, &sniff_max_interval_fops);
590 }
591 }
592
593 static int identity_show(struct seq_file *f, void *p)
594 {
595 struct hci_dev *hdev = f->private;
596 bdaddr_t addr;
597 u8 addr_type;
598
599 hci_dev_lock(hdev);
600
601 hci_copy_identity_address(hdev, &addr, &addr_type);
602
603 seq_printf(f, "%pMR (type %u) %*phN %pMR\n", &addr, addr_type,
604 16, hdev->irk, &hdev->rpa);
605
606 hci_dev_unlock(hdev);
607
608 return 0;
609 }
610
611 DEFINE_SHOW_ATTRIBUTE(identity);
612
613 static int rpa_timeout_set(void *data, u64 val)
614 {
615 struct hci_dev *hdev = data;
616
617
618
619
620 if (val < 30 || val > (60 * 60 * 24))
621 return -EINVAL;
622
623 hci_dev_lock(hdev);
624 hdev->rpa_timeout = val;
625 hci_dev_unlock(hdev);
626
627 return 0;
628 }
629
630 static int rpa_timeout_get(void *data, u64 *val)
631 {
632 struct hci_dev *hdev = data;
633
634 hci_dev_lock(hdev);
635 *val = hdev->rpa_timeout;
636 hci_dev_unlock(hdev);
637
638 return 0;
639 }
640
641 DEFINE_SIMPLE_ATTRIBUTE(rpa_timeout_fops, rpa_timeout_get,
642 rpa_timeout_set, "%llu\n");
643
644 static int random_address_show(struct seq_file *f, void *p)
645 {
646 struct hci_dev *hdev = f->private;
647
648 hci_dev_lock(hdev);
649 seq_printf(f, "%pMR\n", &hdev->random_addr);
650 hci_dev_unlock(hdev);
651
652 return 0;
653 }
654
655 DEFINE_SHOW_ATTRIBUTE(random_address);
656
657 static int static_address_show(struct seq_file *f, void *p)
658 {
659 struct hci_dev *hdev = f->private;
660
661 hci_dev_lock(hdev);
662 seq_printf(f, "%pMR\n", &hdev->static_addr);
663 hci_dev_unlock(hdev);
664
665 return 0;
666 }
667
668 DEFINE_SHOW_ATTRIBUTE(static_address);
669
670 static ssize_t force_static_address_read(struct file *file,
671 char __user *user_buf,
672 size_t count, loff_t *ppos)
673 {
674 struct hci_dev *hdev = file->private_data;
675 char buf[3];
676
677 buf[0] = hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ? 'Y': 'N';
678 buf[1] = '\n';
679 buf[2] = '\0';
680 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
681 }
682
683 static ssize_t force_static_address_write(struct file *file,
684 const char __user *user_buf,
685 size_t count, loff_t *ppos)
686 {
687 struct hci_dev *hdev = file->private_data;
688 bool enable;
689 int err;
690
691 if (test_bit(HCI_UP, &hdev->flags))
692 return -EBUSY;
693
694 err = kstrtobool_from_user(user_buf, count, &enable);
695 if (err)
696 return err;
697
698 if (enable == hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR))
699 return -EALREADY;
700
701 hci_dev_change_flag(hdev, HCI_FORCE_STATIC_ADDR);
702
703 return count;
704 }
705
706 static const struct file_operations force_static_address_fops = {
707 .open = simple_open,
708 .read = force_static_address_read,
709 .write = force_static_address_write,
710 .llseek = default_llseek,
711 };
712
713 static int white_list_show(struct seq_file *f, void *ptr)
714 {
715 struct hci_dev *hdev = f->private;
716 struct bdaddr_list *b;
717
718 hci_dev_lock(hdev);
719 list_for_each_entry(b, &hdev->le_white_list, list)
720 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
721 hci_dev_unlock(hdev);
722
723 return 0;
724 }
725
726 DEFINE_SHOW_ATTRIBUTE(white_list);
727
728 static int resolv_list_show(struct seq_file *f, void *ptr)
729 {
730 struct hci_dev *hdev = f->private;
731 struct bdaddr_list *b;
732
733 hci_dev_lock(hdev);
734 list_for_each_entry(b, &hdev->le_resolv_list, list)
735 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
736 hci_dev_unlock(hdev);
737
738 return 0;
739 }
740
741 DEFINE_SHOW_ATTRIBUTE(resolv_list);
742
743 static int identity_resolving_keys_show(struct seq_file *f, void *ptr)
744 {
745 struct hci_dev *hdev = f->private;
746 struct smp_irk *irk;
747
748 rcu_read_lock();
749 list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
750 seq_printf(f, "%pMR (type %u) %*phN %pMR\n",
751 &irk->bdaddr, irk->addr_type,
752 16, irk->val, &irk->rpa);
753 }
754 rcu_read_unlock();
755
756 return 0;
757 }
758
759 DEFINE_SHOW_ATTRIBUTE(identity_resolving_keys);
760
761 static int long_term_keys_show(struct seq_file *f, void *ptr)
762 {
763 struct hci_dev *hdev = f->private;
764 struct smp_ltk *ltk;
765
766 rcu_read_lock();
767 list_for_each_entry_rcu(ltk, &hdev->long_term_keys, list)
768 seq_printf(f, "%pMR (type %u) %u 0x%02x %u %.4x %.16llx %*phN\n",
769 <k->bdaddr, ltk->bdaddr_type, ltk->authenticated,
770 ltk->type, ltk->enc_size, __le16_to_cpu(ltk->ediv),
771 __le64_to_cpu(ltk->rand), 16, ltk->val);
772 rcu_read_unlock();
773
774 return 0;
775 }
776
777 DEFINE_SHOW_ATTRIBUTE(long_term_keys);
778
779 static int conn_min_interval_set(void *data, u64 val)
780 {
781 struct hci_dev *hdev = data;
782
783 if (val < 0x0006 || val > 0x0c80 || val > hdev->le_conn_max_interval)
784 return -EINVAL;
785
786 hci_dev_lock(hdev);
787 hdev->le_conn_min_interval = val;
788 hci_dev_unlock(hdev);
789
790 return 0;
791 }
792
793 static int conn_min_interval_get(void *data, u64 *val)
794 {
795 struct hci_dev *hdev = data;
796
797 hci_dev_lock(hdev);
798 *val = hdev->le_conn_min_interval;
799 hci_dev_unlock(hdev);
800
801 return 0;
802 }
803
804 DEFINE_SIMPLE_ATTRIBUTE(conn_min_interval_fops, conn_min_interval_get,
805 conn_min_interval_set, "%llu\n");
806
807 static int conn_max_interval_set(void *data, u64 val)
808 {
809 struct hci_dev *hdev = data;
810
811 if (val < 0x0006 || val > 0x0c80 || val < hdev->le_conn_min_interval)
812 return -EINVAL;
813
814 hci_dev_lock(hdev);
815 hdev->le_conn_max_interval = val;
816 hci_dev_unlock(hdev);
817
818 return 0;
819 }
820
821 static int conn_max_interval_get(void *data, u64 *val)
822 {
823 struct hci_dev *hdev = data;
824
825 hci_dev_lock(hdev);
826 *val = hdev->le_conn_max_interval;
827 hci_dev_unlock(hdev);
828
829 return 0;
830 }
831
832 DEFINE_SIMPLE_ATTRIBUTE(conn_max_interval_fops, conn_max_interval_get,
833 conn_max_interval_set, "%llu\n");
834
835 static int conn_latency_set(void *data, u64 val)
836 {
837 struct hci_dev *hdev = data;
838
839 if (val > 0x01f3)
840 return -EINVAL;
841
842 hci_dev_lock(hdev);
843 hdev->le_conn_latency = val;
844 hci_dev_unlock(hdev);
845
846 return 0;
847 }
848
849 static int conn_latency_get(void *data, u64 *val)
850 {
851 struct hci_dev *hdev = data;
852
853 hci_dev_lock(hdev);
854 *val = hdev->le_conn_latency;
855 hci_dev_unlock(hdev);
856
857 return 0;
858 }
859
860 DEFINE_SIMPLE_ATTRIBUTE(conn_latency_fops, conn_latency_get,
861 conn_latency_set, "%llu\n");
862
863 static int supervision_timeout_set(void *data, u64 val)
864 {
865 struct hci_dev *hdev = data;
866
867 if (val < 0x000a || val > 0x0c80)
868 return -EINVAL;
869
870 hci_dev_lock(hdev);
871 hdev->le_supv_timeout = val;
872 hci_dev_unlock(hdev);
873
874 return 0;
875 }
876
877 static int supervision_timeout_get(void *data, u64 *val)
878 {
879 struct hci_dev *hdev = data;
880
881 hci_dev_lock(hdev);
882 *val = hdev->le_supv_timeout;
883 hci_dev_unlock(hdev);
884
885 return 0;
886 }
887
888 DEFINE_SIMPLE_ATTRIBUTE(supervision_timeout_fops, supervision_timeout_get,
889 supervision_timeout_set, "%llu\n");
890
891 static int adv_channel_map_set(void *data, u64 val)
892 {
893 struct hci_dev *hdev = data;
894
895 if (val < 0x01 || val > 0x07)
896 return -EINVAL;
897
898 hci_dev_lock(hdev);
899 hdev->le_adv_channel_map = val;
900 hci_dev_unlock(hdev);
901
902 return 0;
903 }
904
905 static int adv_channel_map_get(void *data, u64 *val)
906 {
907 struct hci_dev *hdev = data;
908
909 hci_dev_lock(hdev);
910 *val = hdev->le_adv_channel_map;
911 hci_dev_unlock(hdev);
912
913 return 0;
914 }
915
916 DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get,
917 adv_channel_map_set, "%llu\n");
918
919 static int adv_min_interval_set(void *data, u64 val)
920 {
921 struct hci_dev *hdev = data;
922
923 if (val < 0x0020 || val > 0x4000 || val > hdev->le_adv_max_interval)
924 return -EINVAL;
925
926 hci_dev_lock(hdev);
927 hdev->le_adv_min_interval = val;
928 hci_dev_unlock(hdev);
929
930 return 0;
931 }
932
933 static int adv_min_interval_get(void *data, u64 *val)
934 {
935 struct hci_dev *hdev = data;
936
937 hci_dev_lock(hdev);
938 *val = hdev->le_adv_min_interval;
939 hci_dev_unlock(hdev);
940
941 return 0;
942 }
943
944 DEFINE_SIMPLE_ATTRIBUTE(adv_min_interval_fops, adv_min_interval_get,
945 adv_min_interval_set, "%llu\n");
946
947 static int adv_max_interval_set(void *data, u64 val)
948 {
949 struct hci_dev *hdev = data;
950
951 if (val < 0x0020 || val > 0x4000 || val < hdev->le_adv_min_interval)
952 return -EINVAL;
953
954 hci_dev_lock(hdev);
955 hdev->le_adv_max_interval = val;
956 hci_dev_unlock(hdev);
957
958 return 0;
959 }
960
961 static int adv_max_interval_get(void *data, u64 *val)
962 {
963 struct hci_dev *hdev = data;
964
965 hci_dev_lock(hdev);
966 *val = hdev->le_adv_max_interval;
967 hci_dev_unlock(hdev);
968
969 return 0;
970 }
971
972 DEFINE_SIMPLE_ATTRIBUTE(adv_max_interval_fops, adv_max_interval_get,
973 adv_max_interval_set, "%llu\n");
974
975 static int auth_payload_timeout_set(void *data, u64 val)
976 {
977 struct hci_dev *hdev = data;
978
979 if (val < 0x0001 || val > 0xffff)
980 return -EINVAL;
981
982 hci_dev_lock(hdev);
983 hdev->auth_payload_timeout = val;
984 hci_dev_unlock(hdev);
985
986 return 0;
987 }
988
989 static int auth_payload_timeout_get(void *data, u64 *val)
990 {
991 struct hci_dev *hdev = data;
992
993 hci_dev_lock(hdev);
994 *val = hdev->auth_payload_timeout;
995 hci_dev_unlock(hdev);
996
997 return 0;
998 }
999
1000 DEFINE_SIMPLE_ATTRIBUTE(auth_payload_timeout_fops,
1001 auth_payload_timeout_get,
1002 auth_payload_timeout_set, "%llu\n");
1003
1004 DEFINE_QUIRK_ATTRIBUTE(quirk_strict_duplicate_filter,
1005 HCI_QUIRK_STRICT_DUPLICATE_FILTER);
1006 DEFINE_QUIRK_ATTRIBUTE(quirk_simultaneous_discovery,
1007 HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
1008
1009 void hci_debugfs_create_le(struct hci_dev *hdev)
1010 {
1011 debugfs_create_file("identity", 0400, hdev->debugfs, hdev,
1012 &identity_fops);
1013 debugfs_create_file("rpa_timeout", 0644, hdev->debugfs, hdev,
1014 &rpa_timeout_fops);
1015 debugfs_create_file("random_address", 0444, hdev->debugfs, hdev,
1016 &random_address_fops);
1017 debugfs_create_file("static_address", 0444, hdev->debugfs, hdev,
1018 &static_address_fops);
1019
1020
1021
1022
1023
1024 if (bacmp(&hdev->bdaddr, BDADDR_ANY))
1025 debugfs_create_file("force_static_address", 0644,
1026 hdev->debugfs, hdev,
1027 &force_static_address_fops);
1028
1029 debugfs_create_u8("white_list_size", 0444, hdev->debugfs,
1030 &hdev->le_white_list_size);
1031 debugfs_create_file("white_list", 0444, hdev->debugfs, hdev,
1032 &white_list_fops);
1033 debugfs_create_u8("resolv_list_size", 0444, hdev->debugfs,
1034 &hdev->le_resolv_list_size);
1035 debugfs_create_file("resolv_list", 0444, hdev->debugfs, hdev,
1036 &resolv_list_fops);
1037 debugfs_create_file("identity_resolving_keys", 0400, hdev->debugfs,
1038 hdev, &identity_resolving_keys_fops);
1039 debugfs_create_file("long_term_keys", 0400, hdev->debugfs, hdev,
1040 &long_term_keys_fops);
1041 debugfs_create_file("conn_min_interval", 0644, hdev->debugfs, hdev,
1042 &conn_min_interval_fops);
1043 debugfs_create_file("conn_max_interval", 0644, hdev->debugfs, hdev,
1044 &conn_max_interval_fops);
1045 debugfs_create_file("conn_latency", 0644, hdev->debugfs, hdev,
1046 &conn_latency_fops);
1047 debugfs_create_file("supervision_timeout", 0644, hdev->debugfs, hdev,
1048 &supervision_timeout_fops);
1049 debugfs_create_file("adv_channel_map", 0644, hdev->debugfs, hdev,
1050 &adv_channel_map_fops);
1051 debugfs_create_file("adv_min_interval", 0644, hdev->debugfs, hdev,
1052 &adv_min_interval_fops);
1053 debugfs_create_file("adv_max_interval", 0644, hdev->debugfs, hdev,
1054 &adv_max_interval_fops);
1055 debugfs_create_u16("discov_interleaved_timeout", 0644, hdev->debugfs,
1056 &hdev->discov_interleaved_timeout);
1057 debugfs_create_file("auth_payload_timeout", 0644, hdev->debugfs, hdev,
1058 &auth_payload_timeout_fops);
1059
1060 debugfs_create_file("quirk_strict_duplicate_filter", 0644,
1061 hdev->debugfs, hdev,
1062 &quirk_strict_duplicate_filter_fops);
1063 debugfs_create_file("quirk_simultaneous_discovery", 0644,
1064 hdev->debugfs, hdev,
1065 &quirk_simultaneous_discovery_fops);
1066 }
1067
1068 void hci_debugfs_create_conn(struct hci_conn *conn)
1069 {
1070 struct hci_dev *hdev = conn->hdev;
1071 char name[6];
1072
1073 if (IS_ERR_OR_NULL(hdev->debugfs))
1074 return;
1075
1076 snprintf(name, sizeof(name), "%u", conn->handle);
1077 conn->debugfs = debugfs_create_dir(name, hdev->debugfs);
1078 }