Skip to content

Commit 4af1c99

Browse files
Thalleycarlescufi
authored andcommitted
Bluetooth: Host: Translate id addr type for PA sync
We only expose random/public address types to the upper layers. This is done by checking if the address type of events are resolved addresses, and if so, then we translate them to public/random. Signed-off-by: Emil Gydesen <[email protected]>
1 parent c501081 commit 4af1c99

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

subsys/bluetooth/host/scan.c

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,7 @@ void bt_hci_le_per_adv_sync_established(struct net_buf *buf)
885885
struct bt_le_per_adv_sync_synced_info sync_info;
886886
struct bt_le_per_adv_sync *pending_per_adv_sync;
887887
struct bt_le_per_adv_sync_cb *listener;
888+
bt_addr_le_t id_addr;
888889
bool unexpected_evt;
889890
int err;
890891

@@ -911,11 +912,21 @@ void bt_hci_le_per_adv_sync_established(struct net_buf *buf)
911912
return;
912913
}
913914

915+
if (evt->adv_addr.type == BT_ADDR_LE_PUBLIC_ID ||
916+
evt->adv_addr.type == BT_ADDR_LE_RANDOM_ID) {
917+
bt_addr_le_copy(&id_addr, &evt->adv_addr);
918+
id_addr.type -= BT_ADDR_LE_PUBLIC_ID;
919+
} else {
920+
bt_addr_le_copy(&id_addr,
921+
bt_lookup_id_addr(BT_ID_DEFAULT,
922+
&evt->adv_addr));
923+
}
924+
914925
if (!pending_per_adv_sync ||
915926
(!atomic_test_bit(pending_per_adv_sync->flags,
916927
BT_PER_ADV_SYNC_SYNCING_USE_LIST) &&
917928
((pending_per_adv_sync->sid != evt->sid) ||
918-
!bt_addr_le_eq(&pending_per_adv_sync->addr, &evt->adv_addr)))) {
929+
!bt_addr_le_eq(&pending_per_adv_sync->addr, &id_addr)))) {
919930
LOG_ERR("Unexpected per adv sync established event");
920931
/* Request terminate of pending periodic advertising in controller */
921932
per_adv_sync_terminate(sys_le16_to_cpu(evt->handle));
@@ -936,7 +947,7 @@ void bt_hci_le_per_adv_sync_established(struct net_buf *buf)
936947
* Already set if not using the sync list
937948
*/
938949
bt_addr_le_copy(&pending_per_adv_sync->addr,
939-
&evt->adv_addr);
950+
&id_addr);
940951
pending_per_adv_sync->sid = evt->sid;
941952
}
942953

@@ -968,7 +979,7 @@ void bt_hci_le_per_adv_sync_established(struct net_buf *buf)
968979
if (atomic_test_bit(pending_per_adv_sync->flags,
969980
BT_PER_ADV_SYNC_SYNCING_USE_LIST)) {
970981
/* Now we know which address and SID we synchronized to. */
971-
bt_addr_le_copy(&pending_per_adv_sync->addr, &evt->adv_addr);
982+
bt_addr_le_copy(&pending_per_adv_sync->addr, &id_addr);
972983
pending_per_adv_sync->sid = evt->sid;
973984

974985
/* Translate "enhanced" identity address type to normal one */
@@ -1018,6 +1029,7 @@ void bt_hci_le_past_received(struct net_buf *buf)
10181029
struct bt_le_per_adv_sync_synced_info sync_info;
10191030
struct bt_le_per_adv_sync_cb *listener;
10201031
struct bt_le_per_adv_sync *per_adv_sync;
1032+
bt_addr_le_t id_addr;
10211033

10221034
if (evt->status) {
10231035
/* No sync created, don't notify app */
@@ -1043,11 +1055,20 @@ void bt_hci_le_past_received(struct net_buf *buf)
10431055

10441056
atomic_set_bit(per_adv_sync->flags, BT_PER_ADV_SYNC_SYNCED);
10451057

1058+
if (evt->addr.type == BT_ADDR_LE_PUBLIC_ID ||
1059+
evt->addr.type == BT_ADDR_LE_RANDOM_ID) {
1060+
bt_addr_le_copy(&id_addr, &evt->addr);
1061+
id_addr.type -= BT_ADDR_LE_PUBLIC_ID;
1062+
} else {
1063+
bt_addr_le_copy(&id_addr,
1064+
bt_lookup_id_addr(BT_ID_DEFAULT, &evt->addr));
1065+
}
1066+
10461067
per_adv_sync->handle = sys_le16_to_cpu(evt->sync_handle);
10471068
per_adv_sync->interval = sys_le16_to_cpu(evt->interval);
10481069
per_adv_sync->clock_accuracy = sys_le16_to_cpu(evt->clock_accuracy);
10491070
per_adv_sync->phy = evt->phy;
1050-
bt_addr_le_copy(&per_adv_sync->addr, &evt->addr);
1071+
bt_addr_le_copy(&per_adv_sync->addr, &id_addr);
10511072
per_adv_sync->sid = evt->adv_sid;
10521073

10531074
sync_info.interval = per_adv_sync->interval;

0 commit comments

Comments
 (0)