From: Weihong Guan <weihong.guan@gmail.com>
To: linux-bluetooth@vger.kernel.org
Cc: Marcel Holtmann <marcel@holtmann.org>,
Luiz Augusto von Dentz <luiz.dentz@gmail.com>,
Weihong Guan <weihong.guan@gmail.com>
Subject: [PATCH v2 1/3] Bluetooth: hci_sync: Set an advertising set's random address on its handle
Date: Wed, 11 Nov 2026 01:09:38 +0000 [thread overview]
Message-ID: <20261111010940.728149-2-weihong.guan@gmail.com> (raw)
In-Reply-To: <20261111010940.728149-1-weihong.guan@gmail.com>
When the controller supports a single advertising set,
hci_add_adv_instance() gives instance 1 handle 0x00, and the parameters,
data and enable commands for an instance use adv->handle. LE Set
Advertising Set Random Address, from hci_set_adv_set_random_addr_sync(),
still sends the instance number, 0x01, a set the controller doesn't
have, so an instance using a random address, such as a non-connectable
one, never starts:
$ btmgmt add-adv -d 0A09434841445654455354 1
Add Advertising failed with status 0x0d (Invalid Parameters)
< HCI Command: LE Set Extended Advertising Parameters Handle: 0x00
< HCI Command: LE Set Extended Advertising Data Handle: 0x00
< HCI Command: LE Set Advertising Set Random Address
Advertising handle: 0x01
Send the instance's handle, looked up with hdev->lock held.
hci_cc_le_set_adv_set_random_addr() records the address in the instance
numbered as the handle and leaves handle 0x00 alone, as that handle's
address is hdev->random_addr for instance 0. Instance 1's address on
handle 0x00 would then go unrecorded, and its RPA timer never start, so
record it in hci_set_adv_set_random_addr_sync() once the command
succeeds, as the completion does for the other handles.
Fixes: e77f43d531af ("Bluetooth: hci_core: Fix not handling hdev->le_num_of_adv_sets=1")
Assisted-by: Claude:claude-opus-5.5
Signed-off-by: Weihong Guan <weihong.guan@gmail.com>
---
net/bluetooth/hci_sync.c | 39 ++++++++++++++++++++++++++++++++++++---
1 file changed, 36 insertions(+), 3 deletions(-)
diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
index 9213e3ef9..320c5ba0d 100644
--- a/net/bluetooth/hci_sync.c
+++ b/net/bluetooth/hci_sync.c
@@ -1258,6 +1258,8 @@ static int hci_set_adv_set_random_addr_sync(struct hci_dev *hdev, u8 instance,
bdaddr_t *random_addr)
{
struct hci_cp_le_set_adv_set_rand_addr cp;
+ struct adv_info *adv;
+ u8 handle = instance;
int err;
if (!instance) {
@@ -1269,15 +1271,46 @@ static int hci_set_adv_set_random_addr_sync(struct hci_dev *hdev, u8 instance,
err = hci_set_random_addr_sync(hdev, random_addr);
if (err)
return err;
+ } else {
+ hci_dev_lock(hdev);
+ adv = hci_find_adv_instance(hdev, instance);
+ if (adv)
+ handle = adv->handle;
+ hci_dev_unlock(hdev);
}
memset(&cp, 0, sizeof(cp));
- cp.handle = instance;
+ cp.handle = handle;
bacpy(&cp.bdaddr, random_addr);
- return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_SET_RAND_ADDR,
- sizeof(cp), &cp, HCI_CMD_TIMEOUT);
+ err = __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_SET_RAND_ADDR,
+ sizeof(cp), &cp, HCI_CMD_TIMEOUT);
+ if (err || handle == instance)
+ return err;
+
+ /* hci_cc_le_set_adv_set_random_addr() records the address of the
+ * instance numbered as the handle, and leaves handle 0x00 to
+ * hdev->random_addr, so record it here for an instance using another
+ * handle: instance 1 on handle 0x00, on a controller supporting a
+ * single advertising set.
+ */
+ hci_dev_lock(hdev);
+
+ adv = hci_find_adv_instance(hdev, instance);
+ if (adv) {
+ bacpy(&adv->random_addr, random_addr);
+ if (!bacmp(&hdev->rpa, random_addr)) {
+ adv->rpa_expired = false;
+ queue_delayed_work(hdev->workqueue,
+ &adv->rpa_expired_cb,
+ secs_to_jiffies(hdev->rpa_timeout));
+ }
+ }
+
+ hci_dev_unlock(hdev);
+
+ return 0;
}
static int
--
2.47.3
next prev parent reply other threads:[~2026-11-11 1:09 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-11 1:09 [PATCH v2 0/3] Bluetooth: Advertising sets on a single-set controller Weihong Guan
2026-11-11 1:09 ` Weihong Guan [this message]
2026-11-11 3:38 ` bluez.test.bot
2026-11-11 1:09 ` [PATCH v2 2/3] Bluetooth: hci_sync: Remove an advertising set by its handle Weihong Guan
2026-11-11 1:09 ` [PATCH v2 3/3] Bluetooth: hci_event: Find the instance owning a terminated advertising set Weihong Guan
2026-11-11 15:47 ` Luiz Augusto von Dentz
2026-11-11 16:58 ` Weihong Guan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261111010940.728149-2-weihong.guan@gmail.com \
--to=weihong.guan@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
--cc=luiz.dentz@gmail.com \
--cc=marcel@holtmann.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox