rust/bt-broadcast-assistant: Use BroadcastSourceKey instead of raw id Use the strongly-typed BroadcastSourceKey to track periodic advertising futures, sync report streams, and active synchronization states in EventStream. Fixed: 542348813 Test: cargo test Change-Id: Ic415f3a3c0798760ff9c5f4d396bcd8702872fb5 Reviewed-on: https://bluetooth-review.googlesource.com/c/bluetooth/+/3420
diff --git a/rust/bt-broadcast-assistant/src/assistant/event.rs b/rust/bt-broadcast-assistant/src/assistant/event.rs index 656ff93..2240a36 100644 --- a/rust/bt-broadcast-assistant/src/assistant/event.rs +++ b/rust/bt-broadcast-assistant/src/assistant/event.rs
@@ -23,7 +23,7 @@ use bt_gatt::GattTypes; use crate::assistant::{ - DiscoveredBroadcastSources, Error, BASIC_AUDIO_ANNOUNCEMENT_SERVICE, + BroadcastSourceKey, DiscoveredBroadcastSources, Error, BASIC_AUDIO_ANNOUNCEMENT_SERVICE, BROADCAST_AUDIO_ANNOUNCEMENT_SERVICE, }; use crate::types::BroadcastSource; @@ -47,10 +47,10 @@ >; type PeriodicAdvertisingFuture<T> = - Pin<Box<dyn Future<Output = (PeerId, u8, PeriodicAdvertisingSyncResult<T>)>>>; + Pin<Box<dyn Future<Output = (BroadcastSourceKey, PeriodicAdvertisingSyncResult<T>)>>>; type PeriodicAdvertisingStream = - Pin<Box<dyn Stream<Item = (PeerId, u8, Result<SyncReport, bt_gatt::types::Error>)>>>; + Pin<Box<dyn Stream<Item = (BroadcastSourceKey, Result<SyncReport, bt_gatt::types::Error>)>>>; /// A stream of discovered broadcast sources. /// This stream polls the scan results from GATT client to discover @@ -66,7 +66,7 @@ establishing_periodic_advertising_syncs: FuturesUnordered<PeriodicAdvertisingFuture<T>>, active_periodic_advertising_sync_streams: SelectAll<PeriodicAdvertisingStream>, - active_syncs: HashMap<(PeerId, u8), Option<AbortHandle>>, + active_syncs: HashMap<BroadcastSourceKey, Option<AbortHandle>>, } impl<T: bt_gatt::GattTypes> Unpin for EventStream<T> {} @@ -105,12 +105,12 @@ } match self.establishing_periodic_advertising_syncs.poll_next_unpin(cx) { - Poll::Ready(Some((peer_id, sid, Ok(stream)))) => { - self.handle_established_sync(peer_id, sid, stream); + Poll::Ready(Some((key, Ok(stream)))) => { + self.handle_established_sync(key, stream); Poll::Ready(()) } - Poll::Ready(Some((peer_id, sid, Err(_)))) => { - self.active_syncs.remove(&(peer_id, sid)); + Poll::Ready(Some((key, Err(_)))) => { + self.active_syncs.remove(&key); Poll::Ready(()) } Poll::Ready(None) | Poll::Pending => Poll::Pending, @@ -132,14 +132,14 @@ } match self.active_periodic_advertising_sync_streams.poll_next_unpin(cx) { - Poll::Ready(Some((peer_id, sid, Ok(report)))) => { - match self.handle_periodic_advertising_report(peer_id, sid, report) { + Poll::Ready(Some((key, Ok(report)))) => { + match self.handle_periodic_advertising_report(key, report) { Some(event) => Poll::Ready(Some(event)), None => Poll::Ready(None), // Progressed, but no event } } - Poll::Ready(Some((peer_id, sid, Err(_)))) => { - self.active_syncs.remove(&(peer_id, sid)); + Poll::Ready(Some((key, Err(_)))) => { + self.active_syncs.remove(&key); Poll::Ready(None) // Progressed, but no event } Poll::Ready(None) | Poll::Pending => Poll::Pending, @@ -178,21 +178,19 @@ fn handle_established_sync( &mut self, - peer_id: PeerId, - sid: u8, + key: BroadcastSourceKey, stream: <<T as GattTypes>::PeriodicAdvertising as PeriodicAdvertising>::SyncStream, ) { - let mapped_stream = stream.map(move |report| (peer_id, sid, report)); + let mapped_stream = stream.map(move |report| (key, report)); let (abortable_stream, abort_handle) = abortable(mapped_stream); self.active_periodic_advertising_sync_streams.push(Box::pin(abortable_stream)); - self.active_syncs.insert((peer_id, sid), Some(abort_handle)); + self.active_syncs.insert(key, Some(abort_handle)); } fn handle_periodic_advertising_report( &mut self, - peer_id: PeerId, - sid: u8, + key: BroadcastSourceKey, report: SyncReport, ) -> Option<Event> { let SyncReport::PeriodicAdvertisingReport(report) = report else { @@ -203,24 +201,17 @@ return None; }; - let Ok(advertising_sid) = AdvertisingSetId::try_from(sid) else { - return None; - }; - - let (broadcast_source, changed) = self.broadcast_sources.merge_broadcast_source_data( - &(peer_id, advertising_sid), - &BroadcastSource::default().with_endpoint(base), - ); + let (broadcast_source, changed) = self + .broadcast_sources + .merge_broadcast_source_data(&key, &BroadcastSource::default().with_endpoint(base)); if broadcast_source.is_ready_to_add() && changed { - if let Some(Some(handle)) = - self.active_syncs.remove(&(peer_id, advertising_sid.value())) - { + if let Some(Some(handle)) = self.active_syncs.remove(&key) { handle.abort(); } return Some(Event::FoundBroadcastSource { - peer: peer_id, - advertising_sid, + peer: key.0, + advertising_sid: key.1, source: broadcast_source, }); } @@ -243,13 +234,14 @@ return None; }; + let key = (scanned.id, sid); let (broadcast_source, changed) = - self.broadcast_sources.merge_broadcast_source_data(&(scanned.id, sid), &found_source); + self.broadcast_sources.merge_broadcast_source_data(&key, &found_source); if broadcast_source.is_ready_to_add() && changed { return Some(Event::FoundBroadcastSource { - peer: scanned.id, - advertising_sid: sid, + peer: key.0, + advertising_sid: key.1, source: broadcast_source, }); } @@ -269,7 +261,6 @@ // If we are already actively syncing (or establishing a sync) for this // peer/SID, don't start another one. - let key = (scanned.id, sid.value()); if self.active_syncs.contains_key(&key) { return None; } @@ -280,7 +271,7 @@ sid.value(), SyncConfiguration { filter_duplicates: true }, ); - let mapped_fut = fut.map(move |res| (scanned.id, sid.value(), res)); + let mapped_fut = fut.map(move |res| (key, res)); self.establishing_periodic_advertising_syncs.push(Box::pin(mapped_fut)); None