Re: [PATCH 6/9] Bluetooth: mgmt: Fix New Settings event for connectable/discoverable
From: Marcel Holtmann <marcel@holtmann.org>
Date: 2012-02-21 16:21:43
Hi Johan,
quoted hunk ↗ jump to hunk
When powered off and doing changes to the Connectable or Discoverable setting we should also send an appropriate New Settings event in addition to the command response. Signed-off-by: Johan Hedberg <redacted> --- net/bluetooth/mgmt.c | 41 ++++++++++++++++++++++++++++++++++------- 1 files changed, 34 insertions(+), 7 deletions(-)diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 74b6db1..96386ff 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c@@ -862,12 +862,26 @@ static int set_discoverable(struct sock *sk, u16 index, void *data, u16 len) } if (!hdev_is_powered(hdev)) { + bool changed = false; + if (cp->val) { + if (!test_and_set_bit(HCI_DISCOVERABLE, + &hdev->dev_flags)) + changed = true; set_bit(HCI_CONNECTABLE, &hdev->dev_flags); - set_bit(HCI_DISCOVERABLE, &hdev->dev_flags); - } else - clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags); + } else { + if (test_and_clear_bit(HCI_DISCOVERABLE, + &hdev->dev_flags)) + changed = true; + } +
does it really need to be this complicated? If we remove the set_bit for CONNECTABLE, then we can just send this one out. Since we know that something changed.
quoted hunk ↗ jump to hunk
err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev); + if (err < 0) + goto failed; + + if (changed) + err = new_settings(hdev, sk); + goto failed; }@@ -925,13 +939,26 @@ static int set_connectable(struct sock *sk, u16 index, void *data, u16 len) hci_dev_lock(hdev); if (!hdev_is_powered(hdev)) { - if (cp->val) - set_bit(HCI_CONNECTABLE, &hdev->dev_flags); - else { - clear_bit(HCI_CONNECTABLE, &hdev->dev_flags); + bool changed = false; + + if (cp->val) { + if (!test_and_set_bit(HCI_CONNECTABLE, + &hdev->dev_flags)) + changed = true; + } else { + if (test_and_clear_bit(HCI_CONNECTABLE, + &hdev->dev_flags)) + changed = true; clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags); } +
Same here. Even with the clearing of DISCOVERABLE, we should just send the new settings. event.
err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev); + if (err < 0) + goto failed; + + if (changed) + err = new_settings(hdev, sk); + goto failed; }
Regards Marcel