Skip to main content

Sack

Struct Sack 

Source
pub struct Sack {
    pub largest_acked: u32,
    pub ack_delay_us: u32,
    /* private fields */
}
Available on crate feature std only.
Expand description

A selective acknowledgement over a per-stream u32 sequence space.

ranges are inclusive (low, high) runs of acknowledged sequences, sorted descending (highest first), non-overlapping and non-adjacent. ranges[0].1 == largest_acked. An empty ranges slice is invalid — a Sack always ACKs at least one sequence.

Fields§

§largest_acked: u32

The highest sequence number covered by this ACK.

§ack_delay_us: u32

Sender-measured delay between receiving the data packet and generating this ACK, in microseconds. Used by the BBR / RTT estimator.

Implementations§

Source§

impl Sack

Source

pub fn from_received(received: &[u32], ack_delay_us: u32) -> Option<Sack>

Build a Sack from an unordered slice of received sequence numbers.

Coalesces adjacent or overlapping sequences into the minimal set of inclusive (low, high) ranges sorted descending (highest first).

Returns None if received is empty (there is nothing to ACK).

Source

pub fn from_inclusive_ranges( ranges: Vec<(u32, u32)>, ack_delay_us: u32, ) -> Option<Sack>

Build a Sack from explicit inclusive (low, high) ranges in any order (each must have low <= high). Ranges are sorted ascending, coalesced (adjacent/overlapping merged), reversed to descending, and capped to the highest MAX_SACK_RANGES so the encoded SACK always decodes at the peer (from_wire rejects range_count > MAX_SACK_RANGES). Dropping the lowest ranges is safe: those sequences are recovered by cumulative re-ACK as holes fill, or by RTO. Returns None if ranges is empty.

Source

pub fn ranges(&self) -> &[(u32, u32)]

Returns the inclusive (low, high) ranges, sorted descending (highest first), non-overlapping and non-adjacent. Always non-empty.

Source

pub fn to_wire(&self) -> Vec<u8>

Serialise to wire bytes.

Panics are structurally impossible: ranges is always non-empty (the invariant is enforced by the private field — every constructor (from_received, from_inclusive_ranges, from_wire) guarantees at least one range), and the arithmetic cannot overflow because all fields fit in u32.

Source

pub fn from_wire(buf: &[u8]) -> Result<Sack, SackError>

Decode a Sack from wire bytes produced by Sack::to_wire.

§Errors

See SackError for the full error table.

Source

pub fn acks(&self, seq: u32) -> bool

Returns true if seq is covered by any range in this SACK.

Trait Implementations§

Source§

impl Clone for Sack

Source§

fn clone(&self) -> Sack

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 Sack

Source§

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

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

impl Eq for Sack

Source§

impl PartialEq for Sack

Source§

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

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

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

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for Sack

Auto Trait Implementations§

§

impl Freeze for Sack

§

impl RefUnwindSafe for Sack

§

impl Send for Sack

§

impl Sync for Sack

§

impl Unpin for Sack

§

impl UnsafeUnpin for Sack

§

impl UnwindSafe for Sack

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<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> CompatExt for T

Source§

fn compat(self) -> Compat<T>
where T: Sized,

Applies the Compat adapter by value. Read more
Source§

fn compat_ref(&self) -> Compat<&T>

Applies the Compat adapter by shared reference. Read more
Source§

fn compat_mut(&mut self) -> Compat<&mut T>

Applies the Compat adapter by mutable reference. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<T, UT> HandleAlloc<UT> for T
where T: Send + Sync,

Source§

fn new_handle(value: Arc<T>) -> Handle

Create a new handle for an Arc value Read more
Source§

unsafe fn clone_handle(handle: Handle) -> Handle

Clone a handle Read more
Source§

unsafe fn consume_handle(handle: Handle) -> Arc<T>

Consume a handle, getting back the initial Arc<> Read more
Source§

unsafe fn get_arc(handle: Handle) -> Arc<Self>

Get a clone of the Arc<> using a “borrowed” handle. Read more
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 = Infallible

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