Bluetooth: Fix handling of discoverable setting with timeout
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 22 Feb 2012 17:21:00 +0000 (18:21 +0100)
committerJohan Hedberg <johan.hedberg@intel.com>
Thu, 23 Feb 2012 11:07:00 +0000 (13:07 +0200)
The current handling of the discoverable timeout was missing the proper
handling of the timeout when the mode was already set. Now the command
can be used to expire or retrigger the timeout.

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

index 6df4af6e99cc588bfe9fd6e38d731ce828946e33..f7e111f30434dc41ab77907aadc6ed650c105d77 100644 (file)
@@ -900,6 +900,17 @@ static int set_discoverable(struct sock *sk, u16 index, void *data, u16 len)
        }
 
        if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
+               if (hdev->discov_timeout > 0) {
+                       cancel_delayed_work(&hdev->discov_off);
+                       hdev->discov_timeout = 0;
+               }
+
+               if (cp->val && timeout > 0) {
+                       hdev->discov_timeout = timeout;
+                       queue_delayed_work(hdev->workqueue, &hdev->discov_off,
+                               msecs_to_jiffies(hdev->discov_timeout * 1000));
+               }
+
                err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
                goto failed;
        }