virtio_drivers::device::socket

Struct VsockConnectionManager

Source
pub struct VsockConnectionManager<H: Hal, T: Transport, const RX_BUFFER_SIZE: usize = DEFAULT_RX_BUFFER_SIZE> { /* private fields */ }
Expand description

A higher level interface for VirtIO socket (vsock) devices.

This keeps track of multiple vsock connections.

RX_BUFFER_SIZE is the size in bytes of each buffer used in the RX virtqueue. This must be bigger than size_of::<VirtioVsockHdr>().

§Example

use virtio_drivers::device::socket::{VirtIOSocket, VsockAddr, VsockConnectionManager};

let mut socket = VsockConnectionManager::new(VirtIOSocket::<HalImpl, _>::new(transport)?);

// Start a thread to call `socket.poll()` and handle events.

let remote_address = VsockAddr { cid: 2, port: 42 };
let local_port = 1234;
socket.connect(remote_address, local_port)?;

// Wait until `socket.poll()` returns an event indicating that the socket is connected.

socket.send(remote_address, local_port, "Hello world".as_bytes())?;

socket.shutdown(remote_address, local_port)?;

Implementations§

Source§

impl<H: Hal, T: Transport, const RX_BUFFER_SIZE: usize> VsockConnectionManager<H, T, RX_BUFFER_SIZE>

Source

pub fn new(driver: VirtIOSocket<H, T, RX_BUFFER_SIZE>) -> Self

Construct a new connection manager wrapping the given low-level VirtIO socket driver.

Source

pub fn new_with_capacity( driver: VirtIOSocket<H, T, RX_BUFFER_SIZE>, per_connection_buffer_capacity: u32, ) -> Self

Construct a new connection manager wrapping the given low-level VirtIO socket driver, with the given per-connection buffer capacity.

Source

pub fn guest_cid(&self) -> u64

Returns the CID which has been assigned to this guest.

Source

pub fn listen(&mut self, port: u32)

Allows incoming connections on the given port number.

Source

pub fn unlisten(&mut self, port: u32)

Stops allowing incoming connections on the given port number.

Source

pub fn connect(&mut self, destination: VsockAddr, src_port: u32) -> Result

Sends a request to connect to the given destination.

This returns as soon as the request is sent; you should wait until poll returns a VsockEventType::Connected event indicating that the peer has accepted the connection before sending data.

Source

pub fn send( &mut self, destination: VsockAddr, src_port: u32, buffer: &[u8], ) -> Result

Sends the buffer to the destination.

Source

pub fn poll(&mut self) -> Result<Option<VsockEvent>>

Polls the vsock device to receive data or other updates.

Source

pub fn recv( &mut self, peer: VsockAddr, src_port: u32, buffer: &mut [u8], ) -> Result<usize>

Reads data received from the given connection.

Source

pub fn recv_buffer_available_bytes( &mut self, peer: VsockAddr, src_port: u32, ) -> Result<usize>

Returns the number of bytes in the receive buffer available to be read by recv.

When the available bytes is 0, it indicates that the receive buffer is empty and does not contain any data.

Source

pub fn update_credit(&mut self, peer: VsockAddr, src_port: u32) -> Result

Sends a credit update to the given peer.

Source

pub fn wait_for_event(&mut self) -> Result<VsockEvent>

Blocks until we get some event from the vsock device.

Source

pub fn shutdown(&mut self, destination: VsockAddr, src_port: u32) -> Result

Requests to shut down the connection cleanly, telling the peer that we won’t send or receive any more data.

This returns as soon as the request is sent; you should wait until poll returns a VsockEventType::Disconnected event if you want to know that the peer has acknowledged the shutdown.

Source

pub fn force_close(&mut self, destination: VsockAddr, src_port: u32) -> Result

Forcibly closes the connection without waiting for the peer.

Auto Trait Implementations§

§

impl<H, T, const RX_BUFFER_SIZE: usize> Freeze for VsockConnectionManager<H, T, RX_BUFFER_SIZE>
where T: Freeze,

§

impl<H, T, const RX_BUFFER_SIZE: usize> RefUnwindSafe for VsockConnectionManager<H, T, RX_BUFFER_SIZE>
where T: RefUnwindSafe, H: RefUnwindSafe,

§

impl<H, T, const RX_BUFFER_SIZE: usize> Send for VsockConnectionManager<H, T, RX_BUFFER_SIZE>
where T: Send,

§

impl<H, T, const RX_BUFFER_SIZE: usize> Sync for VsockConnectionManager<H, T, RX_BUFFER_SIZE>
where T: Sync,

§

impl<H, T, const RX_BUFFER_SIZE: usize> Unpin for VsockConnectionManager<H, T, RX_BUFFER_SIZE>
where T: Unpin, H: Unpin,

§

impl<H, T, const RX_BUFFER_SIZE: usize> UnwindSafe for VsockConnectionManager<H, T, RX_BUFFER_SIZE>
where T: UnwindSafe, H: UnwindSafe,

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

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

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.