|
@@ -1381,6 +1381,32 @@ unlock:
|
|
|
hci_dev_unlock(hdev);
|
|
|
}
|
|
|
|
|
|
+static int set_connectable_update_settings(struct hci_dev *hdev,
|
|
|
+ struct sock *sk, u8 val)
|
|
|
+{
|
|
|
+ bool changed = false;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ if (!!val != test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
|
|
|
+ changed = true;
|
|
|
+
|
|
|
+ if (val) {
|
|
|
+ set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
|
|
|
+ } else {
|
|
|
+ clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
|
|
|
+ clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
|
|
|
+ }
|
|
|
+
|
|
|
+ err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ if (changed)
|
|
|
+ return new_settings(hdev, sk);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
|
|
|
u16 len)
|
|
|
{
|
|
@@ -1404,25 +1430,7 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
|
|
|
hci_dev_lock(hdev);
|
|
|
|
|
|
if (!hdev_is_powered(hdev)) {
|
|
|
- bool changed = false;
|
|
|
-
|
|
|
- if (!!cp->val != test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
|
|
|
- changed = true;
|
|
|
-
|
|
|
- if (cp->val) {
|
|
|
- set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
|
|
|
- } else {
|
|
|
- clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
|
|
|
- clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
|
|
|
- }
|
|
|
-
|
|
|
- err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
|
|
|
- if (err < 0)
|
|
|
- goto failed;
|
|
|
-
|
|
|
- if (changed)
|
|
|
- err = new_settings(hdev, sk);
|
|
|
-
|
|
|
+ err = set_connectable_update_settings(hdev, sk, cp->val);
|
|
|
goto failed;
|
|
|
}
|
|
|
|