@@ -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
367401static 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