Commit 91a668b0 authored by Johan Hedberg's avatar Johan Hedberg Committed by Marcel Holtmann

Bluetooth: Fix setting HCI_CONNECTABLE from ioctl code

When the white list is in use the code would not update the
HCI_CONNECTABLE flag if it gets changed through the ioctl code (e.g.
hciconfig hci0 pscan). Since the flag is important for properly
accepting incoming connections add code to fix it up if necessary and
emit a New Settings mgmt event.
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent a55bd29d
...@@ -1281,6 +1281,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event); ...@@ -1281,6 +1281,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event);
#define DISCOV_BREDR_INQUIRY_LEN 0x08 #define DISCOV_BREDR_INQUIRY_LEN 0x08
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
int mgmt_new_settings(struct hci_dev *hdev);
void mgmt_index_added(struct hci_dev *hdev); void mgmt_index_added(struct hci_dev *hdev);
void mgmt_index_removed(struct hci_dev *hdev); void mgmt_index_removed(struct hci_dev *hdev);
void mgmt_set_powered_failed(struct hci_dev *hdev, int err); void mgmt_set_powered_failed(struct hci_dev *hdev, int err);
......
...@@ -2715,6 +2715,23 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg) ...@@ -2715,6 +2715,23 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg)
case HCISETSCAN: case HCISETSCAN:
err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt, err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt,
HCI_INIT_TIMEOUT); HCI_INIT_TIMEOUT);
/* Ensure that the connectable state gets correctly
* notified if the whitelist is in use.
*/
if (!err && !list_empty(&hdev->whitelist)) {
bool changed;
if ((dr.dev_opt & SCAN_PAGE))
changed = !test_and_set_bit(HCI_CONNECTABLE,
&hdev->dev_flags);
else
changed = test_and_set_bit(HCI_CONNECTABLE,
&hdev->dev_flags);
if (changed)
mgmt_new_settings(hdev);
}
break; break;
case HCISETLINKPOL: case HCISETLINKPOL:
......
...@@ -1427,6 +1427,11 @@ static int new_settings(struct hci_dev *hdev, struct sock *skip) ...@@ -1427,6 +1427,11 @@ static int new_settings(struct hci_dev *hdev, struct sock *skip)
return mgmt_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, sizeof(ev), skip); return mgmt_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, sizeof(ev), skip);
} }
int mgmt_new_settings(struct hci_dev *hdev)
{
return new_settings(hdev, NULL);
}
struct cmd_lookup { struct cmd_lookup {
struct sock *sk; struct sock *sk;
struct hci_dev *hdev; struct hci_dev *hdev;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment