Bluetooth: host: adv: set the address in bt_le_adv_resume
The address could have changed. The issue linked (and bsim test in previous commit) shows a scenario where that could happen: - we start scanning, host will use NRPA - we start advertising, host will use identity address - a device connects (as a central) -> advertising resume fails for some unrelated reason - another device connects (as a peripheral) - the central device disconnects, we resume scanning - the peripheral disconnects, the stack resumes advertising -> but it mistakenly advertises using the NRPA set by the scanner Fixes #52059 . Signed-off-by: Jonathan Rico <jonathan.rico@nordicsemi.no>
This commit is contained in:
parent
57d7d62bee
commit
dc4d63e97b
2 changed files with 32 additions and 0 deletions
|
@ -1445,6 +1445,25 @@ int bt_le_adv_stop(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_BT_PERIPHERAL)
|
#if defined(CONFIG_BT_PERIPHERAL)
|
||||||
|
static uint32_t adv_get_options(const struct bt_le_ext_adv *adv)
|
||||||
|
{
|
||||||
|
uint32_t options = 0;
|
||||||
|
|
||||||
|
if (!atomic_test_bit(adv->flags, BT_ADV_PERSIST)) {
|
||||||
|
options |= BT_LE_ADV_OPT_ONE_TIME;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (atomic_test_bit(adv->flags, BT_ADV_CONNECTABLE)) {
|
||||||
|
options |= BT_LE_ADV_OPT_CONNECTABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (atomic_test_bit(adv->flags, BT_ADV_USE_IDENTITY)) {
|
||||||
|
options |= BT_LE_ADV_OPT_USE_IDENTITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
void bt_le_adv_resume(void)
|
void bt_le_adv_resume(void)
|
||||||
{
|
{
|
||||||
struct bt_le_ext_adv *adv = bt_le_adv_lookup_legacy();
|
struct bt_le_ext_adv *adv = bt_le_adv_lookup_legacy();
|
||||||
|
@ -1477,6 +1496,17 @@ void bt_le_adv_resume(void)
|
||||||
if (IS_ENABLED(CONFIG_BT_PRIVACY) &&
|
if (IS_ENABLED(CONFIG_BT_PRIVACY) &&
|
||||||
!atomic_test_bit(adv->flags, BT_ADV_USE_IDENTITY)) {
|
!atomic_test_bit(adv->flags, BT_ADV_USE_IDENTITY)) {
|
||||||
bt_id_set_adv_private_addr(adv);
|
bt_id_set_adv_private_addr(adv);
|
||||||
|
} else {
|
||||||
|
uint8_t own_addr_type;
|
||||||
|
bool dir_adv = adv_is_directed(adv);
|
||||||
|
uint32_t options = adv_get_options(adv);
|
||||||
|
|
||||||
|
/* Always set the address. Don't assume it has not changed. */
|
||||||
|
err = bt_id_set_adv_own_addr(adv, options, dir_adv, &own_addr_type);
|
||||||
|
if (err) {
|
||||||
|
LOG_ERR("Controller cannot resume connectable advertising (%d)", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = bt_le_adv_set_enable(adv, true);
|
err = bt_le_adv_set_enable(adv, true);
|
||||||
|
|
|
@ -1724,6 +1724,8 @@ int bt_id_set_scan_own_addr(bool active_scan, uint8_t *own_addr_type)
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
LOG_DBG("Not changing the address");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue