@@ -345,15 +345,38 @@ int bt_id_set_adv_private_addr(struct bt_le_ext_adv *adv)
345
345
}
346
346
#endif /* defined(CONFIG_BT_PRIVACY) */
347
347
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 )
349
350
{
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. */
350
362
if (atomic_test_bit (adv -> flags , BT_ADV_ENABLED ) &&
351
- !atomic_test_bit (adv -> flags , BT_ADV_LIMITED ) &&
352
363
!atomic_test_bit (adv -> flags , BT_ADV_USE_IDENTITY )) {
353
- int err ;
354
-
355
364
bt_le_adv_set_enable_ext (adv , false, NULL );
356
365
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
+
357
380
err = bt_id_set_adv_private_addr (adv );
358
381
if (err ) {
359
382
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)
363
386
bt_le_adv_set_enable_ext (adv , true, NULL );
364
387
}
365
388
}
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
+ }
366
400
367
401
static void le_update_private_addr (void )
368
402
{
@@ -374,7 +408,9 @@ static void le_update_private_addr(void)
374
408
if (IS_ENABLED (CONFIG_BT_BROADCASTER ) &&
375
409
IS_ENABLED (CONFIG_BT_EXT_ADV ) &&
376
410
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 ();
378
414
}
379
415
380
416
#if defined(CONFIG_BT_OBSERVER )
@@ -439,7 +475,6 @@ static void le_force_rpa_timeout(void)
439
475
440
476
k_work_cancel_delayable_sync (& bt_dev .rpa_update , & sync );
441
477
#endif
442
- le_rpa_invalidate ();
443
478
le_update_private_addr ();
444
479
}
445
480
@@ -461,8 +496,6 @@ static void rpa_timeout(struct k_work *work)
461
496
}
462
497
}
463
498
464
- le_rpa_invalidate ();
465
-
466
499
if (IS_ENABLED (CONFIG_BT_BROADCASTER )) {
467
500
bt_le_ext_adv_foreach (adv_is_private_enabled , & adv_enabled );
468
501
}
@@ -472,6 +505,7 @@ static void rpa_timeout(struct k_work *work)
472
505
atomic_test_bit (bt_dev .flags , BT_DEV_INITIATING ) ||
473
506
(atomic_test_bit (bt_dev .flags , BT_DEV_SCANNING ) &&
474
507
atomic_test_bit (bt_dev .flags , BT_DEV_ACTIVE_SCAN )))) {
508
+ le_rpa_invalidate ();
475
509
return ;
476
510
}
477
511
0 commit comments