Skip to main content

LegStats

Struct LegStats 

Source
pub struct LegStats {
    pub directions: [DirectionStats; 2],
}
Expand description

One connection’s shaping statistics, split by which way the traffic was going — one entry of ProxyStats::per_leg.

Two rows and not one. A leg carries traffic both ways, and a leg that reported a single row would answer how much crossed this connection while refusing “in which direction” — which is the question an author diagnosing a one-sided stall is actually asking, and the one no configuration could separate afterwards.

§Which cell a figure lands in

A proxy reads on one leg and writes on the other, so the same unit is measured twice, once at each crossing:

  • per_leg[Client].uplink — read from the client.
  • per_leg[Upstream].uplink — written to the relay.
  • per_leg[Upstream].downlink — read from the relay.
  • per_leg[Client].downlink — written to the client.

The difference between the two cells of one direction is what the shaper kept back: bytes it read and did not write, whether a policy dropped them, a hook elided them, or a stream was given up on before they went out.

§Three fields of a departure cell have no producer

Only the flow of units is measured at both crossings. Of the five figures a DirectionStats carries, DirectionStats::objects_seen and DirectionStats::bytes_shaped are charged at both; DirectionStats::objects_expired, DirectionStats::streams_reset_by_shaping and DirectionStats::streams_with_mixed_classes are decisions taken over traffic that arrived, so they are charged to the arrival cell only and a departure cell reports zero for all three. Stated here because a zero that means “no producer” and a zero that means “it did not happen” are not the same answer.

objects_seen stays the classifier’s count on both cells: a stream header is not an object on the way in, and it is still not one on the way out.

Fields§

§directions: [DirectionStats; 2]

This leg’s two directions: index 0 is uplink — the client’s traffic on its way to the relay — and index 1 is downlink. Reach them by name with LegStats::uplink and LegStats::downlink.

Implementations§

Source§

impl LegStats

The client’s traffic on its way to the relay, on this leg.

The relay’s traffic on its way to the client, on this leg.

Trait Implementations§

Source§

impl Clone for LegStats

Source§

fn clone(&self) -> LegStats

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 LegStats

Source§

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

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

impl Default for LegStats

Source§

fn default() -> LegStats

Returns the “default value” for a type. Read more
Source§

impl Eq for LegStats

Source§

impl PartialEq for LegStats

Source§

fn eq(&self, other: &LegStats) -> 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 LegStats

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<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<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> 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, <T as TryFrom<U>>::Error>

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<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