Skip to main content

ReinitializeContext

Struct ReinitializeContext 

Source
#[non_exhaustive]
pub struct ReinitializeContext { pub state: ReinitializedState, pub source_mac: MacAddr, pub source_network: Option<NpduAddress>, pub provenance: TransportProvenance, pub invoke_id: u8, /* private fields */ }
Expand description

The ReinitializeDevice request a ReinitializeHandler is asked to carry out, and who sent it.

The addresses are claims, not an authenticated operator. For routed traffic source_mac is the last router, so restrict routed requesters by source_network. Only the certificate accessors are verified: principal names the direct SC peer that sent the request itself, and is None for a routed one; forwarding_peer_principal and direct_sc_identity name the immediate hop, a router included. Neither the mutation policy nor the ServerPolicy sees this service, so a handler that serves only some peers checks them here.

The server builds the context; new lets a test build one to call a handler directly.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§state: ReinitializedState

The requested state, one of those Clause 16.4 defines.

§source_mac: MacAddr

Immediate data-link peer (or router) address.

§source_network: Option<NpduAddress>

Originating NPDU source when the request was routed.

§provenance: TransportProvenance

Immutable ingress snapshot, retained after the admitting connection closes.

§invoke_id: u8

Confirmed-request invoke identifier.

Implementations§

Source§

impl ReinitializeContext

Source

pub fn new( state: ReinitializedState, source_mac: MacAddr, source_network: Option<NpduAddress>, provenance: TransportProvenance, invoke_id: u8, ) -> Self

A context with these fields, for calling a handler outside the server, such as in its unit tests. Outside bacnet-transport only TransportProvenance::unverified can be built.

Source

pub fn after_reply(&self, hook: impl FnOnce() + Send + 'static)

Run hook once this request’s SimpleACK has been handed to the transport, with no server lock held: the place to restart, or to start the backup or restore step, after replying (Clause 16.4.2).

Hooks run in the order registered, on the task that answered the request, so each should be quick and hand longer work to a task or thread of its own. On MS/TP, handed off means queued: the frame still waits for the token, so a hook that stops the server or the port at once can drop the reply; wait a short while first. Hooks registered through a clone of the context after the handler returns never run. They are dropped unrun when the request is answered with an Error instead (the handler refused it or panicked, or the Network Port activation after it failed), when the reply could not be handed over, and when BACnetServer::stop aborts the request task first. A panic in one is logged and the next still runs. A context built with new outside the server never runs its hooks unless a test runs them itself.

Source

pub fn principal(&self) -> Option<ScPrincipal>

The principal of the peer that originated the request: the verified leaf certificate of a direct BACnet/SC connection, when the request carries no routed source. None for other ingress, hub-relayed and routed requests included (see crate::policy).

Source

pub fn forwarding_peer_principal(&self) -> Option<ScPrincipal>

The principal of the direct BACnet/SC peer that handed this request over, a router included when the request was routed; None off a verified direct SC connection. Trusting it trusts everything that peer forwards.

Source

pub fn certificate(&self) -> Option<&ScPeerCertificate>

Available on crate feature sc-tls only.

The verified leaf certificate of the peer that originated the request: the one principal fingerprints, for rules by subject, Subject Alternative Name or issuer, which survive certificate renewal. None exactly when principal() is: other ingress, hub-relayed and routed requests (see crate::policy). Its contents are the peer’s: don’t log them.

Source

pub fn forwarding_peer_certificate(&self) -> Option<&ScPeerCertificate>

Available on crate feature sc-tls only.

The verified leaf certificate of the direct BACnet/SC peer that handed this request over, a router included when the request was routed: the one forwarding_peer_principal fingerprints. None off a verified direct SC connection.

Source

pub fn direct_sc_identity(&self) -> Option<DirectScIdentity>

The immediate direct-SC hop’s verified leaf and connection incarnation: for a routed request, the router that forwarded it. Absent off a verified direct SC connection. Separate from claimed addresses.

Trait Implementations§

Source§

impl Clone for ReinitializeContext

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ReinitializeContext

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for ReinitializeContext

Source§

impl PartialEq for ReinitializeContext

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for ReinitializeContext

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more