From faf51702ace29718c2534a21b765e508bc52ff48 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 31 Oct 2022 11:50:15 -0400 Subject: [PATCH] Implement GuardMgr::install_bridge_desc_provider --- crates/tor-guardmgr/src/lib.rs | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/crates/tor-guardmgr/src/lib.rs b/crates/tor-guardmgr/src/lib.rs index 27fd42fc1..3052e2a02 100644 --- a/crates/tor-guardmgr/src/lib.rs +++ b/crates/tor-guardmgr/src/lib.rs @@ -208,6 +208,13 @@ struct GuardMgrInner { /// This has to be an Option so it can be initialized from None: at the /// time a GuardMgr is created, there is no NetDirProvider for it to use. netdir_provider: Option>, + + /// A netdir provider that we can use for discovering bridge descriptors. + /// + /// This has to be an Option so it can be initialized from None: at the time + /// a GuardMgr is created, there is no BridgeDescProvider for it to use. + #[cfg(feature = "bridge-client")] + bridge_desc_provider: Option>, } /// A selector that tells us which [`GuardSet`] of several is currently in use. @@ -305,6 +312,8 @@ impl GuardMgr { send_skew, recv_skew, netdir_provider: None, + #[cfg(feature = "bridge-client")] + bridge_desc_provider: None, })); { let weak_inner = Arc::downgrade(&inner); @@ -352,16 +361,26 @@ impl GuardMgr { Ok(()) } - /// Configure a new BridgeDescProvider. + /// Configure a new [`bridge::BridgeDescProvider`] for this [`GuardMgr`]. /// - /// TODO pt-client: give this more documentation, like install_netdir_provider has. + /// It will be used to learn about changes in the set of available bridge + /// descriptors; we'll inform it whenever our desired set of bridge + /// descriptors changes. + /// + /// TODO: Same todo as in `install_netdir_provider` about task handles. #[cfg(feature = "bridge-client")] - #[allow(clippy::needless_pass_by_value, clippy::missing_panics_doc)] - pub fn install_bridge_desc_provider( + pub fn install_bridge_desc_provider( &self, - _provider: Arc, + provider: &Arc, ) -> Result<(), GuardMgrError> { - todo!() // TODO pt-client: Implement this and remove the clippy exceptions above. + let weak_provider = Arc::downgrade(provider); + { + let mut inner = self.inner.lock().expect("Poisoned lock"); + inner.bridge_desc_provider = Some(weak_provider.clone()); + } + // TODO pt-client: launch a keep_bridge_descs_updated task. + + Ok(()) } /// Flush our current guard state to the state manager, if there