Bluetooth: MGMT: set_mesh: update LE scan interval and window
commit e5af67a870f738bb8a4594b6c60c2caf4c87a3c9 upstream. According to the message of commitb338d91703
("Bluetooth: Implement support for Mesh"), MGMT_OP_SET_MESH_RECEIVER should set the passive scan parameters. Currently the scan interval and window parameters are silently ignored, although user space (bluetooth-meshd) expects that they can be used [1] [1] https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/mesh/mesh-io-mgmt.c#n344 Fixes:b338d91703
("Bluetooth: Implement support for Mesh") Cc: stable@vger.kernel.org Signed-off-by: Christian Eggers <ceggers@arri.de> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
7e88ad41b6
commit
8af1406949
@@ -2140,6 +2140,9 @@ static int set_mesh_sync(struct hci_dev *hdev, void *data)
|
|||||||
else
|
else
|
||||||
hci_dev_clear_flag(hdev, HCI_MESH);
|
hci_dev_clear_flag(hdev, HCI_MESH);
|
||||||
|
|
||||||
|
hdev->le_scan_interval = __le16_to_cpu(cp->period);
|
||||||
|
hdev->le_scan_window = __le16_to_cpu(cp->window);
|
||||||
|
|
||||||
len -= sizeof(*cp);
|
len -= sizeof(*cp);
|
||||||
|
|
||||||
/* If filters don't fit, forward all adv pkts */
|
/* If filters don't fit, forward all adv pkts */
|
||||||
@@ -2154,6 +2157,7 @@ static int set_mesh(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
|
|||||||
{
|
{
|
||||||
struct mgmt_cp_set_mesh *cp = data;
|
struct mgmt_cp_set_mesh *cp = data;
|
||||||
struct mgmt_pending_cmd *cmd;
|
struct mgmt_pending_cmd *cmd;
|
||||||
|
__u16 period, window;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
bt_dev_dbg(hdev, "sock %p", sk);
|
bt_dev_dbg(hdev, "sock %p", sk);
|
||||||
@@ -2167,6 +2171,23 @@ static int set_mesh(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
|
|||||||
return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER,
|
return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER,
|
||||||
MGMT_STATUS_INVALID_PARAMS);
|
MGMT_STATUS_INVALID_PARAMS);
|
||||||
|
|
||||||
|
/* Keep allowed ranges in sync with set_scan_params() */
|
||||||
|
period = __le16_to_cpu(cp->period);
|
||||||
|
|
||||||
|
if (period < 0x0004 || period > 0x4000)
|
||||||
|
return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER,
|
||||||
|
MGMT_STATUS_INVALID_PARAMS);
|
||||||
|
|
||||||
|
window = __le16_to_cpu(cp->window);
|
||||||
|
|
||||||
|
if (window < 0x0004 || window > 0x4000)
|
||||||
|
return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER,
|
||||||
|
MGMT_STATUS_INVALID_PARAMS);
|
||||||
|
|
||||||
|
if (window > period)
|
||||||
|
return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER,
|
||||||
|
MGMT_STATUS_INVALID_PARAMS);
|
||||||
|
|
||||||
hci_dev_lock(hdev);
|
hci_dev_lock(hdev);
|
||||||
|
|
||||||
cmd = mgmt_pending_add(sk, MGMT_OP_SET_MESH_RECEIVER, hdev, data, len);
|
cmd = mgmt_pending_add(sk, MGMT_OP_SET_MESH_RECEIVER, hdev, data, len);
|
||||||
@@ -6529,6 +6550,7 @@ static int set_scan_params(struct sock *sk, struct hci_dev *hdev,
|
|||||||
return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
|
return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
|
||||||
MGMT_STATUS_NOT_SUPPORTED);
|
MGMT_STATUS_NOT_SUPPORTED);
|
||||||
|
|
||||||
|
/* Keep allowed ranges in sync with set_mesh() */
|
||||||
interval = __le16_to_cpu(cp->interval);
|
interval = __le16_to_cpu(cp->interval);
|
||||||
|
|
||||||
if (interval < 0x0004 || interval > 0x4000)
|
if (interval < 0x0004 || interval > 0x4000)
|
||||||
|
Reference in New Issue
Block a user