Struct veilid_tools::AssemblyBuffer

source ·
pub struct AssemblyBuffer { /* private fields */ }
Expand description

Packet reassembly and fragmentation handler

Used to provide, for raw unordered protocols such as UDP, a means to achieve:

  • Fragmentation of packets to ensure they are smaller than a common MTU
  • Reassembly of fragments upon receipt accounting for:
    • duplication
    • drops
    • overlaps

AssemblyBuffer does not try to replicate TCP or other highly reliable protocols. Here are some of the design limitations to be aware of when using AssemblyBuffer:

  • No packet acknowledgment. The sender does not know if a packet was received.
  • No flow control. If there are buffering problems or drops, the sender and receiver have no protocol to address this.
  • No retries or retransmission.
  • No sequencing of packets. Packets may still be delivered to the application out of order, but this guarantees that only whole packets will be delivered if all of their fragments are received.

Implementations§

source§

impl AssemblyBuffer

source

pub fn new() -> Self

source

pub fn insert_frame( &self, frame: &[u8], remote_addr: SocketAddr ) -> NetworkResult<Option<Vec<u8>>>

Receive a packet chunk and add to the message assembly if a message has been completely, return it

source

pub async fn split_message<S, F>( &self, data: Vec<u8>, remote_addr: SocketAddr, sender: S ) -> Result<NetworkResult<()>>
where S: FnMut(Vec<u8>, SocketAddr) -> F, F: Future<Output = Result<NetworkResult<()>>>,

Split a message into packets and send them serially, ensuring that they are sent consecutively to a particular remote address, never interleaving packets from one message and another to minimize reassembly problems

Trait Implementations§

source§

impl Clone for AssemblyBuffer

source§

fn clone(&self) -> AssemblyBuffer

Returns a copy of the value. Read more
1.0.0 · source§

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

Performs copy-assignment from source. Read more
source§

impl Default for AssemblyBuffer

source§

fn default() -> Self

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

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

source§

fn from(t: T) -> T

Returns the argument unchanged.

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

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
source§

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

§

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

§

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

§

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