Bluetooth: Expose current identity information in debugfs
authorMarcel Holtmann <marcel@holtmann.org>
Sun, 23 Feb 2014 20:44:25 +0000 (12:44 -0800)
committerJohan Hedberg <johan.hedberg@intel.com>
Mon, 24 Feb 2014 06:26:02 +0000 (08:26 +0200)
When using LE Privacy it is useful to know the local identity address,
identity address type and identity resolving key. For debugging purposes
add these information to debugfs.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
net/bluetooth/hci_core.c

index 1651de959d9cb2d2153aee61443a72404183ac29..80462a126ebdeedcd7fe5dad93f339543efa712b 100644 (file)
@@ -579,6 +579,42 @@ static int sniff_max_interval_get(void *data, u64 *val)
 DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get,
                        sniff_max_interval_set, "%llu\n");
 
+static int identity_show(struct seq_file *f, void *p)
+{
+       struct hci_dev *hdev = f->private;
+       bdaddr_t *addr;
+       u8 addr_type;
+
+       hci_dev_lock(hdev);
+
+       if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dev_flags) ||
+           !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
+               addr = &hdev->static_addr;
+               addr_type = ADDR_LE_DEV_RANDOM;
+       } else {
+               addr = &hdev->bdaddr;
+               addr_type = ADDR_LE_DEV_PUBLIC;
+       }
+
+       seq_printf(f, "%pMR (type %u) %*phN\n", addr, addr_type, 16, hdev->irk);
+
+       hci_dev_unlock(hdev);
+
+       return 0;
+}
+
+static int identity_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, identity_show, inode->i_private);
+}
+
+static const struct file_operations identity_fops = {
+       .open           = identity_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
 static int random_address_show(struct seq_file *f, void *p)
 {
        struct hci_dev *hdev = f->private;
@@ -1624,12 +1660,14 @@ static int __hci_init(struct hci_dev *hdev)
        }
 
        if (lmp_le_capable(hdev)) {
+               debugfs_create_file("identity", 0400, hdev->debugfs,
+                                   hdev, &identity_fops);
+               debugfs_create_file("rpa_timeout", 0644, hdev->debugfs,
+                                   hdev, &rpa_timeout_fops);
                debugfs_create_file("random_address", 0444, hdev->debugfs,
                                    hdev, &random_address_fops);
                debugfs_create_file("static_address", 0444, hdev->debugfs,
                                    hdev, &static_address_fops);
-               debugfs_create_file("rpa_timeout", 0644, hdev->debugfs,
-                                   hdev, &rpa_timeout_fops);
 
                /* For controllers with a public address, provide a debug
                 * option to force the usage of the configured static