7 releases (4 breaking)

0.5.0 Jan 10, 2024
0.4.0 Nov 10, 2023
0.3.2 Oct 26, 2023
0.3.1 Jul 4, 2023
0.1.0 May 19, 2022

#106 in Hardware support

Download history 55/week @ 2023-12-20 176/week @ 2023-12-27 120/week @ 2024-01-03 203/week @ 2024-01-10 180/week @ 2024-01-17 55/week @ 2024-01-24 102/week @ 2024-01-31 260/week @ 2024-02-07 164/week @ 2024-02-14 148/week @ 2024-02-21 119/week @ 2024-02-28 189/week @ 2024-03-06 139/week @ 2024-03-13 296/week @ 2024-03-20 358/week @ 2024-03-27 123/week @ 2024-04-03

956 downloads per month
Used in vhost-device-vsock

Apache-2.0 OR BSD-3-Clause

420KB
10K SLoC

virtio-vsock

The virtio-vsock crate provides abstractions for the components of the vsock device. For now, it offers only an implementation for the vsock packet. The support is provided only for stream sockets.

The vsock device is a socket device that can be used as a communication mechanism between the host and the guest. It is implemented using the virtio standard. The vsock device has three queues: an RX one, a TX one and an event one. In a simplified manner, the communication between the host and the guest is realized with the buffers that are exchanged using the device’s queues. These buffers are called packets in the vsock device context.

Vsock Packet

Design

The virtio vsock packet is defined in the standard as having a header of type virtio_vsock_hdr and an optional data array of bytes. There are multiple operations that can be requested within a packet, e.g. VIRTIO_VSOCK_OP_RST for resetting the connection, VIRTIO_VSOCK_OP_RW for sending payload. Most operations are of the VIRTIO_VSOCK_OP_RW type, which means for data transfer, and the other ones are used for connection and buffer space management. data is non-empty only for the VIRTIO_VSOCK_OP_RW operations.

The abstraction used for the packet implementation is the VsockPacket. It is using VolatileSlices for representing the header and the data. We chose to use the VolatileSlice because it's a safe wrapper over the unsafe Rust's raw pointers, and it is also generic enough to allow creating packets from pointers to slices. Going with a GuestMemory based approach would not make such configuration possible. More details (including design limitations) in the packet's module-level documentation.

A VsockPacket instance is created by parsing a descriptor chain from either the TX or the RX virtqueue. The VsockPacket API is also providing methods for creating/setting up packets directly from pointers to slices. It also offers setters and getters for each virtio_vsock_hdr field (e.g. src_cid, dst_port, op).

Usage

The driver queues receive buffers on the RX virtqueue, and outgoing packets on the TX virtqueue. The device processes the RX virtqueue using VsockPacket::from_rx_virtq_chain and fills the buffers with data from the vsock backend. On the TX side, the device processes the TX queue using VsockPacket::from_tx_virtq_chain, packages the read buffers as vsock packets, and then sends them to the backend.

Examples

Examples of usage can be found as documentation tests in the packet module.

License

This project is licensed under either of

Dependencies

~1–1.7MB
~31K SLoC