Skip to main content

SnapTunnel

Struct SnapTunnel 

Source
pub struct SnapTunnel { /* private fields */ }
Expand description

A SNAP tunnel connection.

A background driver task runs the WireGuard session. Once the driver stops the tunnel is closed for good: receiving fails with SnapTunnelReceiveError::ReceiveQueueClosed and sending fails with an io::ErrorKind::ConnectionReset error. See SnapTunnel::is_closed for when that happens.

Implementations§

Source§

impl SnapTunnel

Source

pub async fn send(&self, packet: Packet) -> Result<()>

Send a packet to the remote server.

While a handshake is in progress the packet is queued and sent when the handshake completes. Fails with io::ErrorKind::ConnectionReset once the tunnel is closed.

Source

pub fn try_send(&self, packet: Packet) -> Result<()>

Try to send a packet to the remote server. Returns error of try_send_to.

Fails with io::ErrorKind::ConnectionReset once the tunnel is closed.

Source

pub async fn recv(&self) -> Result<Bytes, SnapTunnelReceiveError>

Receive a packet from the remote server.

Fails with SnapTunnelReceiveError::ReceiveQueueClosed once the tunnel is closed.

Source

pub fn try_recv(&self) -> Result<Option<Bytes>, SnapTunnelReceiveError>

Try to receive a packet from the remote server without blocking.

Returns Ok(None) if no packet is currently available.

Source

pub fn poll_recv( &self, cx: &mut Context<'_>, ) -> Poll<Result<Bytes, SnapTunnelReceiveError>>

Poll for a packet from the remote server.

Source

pub fn local_addr(&self) -> SocketAddr

Get the local socket address. Assigned by the remote server.

Source

pub fn is_closed(&self) -> bool

Whether the tunnel is closed. A closed tunnel delivers nothing in either direction.

The tunnel closes when the driver stops. The driver stops when the consumer of the receive queue is gone, when an expired session cannot be re-established within a fixed budget, when a re-handshake fails permanently, or when a re-handshake assigns a different local address. The last case happens after the local network changed, because the data plane derives the address from the source address it observes. An application that wants to continue then connects a new tunnel; see the rules on super::SnapTunEndpoint.

Source

pub async fn writable(&self) -> Result<()>

Check if the socket is writable.

Source

pub fn data_plane_address(&self) -> SocketAddr

The data plane the tunnel is connected to.

Source

pub fn discarded_datagrams(&self) -> u64

Total number of outbound datagrams the underlay socket refused since the tunnel was created.

A refused datagram is dropped rather than retried, because retrying one the socket will never accept blocks every packet queued behind it. The tunnel therefore stays up when sending fails persistently, for example because the interface went down or a firewall answers EPERM, and this counter is what tells such a tunnel apart from a healthy one.

Trait Implementations§

Source§

impl Drop for SnapTunnel

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. 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<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> 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> 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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
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, 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