Bluetooth: MGMT: set_mesh: update LE scan interval and window
authorChristian Eggers <ceggers@arri.de>
Wed, 25 Jun 2025 13:09:30 +0000 (15:09 +0200)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 27 Jun 2025 18:00:44 +0000 (14:00 -0400)
According to the message of commit b338d91703fa ("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: b338d91703fa ("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>
net/bluetooth/mgmt.c

index d540f7b4f75fbf29c4bd77b700ccec33b7006fd5..5d0f772c7a99edbf0f08114c2531dc685c9f12af 100644 (file)
@@ -2153,6 +2153,9 @@ static int set_mesh_sync(struct hci_dev *hdev, void *data)
        else
                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);
 
        /* If filters don't fit, forward all adv pkts */
@@ -2167,6 +2170,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_pending_cmd *cmd;
+       __u16 period, window;
        int err = 0;
 
        bt_dev_dbg(hdev, "sock %p", sk);
@@ -2180,6 +2184,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,
                                       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);
 
        cmd = mgmt_pending_add(sk, MGMT_OP_SET_MESH_RECEIVER, hdev, data, len);
@@ -6432,6 +6453,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,
                                       MGMT_STATUS_NOT_SUPPORTED);
 
+       /* Keep allowed ranges in sync with set_mesh() */
        interval = __le16_to_cpu(cp->interval);
 
        if (interval < 0x0004 || interval > 0x4000)