diff options
Diffstat (limited to 'net/bluetooth/hci_core.c')
-rw-r--r-- | net/bluetooth/hci_core.c | 84 |
1 files changed, 73 insertions, 11 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 1c6ffaa8902f..0a43cce9a914 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #include <net/bluetooth/bluetooth.h> | 35 | #include <net/bluetooth/bluetooth.h> |
36 | #include <net/bluetooth/hci_core.h> | 36 | #include <net/bluetooth/hci_core.h> |
37 | #include <net/bluetooth/l2cap.h> | ||
37 | 38 | ||
38 | #include "smp.h" | 39 | #include "smp.h" |
39 | 40 | ||
@@ -579,6 +580,62 @@ static int sniff_max_interval_get(void *data, u64 *val) | |||
579 | DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get, | 580 | DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get, |
580 | sniff_max_interval_set, "%llu\n"); | 581 | sniff_max_interval_set, "%llu\n"); |
581 | 582 | ||
583 | static int conn_info_min_age_set(void *data, u64 val) | ||
584 | { | ||
585 | struct hci_dev *hdev = data; | ||
586 | |||
587 | if (val == 0 || val > hdev->conn_info_max_age) | ||
588 | return -EINVAL; | ||
589 | |||
590 | hci_dev_lock(hdev); | ||
591 | hdev->conn_info_min_age = val; | ||
592 | hci_dev_unlock(hdev); | ||
593 | |||
594 | return 0; | ||
595 | } | ||
596 | |||
597 | static int conn_info_min_age_get(void *data, u64 *val) | ||
598 | { | ||
599 | struct hci_dev *hdev = data; | ||
600 | |||
601 | hci_dev_lock(hdev); | ||
602 | *val = hdev->conn_info_min_age; | ||
603 | hci_dev_unlock(hdev); | ||
604 | |||
605 | return 0; | ||
606 | } | ||
607 | |||
608 | DEFINE_SIMPLE_ATTRIBUTE(conn_info_min_age_fops, conn_info_min_age_get, | ||
609 | conn_info_min_age_set, "%llu\n"); | ||
610 | |||
611 | static int conn_info_max_age_set(void *data, u64 val) | ||
612 | { | ||
613 | struct hci_dev *hdev = data; | ||
614 | |||
615 | if (val == 0 || val < hdev->conn_info_min_age) | ||
616 | return -EINVAL; | ||
617 | |||
618 | hci_dev_lock(hdev); | ||
619 | hdev->conn_info_max_age = val; | ||
620 | hci_dev_unlock(hdev); | ||
621 | |||
622 | return 0; | ||
623 | } | ||
624 | |||
625 | static int conn_info_max_age_get(void *data, u64 *val) | ||
626 | { | ||
627 | struct hci_dev *hdev = data; | ||
628 | |||
629 | hci_dev_lock(hdev); | ||
630 | *val = hdev->conn_info_max_age; | ||
631 | hci_dev_unlock(hdev); | ||
632 | |||
633 | return 0; | ||
634 | } | ||
635 | |||
636 | DEFINE_SIMPLE_ATTRIBUTE(conn_info_max_age_fops, conn_info_max_age_get, | ||
637 | conn_info_max_age_set, "%llu\n"); | ||
638 | |||
582 | static int identity_show(struct seq_file *f, void *p) | 639 | static int identity_show(struct seq_file *f, void *p) |
583 | { | 640 | { |
584 | struct hci_dev *hdev = f->private; | 641 | struct hci_dev *hdev = f->private; |
@@ -955,14 +1012,9 @@ static ssize_t le_auto_conn_write(struct file *file, const char __user *data, | |||
955 | if (count < 3) | 1012 | if (count < 3) |
956 | return -EINVAL; | 1013 | return -EINVAL; |
957 | 1014 | ||
958 | buf = kzalloc(count, GFP_KERNEL); | 1015 | buf = memdup_user(data, count); |
959 | if (!buf) | 1016 | if (IS_ERR(buf)) |
960 | return -ENOMEM; | 1017 | return PTR_ERR(buf); |
961 | |||
962 | if (copy_from_user(buf, data, count)) { | ||
963 | err = -EFAULT; | ||
964 | goto done; | ||
965 | } | ||
966 | 1018 | ||
967 | if (memcmp(buf, "add", 3) == 0) { | 1019 | if (memcmp(buf, "add", 3) == 0) { |
968 | n = sscanf(&buf[4], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu %hhu", | 1020 | n = sscanf(&buf[4], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu %hhu", |
@@ -1759,6 +1811,11 @@ static int __hci_init(struct hci_dev *hdev) | |||
1759 | &blacklist_fops); | 1811 | &blacklist_fops); |
1760 | debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops); | 1812 | debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops); |
1761 | 1813 | ||
1814 | debugfs_create_file("conn_info_min_age", 0644, hdev->debugfs, hdev, | ||
1815 | &conn_info_min_age_fops); | ||
1816 | debugfs_create_file("conn_info_max_age", 0644, hdev->debugfs, hdev, | ||
1817 | &conn_info_max_age_fops); | ||
1818 | |||
1762 | if (lmp_bredr_capable(hdev)) { | 1819 | if (lmp_bredr_capable(hdev)) { |
1763 | debugfs_create_file("inquiry_cache", 0444, hdev->debugfs, | 1820 | debugfs_create_file("inquiry_cache", 0444, hdev->debugfs, |
1764 | hdev, &inquiry_cache_fops); | 1821 | hdev, &inquiry_cache_fops); |
@@ -1828,6 +1885,9 @@ static int __hci_init(struct hci_dev *hdev) | |||
1828 | &lowpan_debugfs_fops); | 1885 | &lowpan_debugfs_fops); |
1829 | debugfs_create_file("le_auto_conn", 0644, hdev->debugfs, hdev, | 1886 | debugfs_create_file("le_auto_conn", 0644, hdev->debugfs, hdev, |
1830 | &le_auto_conn_fops); | 1887 | &le_auto_conn_fops); |
1888 | debugfs_create_u16("discov_interleaved_timeout", 0644, | ||
1889 | hdev->debugfs, | ||
1890 | &hdev->discov_interleaved_timeout); | ||
1831 | } | 1891 | } |
1832 | 1892 | ||
1833 | return 0; | 1893 | return 0; |
@@ -2033,12 +2093,11 @@ bool hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data, | |||
2033 | 2093 | ||
2034 | hci_remove_remote_oob_data(hdev, &data->bdaddr); | 2094 | hci_remove_remote_oob_data(hdev, &data->bdaddr); |
2035 | 2095 | ||
2036 | if (ssp) | 2096 | *ssp = data->ssp_mode; |
2037 | *ssp = data->ssp_mode; | ||
2038 | 2097 | ||
2039 | ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr); | 2098 | ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr); |
2040 | if (ie) { | 2099 | if (ie) { |
2041 | if (ie->data.ssp_mode && ssp) | 2100 | if (ie->data.ssp_mode) |
2042 | *ssp = true; | 2101 | *ssp = true; |
2043 | 2102 | ||
2044 | if (ie->name_state == NAME_NEEDED && | 2103 | if (ie->name_state == NAME_NEEDED && |
@@ -3791,6 +3850,9 @@ struct hci_dev *hci_alloc_dev(void) | |||
3791 | hdev->le_conn_max_interval = 0x0038; | 3850 | hdev->le_conn_max_interval = 0x0038; |
3792 | 3851 | ||
3793 | hdev->rpa_timeout = HCI_DEFAULT_RPA_TIMEOUT; | 3852 | hdev->rpa_timeout = HCI_DEFAULT_RPA_TIMEOUT; |
3853 | hdev->discov_interleaved_timeout = DISCOV_INTERLEAVED_TIMEOUT; | ||
3854 | hdev->conn_info_min_age = DEFAULT_CONN_INFO_MIN_AGE; | ||
3855 | hdev->conn_info_max_age = DEFAULT_CONN_INFO_MAX_AGE; | ||
3794 | 3856 | ||
3795 | mutex_init(&hdev->lock); | 3857 | mutex_init(&hdev->lock); |
3796 | mutex_init(&hdev->req_lock); | 3858 | mutex_init(&hdev->req_lock); |