| # virtio-vsock |
| |
| The `virtio-vsock` crate provides abstractions for the components of the |
| [vsock device](https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.html#x1-39000010). |
| 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 |
| [`VolatileSlice`](https://github.com/rust-vmm/vm-memory/blob/fc7153a4f63c352d1fa9419c4654a6c9aec408cb/src/volatile_memory.rs#L266)s |
| 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](src/packet.rs). |
| |
| 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](src/packet.rs). |
| |
| ## License |
| |
| This project is licensed under either of |
| |
| - [Apache License](http://www.apache.org/licenses/LICENSE-2.0), Version 2.0 |
| - [BSD-3-Clause License](https://opensource.org/licenses/BSD-3-Clause) |