| From 5fab62a218af4fb932bbf3a2e649854aa7c9467d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 25 Nov 2024 15:42:09 -0500 |
| Subject: Bluetooth: hci_sync: Fix not setting Random Address when required |
| |
| From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> |
| |
| [ Upstream commit c2994b008492db033d40bd767be1620229a3035e ] |
| |
| This fixes errors such as the following when Own address type is set to |
| Random Address but it has not been programmed yet due to either be |
| advertising or connecting: |
| |
| < HCI Command: LE Set Exte.. (0x08|0x0041) plen 13 |
| Own address type: Random (0x03) |
| Filter policy: Ignore not in accept list (0x01) |
| PHYs: 0x05 |
| Entry 0: LE 1M |
| Type: Passive (0x00) |
| Interval: 60.000 msec (0x0060) |
| Window: 30.000 msec (0x0030) |
| Entry 1: LE Coded |
| Type: Passive (0x00) |
| Interval: 180.000 msec (0x0120) |
| Window: 90.000 msec (0x0090) |
| > HCI Event: Command Complete (0x0e) plen 4 |
| LE Set Extended Scan Parameters (0x08|0x0041) ncmd 1 |
| Status: Success (0x00) |
| < HCI Command: LE Set Exten.. (0x08|0x0042) plen 6 |
| Extended scan: Enabled (0x01) |
| Filter duplicates: Enabled (0x01) |
| Duration: 0 msec (0x0000) |
| Period: 0.00 sec (0x0000) |
| > HCI Event: Command Complete (0x0e) plen 4 |
| LE Set Extended Scan Enable (0x08|0x0042) ncmd 1 |
| Status: Invalid HCI Command Parameters (0x12) |
| |
| Fixes: c45074d68a9b ("Bluetooth: Fix not generating RPA when required") |
| Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/bluetooth/hci_sync.c | 11 ++++++----- |
| 1 file changed, 6 insertions(+), 5 deletions(-) |
| |
| diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c |
| index c86f4e42e69c..7b2b04d6b856 100644 |
| --- a/net/bluetooth/hci_sync.c |
| +++ b/net/bluetooth/hci_sync.c |
| @@ -1031,9 +1031,9 @@ static bool adv_use_rpa(struct hci_dev *hdev, uint32_t flags) |
| |
| static int hci_set_random_addr_sync(struct hci_dev *hdev, bdaddr_t *rpa) |
| { |
| - /* If we're advertising or initiating an LE connection we can't |
| - * go ahead and change the random address at this time. This is |
| - * because the eventual initiator address used for the |
| + /* If a random_addr has been set we're advertising or initiating an LE |
| + * connection we can't go ahead and change the random address at this |
| + * time. This is because the eventual initiator address used for the |
| * subsequently created connection will be undefined (some |
| * controllers use the new address and others the one we had |
| * when the operation started). |
| @@ -1041,8 +1041,9 @@ static int hci_set_random_addr_sync(struct hci_dev *hdev, bdaddr_t *rpa) |
| * In this kind of scenario skip the update and let the random |
| * address be updated at the next cycle. |
| */ |
| - if (hci_dev_test_flag(hdev, HCI_LE_ADV) || |
| - hci_lookup_le_connect(hdev)) { |
| + if (bacmp(&hdev->random_addr, BDADDR_ANY) && |
| + (hci_dev_test_flag(hdev, HCI_LE_ADV) || |
| + hci_lookup_le_connect(hdev))) { |
| bt_dev_dbg(hdev, "Deferring random address update"); |
| hci_dev_set_flag(hdev, HCI_RPA_EXPIRED); |
| return 0; |
| -- |
| 2.39.5 |
| |