pub struct ExitNodeCandidate {
pub stable_id: StableNodeId,
pub name: String,
pub derp_region: Option<RegionId>,
pub online: Option<bool>,
pub advertises_exit_route: bool,
pub has_suggest_cap: bool,
}Expand description
A peer being considered as an exit-node suggestion, carrying exactly the inputs the suggestion
algorithm reads. Built (in Runtime::suggest_exit_node)
from a domain Node; kept as a small standalone struct so the algorithm is a
pure function over its inputs (unit-testable without the actor graph, mirroring how the runtime’s
build_file_targets factors out the file-target rules).
The eligibility predicate (is_eligible) is applied inside the suggest_exit_node function,
so callers pass every peer and the pure function does the filtering — this keeps the predicate
itself covered by the same tests as the selection logic.
Fields§
§stable_id: StableNodeIdThe peer’s stable node id (Node.StableID()), the identity returned in the suggestion and
matched against prev_suggestion for stickiness.
name: StringThe peer’s display name (Node.Name()), echoed into the suggestion.
derp_region: Option<RegionId>The peer’s home DERP region (Node.HomeDERP()), or None when it has no DERP home (Go
HomeDERP == 0; typically a Mullvad node). A region-less candidate is only ever selected
when no DERP-homed candidate exists (the Phase-2 geo path), so under Phase 1 it falls back
to a region-less SelectNode pick. Mirrors the domain
Node::derp_region.
online: Option<bool>Whether control reports the peer online (Node.Online == Some(true)). The default
reachability gate (Go PeerIsReachable without NodeAttrClientSideReachability) is
online == Some(true); a tri-state None/Some(false) is treated as not reachable
(fail-closed — never suggest a peer control has not asserted is up).
advertises_exit_route: boolWhether the peer advertises an exit route. Per the IPv4-only fork parity decision (see the
suggest_exit_node function) this is true when the peer advertises 0.0.0.0/0
(prefix_len == 0), matching the fork’s family-agnostic
StatusNode::is_exit_node check — not Go’s
strict both-0.0.0.0/0-and-::/0 tsaddr.ContainsExitRoutes.
has_suggest_cap: boolWhether the peer carries the suggest-exit-node node-capability
(NODE_ATTR_SUGGEST_EXIT_NODE) in its CapMap —
control’s marker that the peer may be auto-suggested. Checked via
Node::has_node_attr.
Trait Implementations§
Source§impl Clone for ExitNodeCandidate
impl Clone for ExitNodeCandidate
Source§fn clone(&self) -> ExitNodeCandidate
fn clone(&self) -> ExitNodeCandidate
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ExitNodeCandidate
impl Debug for ExitNodeCandidate
impl Eq for ExitNodeCandidate
Source§impl PartialEq for ExitNodeCandidate
impl PartialEq for ExitNodeCandidate
Source§fn eq(&self, other: &ExitNodeCandidate) -> bool
fn eq(&self, other: &ExitNodeCandidate) -> bool
self and other values to be equal, and is used by ==.impl StructuralPartialEq for ExitNodeCandidate
Auto Trait Implementations§
impl Freeze for ExitNodeCandidate
impl RefUnwindSafe for ExitNodeCandidate
impl Send for ExitNodeCandidate
impl Sync for ExitNodeCandidate
impl Unpin for ExitNodeCandidate
impl UnsafeUnpin for ExitNodeCandidate
impl UnwindSafe for ExitNodeCandidate
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<A, T> DynMessage<A> for T
impl<A, T> DynMessage<A> for T
Source§fn handle_dyn<'a>(
self: Box<T>,
state: &'a mut A,
actor_ref: ActorRef<A>,
tx: Option<Sender<Result<Box<dyn Any + Send>, SendError<Box<dyn Any + Send>, Box<dyn Any + Send>>>>>,
stop: &'a mut bool,
) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn ReplyError>>> + Send + 'a>>
fn handle_dyn<'a>( self: Box<T>, state: &'a mut A, actor_ref: ActorRef<A>, tx: Option<Sender<Result<Box<dyn Any + Send>, SendError<Box<dyn Any + Send>, Box<dyn Any + Send>>>>>, stop: &'a mut bool, ) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn ReplyError>>> + Send + 'a>>
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more