pub struct PathManager(/* private fields */);Expand description
Combines public and granted segments into paths.
Cheap to clone; all clones share the same state.
Implementations§
Source§impl PathManager
impl PathManager
Sourcepub fn new(segments: SegmentManager, grant: GrantManager) -> Self
pub fn new(segments: SegmentManager, grant: GrantManager) -> Self
Creates a path manager on top of the given segment sources.
Sourcepub async fn best_path(
&self,
client_ip: IpAddr,
dst_sni: &WapSNI,
src: IsdAsn,
dst: IsdAsn,
now: SystemTime,
) -> Result<Option<UsedPath>, BestPathError>
pub async fn best_path( &self, client_ip: IpAddr, dst_sni: &WapSNI, src: IsdAsn, dst: IsdAsn, now: SystemTime, ) -> Result<Option<UsedPath>, BestPathError>
Returns the best path from the given source ISD-ASN to the destination ISD-ASN.
This combines public segments in the segment manager and the granted segments for the given client IP and destination SNI.
Returns the best path and the segments that make up the path. Returns None if no path could be found. Returns an error if something went wrong while fetching segments or computing the path.
§Parameters
client_ip: The IP address of the client requesting the path.dst_sni: The destination SNI for which the path is requested.src: The source ISD-ASN.dst: The destination ISD-ASN.
Sourcepub async fn refresh_path(
&self,
used: &UsedPath,
now: SystemTime,
) -> Result<UsedPath>
pub async fn refresh_path( &self, used: &UsedPath, now: SystemTime, ) -> Result<UsedPath>
Rebuilds used from the current copies of the exact segments it was built from.
Allows the caller to pick up a later expiration of the underlying segments.
Returns Ok(UsedPath) if the path could be rebuilt, or Err if it could not be rebuilt.
Sourcepub async fn hold_segments(
&self,
used: &UsedPath,
now: SystemTime,
) -> Result<PathSegmentsGuard>
pub async fn hold_segments( &self, used: &UsedPath, now: SystemTime, ) -> Result<PathSegmentsGuard>
Keeps the public segments used was built from available for as long as the returned
guard is alive, so Self::refresh_path can still resolve them.
Anything that keeps a UsedPath around for longer than the segment manager’s
idle_eviction_time has to hold on to the guard, otherwise the pair backing the path is
evicted while the path is still in use.
Granted segments need no guard: they are held in place by their grant, not by use.
Sourcepub fn watch_grants(
&self,
client_ip: IpAddr,
customer_domain: CustomerDomainRef<'_>,
used: &UsedPath,
now: SystemTime,
) -> Result<GrantWatch>
pub fn watch_grants( &self, client_ip: IpAddr, customer_domain: CustomerDomainRef<'_>, used: &UsedPath, now: SystemTime, ) -> Result<GrantWatch>
Watches the grants that let client_ip use used towards dst_sni.
The returned watch resolves once any of the grants that authorize the path expires. It also guards the target and the private segments of the path from early eviction.
Returns an error if the client is not authorized for the path in the first place.
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for PathManager
impl !UnwindSafe for PathManager
impl Freeze for PathManager
impl Send for PathManager
impl Sync for PathManager
impl Unpin for PathManager
impl UnsafeUnpin for PathManager
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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