Bluetooth: hci_sync: Fix using random address for BIG/PA advertisements

[ Upstream commit 03ddb4ac251463ec5b7b069395d9ab89163dd56c ]

When creating an advertisement for BIG the address shall not be
non-resolvable since in case of acting as BASS/Broadcast Assistant the
address must be the same as the connection in order to use the PAST
method and even when PAST/BASS are not in the picture a Periodic
Advertisement can still be synchronized thus the same argument as to
connectable advertisements still stand.

Fixes: eca0ae4aea ("Bluetooth: Add initial implementation of BIS connections")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Luiz Augusto von Dentz 2025-09-19 12:30:05 -04:00 committed by Greg Kroah-Hartman
parent 76aaa5c636
commit 6ad16d3050

View File

@ -1304,7 +1304,7 @@ int hci_setup_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance)
{ {
struct hci_cp_le_set_ext_adv_params cp; struct hci_cp_le_set_ext_adv_params cp;
struct hci_rp_le_set_ext_adv_params rp; struct hci_rp_le_set_ext_adv_params rp;
bool connectable; bool connectable, require_privacy;
u32 flags; u32 flags;
bdaddr_t random_addr; bdaddr_t random_addr;
u8 own_addr_type; u8 own_addr_type;
@ -1342,10 +1342,12 @@ int hci_setup_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance)
return -EPERM; return -EPERM;
/* Set require_privacy to true only when non-connectable /* Set require_privacy to true only when non-connectable
* advertising is used. In that case it is fine to use a * advertising is used and it is not periodic.
* non-resolvable private address. * In that case it is fine to use a non-resolvable private address.
*/ */
err = hci_get_random_address(hdev, !connectable, require_privacy = !connectable && !(adv && adv->periodic);
err = hci_get_random_address(hdev, require_privacy,
adv_use_rpa(hdev, flags), adv, adv_use_rpa(hdev, flags), adv,
&own_addr_type, &random_addr); &own_addr_type, &random_addr);
if (err < 0) if (err < 0)