Skip to main content

SharedState

Struct SharedState 

Source
pub struct SharedState {
    pub tx_ring: ArrayQueue<Vec<u8>>,
    pub rx_ring: ArrayQueue<Vec<u8>>,
    pub rx_wake: WakePipe,
    pub tx_wake: WakePipe,
    pub proxy_wake: WakePipe,
    /* private fields */
}
Expand description

All shared state between the three threads:

  • NetWorker (libkrun) — pushes guest frames to tx_ring, pops response frames from rx_ring.
  • smoltcp poll thread — pops from tx_ring, processes through smoltcp, pushes responses to rx_ring.
  • tokio proxy tasks — relay data between smoltcp sockets and real network connections.

Queue naming follows the guest’s perspective (matching libkrun’s convention): tx_ring = “transmit from guest”, rx_ring = “receive at guest”.

Fields§

§tx_ring: ArrayQueue<Vec<u8>>

Frames from guest → smoltcp (NetWorker writes, smoltcp reads).

§rx_ring: ArrayQueue<Vec<u8>>

Frames from smoltcp → guest (smoltcp writes, NetWorker reads).

§rx_wake: WakePipe

Wakes NetWorker: “rx_ring has frames for the guest.” Written by SmoltcpDevice::transmit(). Read end polled by NetWorker’s epoll loop.

§tx_wake: WakePipe

Wakes smoltcp poll thread: “tx_ring has frames from the guest.” Written by SmoltcpBackend::write_frame(). Read end polled by the poll loop.

§proxy_wake: WakePipe

Wakes smoltcp poll thread: “proxy task has data to write to a smoltcp socket.” Written by proxy tasks via channels. Read end polled by the poll loop.

Implementations§

Source§

impl SharedState

Source

pub fn new(queue_capacity: usize) -> Self

Create shared state with the given queue capacity.

Source

pub fn set_gateway_ips(&self, ipv4: Option<Ipv4Addr>, ipv6: Option<Ipv6Addr>)

Set the per-sandbox gateway IPs. Called once at boot. Each family is only published when active for this sandbox.

Source

pub fn gateway_ipv4(&self) -> Option<Ipv4Addr>

Gateway IPv4 address, if set.

Source

pub fn gateway_ipv6(&self) -> Option<Ipv6Addr>

Gateway IPv6 address, if set.

Source

pub fn set_termination_hook(&self, hook: Arc<dyn Fn() + Send + Sync>)

Install a host-side termination hook.

Source

pub fn trigger_termination(&self)

Trigger host-side termination if a hook is installed.

Source

pub fn cache_resolved_hostname( &self, domain: &str, family: ResolvedHostnameFamily, addrs: impl IntoIterator<Item = IpAddr>, ttl: Duration, )

Replace the resolved addresses for a hostname within the given address family.

Source

pub fn clear_resolved_hostname( &self, domain: &str, family: ResolvedHostnameFamily, )

Clear the resolved addresses for a hostname within the given address family.

Source

pub fn any_resolved_hostname( &self, addr: IpAddr, predicate: impl FnMut(&str) -> bool, ) -> bool

Returns true when any resolved hostname for addr satisfies predicate.

Source

pub fn cleanup_resolved_hostnames(&self)

Best-effort expiry maintenance for resolved hostnames.

This runs outside the hot egress read path. If the index is currently busy, cleanup is skipped and retried on the next maintenance pass.

Source

pub fn add_tx_bytes(&self, bytes: usize)

Increment the guest -> runtime byte counter.

Source

pub fn add_rx_bytes(&self, bytes: usize)

Increment the runtime -> guest byte counter.

Source

pub fn tx_bytes(&self) -> u64

Total bytes transmitted by the guest into the runtime.

Source

pub fn rx_bytes(&self) -> u64

Total bytes delivered by the runtime to the guest.

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> AsAny for T
where T: Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Source§

fn as_mut_any(&mut self) -> &mut (dyn Any + 'static)

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