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>
impl<H: Hal, T: Transport, const RX_BUFFER_SIZE: usize> VsockConnectionManager<H, T, RX_BUFFER_SIZE>
Sourcepub fn new(driver: VirtIOSocket<H, T, RX_BUFFER_SIZE>) -> Self
pub fn new(driver: VirtIOSocket<H, T, RX_BUFFER_SIZE>) -> Self
Construct a new connection manager wrapping the given low-level VirtIO socket driver.
Sourcepub fn new_with_capacity(
driver: VirtIOSocket<H, T, RX_BUFFER_SIZE>,
per_connection_buffer_capacity: u32,
) -> Self
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.
Sourcepub fn unlisten(&mut self, port: u32)
pub fn unlisten(&mut self, port: u32)
Stops allowing incoming connections on the given port number.
Sourcepub fn connect(&mut self, destination: VsockAddr, src_port: u32) -> Result
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.
Sourcepub fn send(
&mut self,
destination: VsockAddr,
src_port: u32,
buffer: &[u8],
) -> Result
pub fn send( &mut self, destination: VsockAddr, src_port: u32, buffer: &[u8], ) -> Result
Sends the buffer to the destination.
Sourcepub fn poll(&mut self) -> Result<Option<VsockEvent>>
pub fn poll(&mut self) -> Result<Option<VsockEvent>>
Polls the vsock device to receive data or other updates.
Sourcepub fn recv(
&mut self,
peer: VsockAddr,
src_port: u32,
buffer: &mut [u8],
) -> Result<usize>
pub fn recv( &mut self, peer: VsockAddr, src_port: u32, buffer: &mut [u8], ) -> Result<usize>
Reads data received from the given connection.
Sourcepub fn recv_buffer_available_bytes(
&mut self,
peer: VsockAddr,
src_port: u32,
) -> Result<usize>
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.
Sourcepub fn update_credit(&mut self, peer: VsockAddr, src_port: u32) -> Result
pub fn update_credit(&mut self, peer: VsockAddr, src_port: u32) -> Result
Sends a credit update to the given peer.
Sourcepub fn wait_for_event(&mut self) -> Result<VsockEvent>
pub fn wait_for_event(&mut self) -> Result<VsockEvent>
Blocks until we get some event from the vsock device.
Sourcepub fn shutdown(&mut self, destination: VsockAddr, src_port: u32) -> Result
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.
Sourcepub fn force_close(&mut self, destination: VsockAddr, src_port: u32) -> Result
pub fn force_close(&mut self, destination: VsockAddr, src_port: u32) -> Result
Forcibly closes the connection without waiting for the peer.