Bug: 298809828

Clone this repo:
  1. 587b2be Migrate 25 crates to monorepo by James Farrell · 4 months ago main master
  2. 35962d6 Update Android.bp by running cargo_embargo by James Farrell · 4 months ago
  3. 54238a7 Create patch from LICENSE file am: 674a2e97e4 by James Farrell · 6 months ago
  4. 674a2e9 Create patch from LICENSE file by James Farrell · 6 months ago
  5. 8db2b10 Update Android.bp by running cargo_embargo am: 3d33a35a50 am: 7cae39381e by James Farrell · 8 months ago android15-tests-dev aml_art_350913340 aml_art_351011240 aml_art_351011340 aml_art_351110180 aml_cbr_350910020 aml_cbr_351011020 aml_doc_350915120 aml_doc_351012120 aml_ext_350912020 aml_hef_350921160 aml_hef_351016140 aml_med_350914000 aml_med_351010060 aml_net_350911020 aml_net_351010000 aml_net_351010020 aml_per_350910080 aml_per_351014000 aml_res_351011000 aml_rkp_350910000 aml_rkp_351011000 aml_sdk_350910000 aml_sta_350911020 aml_tet_350911120 aml_tet_351010220 aml_uwb_350911040 aml_uwb_351011040 aml_wif_350912040 aml_wif_351010040

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