Bluetooth: Expose hci connections through debugfs
Subsystems (2)
RFC v2 2/4 Bluetooth: Expose hci connections through debugfs
Add "connections" file to "hciX" debugfs directory and output hci_conn internal state.
Example file contents:
s a p
h t t o s k u s s p r
n y a u s e t e e i e
Dest l p t t p y h c c n f
BC:0D:A5:7A:F5:96 14 ACL 1 1 1 0xff 0 1 0 0 1
00:0D:FD:1E:99:30 13 ACL 1 0 0 0xff 4 2 2 0 1
00:07:61:B2:3E:97 12 ACL 1 0 0 0xff 4 0 0 0 2
00:07:61:76:D8:1B 11 ACL 1 0 0 0xff 4 1 0 0 2Signed-off-by Peter Hurley <[email protected]>
---
v2: Add example output to commit msg
net/bluetooth/hci_sysfs.c | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 46 insertions(+), 0 deletions(-)
net/bluetooth/hci_sysfs.c +46 -0
@@ -542,6 +542,49 @@ static int auto_accept_delay_get(void *data, u64 *val)DEFINE_SIMPLE_ATTRIBUTE (auto_accept_delay_fops, auto_accept_delay_get, auto_accept_delay_set,"%llu\n" ); +static int connections_show (struct seq_file *f,void *p) +{ +struct hci_dev *hdev = f->private; +struct hci_conn_hash *h = &hdev->conn_hash; +struct list_head *l; + +hci_dev_lock_bh (hdev); + +seq_printf (f," s a p\n" ); +seq_printf (f," h t t o s k u s s p r\n" ); +seq_printf (f," n y a u s e t e e i e\n" ); +seq_printf (f,"Dest l p t t p y h c c n f\n" ); + +list_for_each (l, &h->list) { +struct hci_conn *c; + c = list_entry(l, struct hci_conn, list); + +seq_printf (f,"%s %-3d %3s %d %d %d 0x%.2x %d %d %d %2d %d\n" , +batostr (&c->dst), c->handle, +link_typetostr (c->type), + c->state, c->out, c->ssp_mode, + c->key_type, c->auth_type, c->sec_level, + c->pending_sec_level, c->pin_length, +atomic_read (&c->devref)); + } + +hci_dev_unlock_bh (hdev); + +return 0 ; +} + +static int connections_open (struct inode *inode,struct file *file) +{ +return single_open (file, connections_show, inode->i_private); +} + +static const struct file_operations connections_fops = { + .open = connections_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +int hci_register_sysfs (struct hci_dev *hdev) {struct device *dev = &hdev->dev;
@@ -578,6 +621,9 @@ int hci_register_sysfs(struct hci_dev *hdev)debugfs_create_file ("auto_accept_delay" ,0444 , hdev->debugfs, hdev, &auto_accept_delay_fops); + +debugfs_create_file ("connections" ,0444 , hdev->debugfs, hdev, + &connections_fops);return 0 ; }
Signature · 1 line
1.7.4.1
Hi Peter,
Quoted 8 lines · Peter Hurley
Add "connections" file to "hciX" debugfs directory and output
hci_conninternal state.Example file contents:
s a p h t t o s k u s s p r n y a u s e t e e i e Dest l p t t p y h c c n f
I prefer if you do like this:
Dest handle type stat out ssp ...
everything on the same line.
Quoted 68 lines
BC:0D:A5:7A:F5:96 14 ACL 1 1 1 0xff 0 1 0 0 1 00:0D:FD:1E:99:30 13 ACL 1 0 0 0xff 4 2 2 0 1 00:07:61:B2:3E:97 12 ACL 1 0 0 0xff 4 0 0 0 2 00:07:61:76:D8:1B 11 ACL 1 0 0 0xff 4 1 0 0 2Signed-off-by Peter Hurley <[email protected]>---
v2: Add example output to commit msg
net/bluetooth/hci_sysfs.c | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 46 insertions(+), 0 deletions(-)net/bluetooth/hci_sysfs.c +43
-0@@ -542,6 +542,49 @@ static int auto_accept_delay_get(void *data, u64 *val)DEFINE_SIMPLE_ATTRIBUTE (auto_accept_delay_fops, auto_accept_delay_get, auto_accept_delay_set,"%llu\n" ); +static int connections_show (struct seq_file *f,void *p) +{ +struct hci_dev *hdev = f->private; +struct hci_conn_hash *h = &hdev->conn_hash; +struct list_head *l; + +hci_dev_lock_bh (hdev); + +seq_printf (f," s a p\n" ); +seq_printf (f," h t t o s k u s s p r\n" ); +seq_printf (f," n y a u s e t e e i e\n" ); +seq_printf (f,"Dest l p t t p y h c c n f\n" ); + +list_for_each (l, &h->list) { +struct hci_conn *c; + c = list_entry(l, struct hci_conn, list); + +seq_printf (f,"%s %-3d %3s %d %d %d 0x%.2x %d %d %d %2d %d\n" , +batostr (&c->dst), c->handle, +link_typetostr (c->type), + c->state, c->out, c->ssp_mode, + c->key_type, c->auth_type, c->sec_level, + c->pending_sec_level, c->pin_length, +atomic_read (&c->devref)); + } + +hci_dev_unlock_bh (hdev); + +return 0 ; +} + +static int connections_open (struct inode *inode,struct file *file) +{ +return single_open (file, connections_show, inode->i_private); +} + +static const struct file_operations connections_fops = { + .open = connections_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +int hci_register_sysfs (struct hci_dev *hdev) {struct device *dev = &hdev->dev;
net/bluetooth/hci_sysfs.c int hci_register_sysfs(struct hci_dev *hdev) · line 628
Quoted 8 lines
net/bluetooth/hci_sysfs.c +3
-0@@ -578,6 +621,9 @@ int hci_register_sysfs(struct hci_dev *hdev)debugfs_create_file ("auto_accept_delay" ,0444 , hdev->debugfs, hdev, &auto_accept_delay_fops); + +debugfs_create_file ("connections" ,0444 , hdev->debugfs, hdev, + &connections_fops);return 0 ; }
otherwise looks good.
Gustavo