]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: MGMT: Add conditions for setting HCI_CONN_FLAG_REMOTE_WAKEUP
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 12 May 2022 22:31:33 +0000 (15:31 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 14 Jun 2022 16:41:26 +0000 (18:41 +0200)
[ Upstream commit a9a347655d224fa2841877957b34fc9d491fc2d7 ]

HCI_CONN_FLAG_REMOTE_WAKEUP can only be set if device can be programmed
in the allowlist which in case of device using RPA requires LL Privacy
support to be enabled.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=215768
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/bluetooth/mgmt.c

index 15eab8b968ce8b1ce9080f3c76f49da667569278..16cd2e7a10da1979e88e40ee4ead1d70cc4c5d71 100644 (file)
@@ -4525,6 +4525,23 @@ static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
                params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
                                                le_addr_type(cp->addr.type));
                if (params) {
+                       DECLARE_BITMAP(flags, __HCI_CONN_NUM_FLAGS);
+
+                       bitmap_from_u64(flags, current_flags);
+
+                       /* Devices using RPAs can only be programmed in the
+                        * acceptlist LL Privacy has been enable otherwise they
+                        * cannot mark HCI_CONN_FLAG_REMOTE_WAKEUP.
+                        */
+                       if (test_bit(HCI_CONN_FLAG_REMOTE_WAKEUP, flags) &&
+                           !use_ll_privacy(hdev) &&
+                           hci_find_irk_by_addr(hdev, &params->addr,
+                                                params->addr_type)) {
+                               bt_dev_warn(hdev,
+                                           "Cannot set wakeable for RPA");
+                               goto unlock;
+                       }
+
                        bitmap_from_u64(params->flags, current_flags);
                        status = MGMT_STATUS_SUCCESS;
 
@@ -4541,6 +4558,7 @@ static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
                }
        }
 
+unlock:
        hci_dev_unlock(hdev);
 
 done: