Skip to content

Commit 4e924b6

Browse files
kapi-nofabiobaltieri
authored andcommitted
bluetooth: id: sync advertising set start after rpa rotation
Synced the start of the advertising sets after each RPA rotation in the Bluetooth identity module. Signed-off-by: Kamil Piszczek <[email protected]>
1 parent 2d3c2ef commit 4e924b6

File tree

1 file changed

+42
-8
lines changed
  • subsys/bluetooth/host

1 file changed

+42
-8
lines changed

subsys/bluetooth/host/id.c

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -345,15 +345,38 @@ int bt_id_set_adv_private_addr(struct bt_le_ext_adv *adv)
345345
}
346346
#endif /* defined(CONFIG_BT_PRIVACY) */
347347

348-
static void adv_update_rpa(struct bt_le_ext_adv *adv, void *data)
348+
#if defined(CONFIG_BT_EXT_ADV) && defined(CONFIG_BT_PRIVACY)
349+
static void adv_disable_rpa(struct bt_le_ext_adv *adv, void *data)
349350
{
351+
uint8_t adv_index = bt_le_ext_adv_get_index(adv);
352+
bool *adv_disabled = data;
353+
354+
adv_disabled[adv_index] = false;
355+
356+
/* Invalidate RPA only for non-limited advertising sets. */
357+
if (atomic_test_bit(adv->flags, BT_ADV_LIMITED)) {
358+
return;
359+
}
360+
361+
/* Disable advertising sets to prepare them for RPA update. */
350362
if (atomic_test_bit(adv->flags, BT_ADV_ENABLED) &&
351-
!atomic_test_bit(adv->flags, BT_ADV_LIMITED) &&
352363
!atomic_test_bit(adv->flags, BT_ADV_USE_IDENTITY)) {
353-
int err;
354-
355364
bt_le_adv_set_enable_ext(adv, false, NULL);
356365

366+
adv_disabled[adv_index] = true;
367+
}
368+
369+
atomic_clear_bit(adv->flags, BT_ADV_RPA_VALID);
370+
}
371+
372+
static void adv_enable_rpa(struct bt_le_ext_adv *adv, void *data)
373+
{
374+
uint8_t adv_index = bt_le_ext_adv_get_index(adv);
375+
bool *adv_disabled = data;
376+
377+
if (adv_disabled[adv_index]) {
378+
int err;
379+
357380
err = bt_id_set_adv_private_addr(adv);
358381
if (err) {
359382
BT_WARN("Failed to update advertiser RPA address (%d)",
@@ -363,6 +386,17 @@ static void adv_update_rpa(struct bt_le_ext_adv *adv, void *data)
363386
bt_le_adv_set_enable_ext(adv, true, NULL);
364387
}
365388
}
389+
#endif /* defined(CONFIG_BT_EXT_ADV) && defined(CONFIG_BT_PRIVACY) */
390+
391+
static void adv_update_rpa_foreach(void)
392+
{
393+
#if defined(CONFIG_BT_EXT_ADV) && defined(CONFIG_BT_PRIVACY)
394+
bool adv_disabled[CONFIG_BT_EXT_ADV_MAX_ADV_SET];
395+
396+
bt_le_ext_adv_foreach(adv_disable_rpa, adv_disabled);
397+
bt_le_ext_adv_foreach(adv_enable_rpa, adv_disabled);
398+
#endif
399+
}
366400

367401
static void le_update_private_addr(void)
368402
{
@@ -374,7 +408,9 @@ static void le_update_private_addr(void)
374408
if (IS_ENABLED(CONFIG_BT_BROADCASTER) &&
375409
IS_ENABLED(CONFIG_BT_EXT_ADV) &&
376410
BT_DEV_FEAT_LE_EXT_ADV(bt_dev.le.features)) {
377-
bt_le_ext_adv_foreach(adv_update_rpa, NULL);
411+
adv_update_rpa_foreach();
412+
} else {
413+
le_rpa_invalidate();
378414
}
379415

380416
#if defined(CONFIG_BT_OBSERVER)
@@ -439,7 +475,6 @@ static void le_force_rpa_timeout(void)
439475

440476
k_work_cancel_delayable_sync(&bt_dev.rpa_update, &sync);
441477
#endif
442-
le_rpa_invalidate();
443478
le_update_private_addr();
444479
}
445480

@@ -461,8 +496,6 @@ static void rpa_timeout(struct k_work *work)
461496
}
462497
}
463498

464-
le_rpa_invalidate();
465-
466499
if (IS_ENABLED(CONFIG_BT_BROADCASTER)) {
467500
bt_le_ext_adv_foreach(adv_is_private_enabled, &adv_enabled);
468501
}
@@ -472,6 +505,7 @@ static void rpa_timeout(struct k_work *work)
472505
atomic_test_bit(bt_dev.flags, BT_DEV_INITIATING) ||
473506
(atomic_test_bit(bt_dev.flags, BT_DEV_SCANNING) &&
474507
atomic_test_bit(bt_dev.flags, BT_DEV_ACTIVE_SCAN)))) {
508+
le_rpa_invalidate();
475509
return;
476510
}
477511

0 commit comments

Comments
 (0)