8 个版本 (5 个破坏性版本)

0.6.0 2024 年 5 月 6 日
0.5.0 2024 年 1 月 10 日
0.4.0 2023 年 11 月 10 日
0.3.1 2023 年 7 月 4 日
0.1.0 2022 年 5 月 19 日

#71 in 硬件支持

Download history 193/week @ 2024-04-30 230/week @ 2024-05-07 135/week @ 2024-05-14 94/week @ 2024-05-21 227/week @ 2024-05-28 295/week @ 2024-06-04 113/week @ 2024-06-11 78/week @ 2024-06-18 128/week @ 2024-06-25 326/week @ 2024-07-02 450/week @ 2024-07-09 736/week @ 2024-07-16 756/week @ 2024-07-23 713/week @ 2024-07-30 641/week @ 2024-08-06 411/week @ 2024-08-13

每月下载量 2,747
用于 vhost-device-vsock

Apache-2.0 OR BSD-3-Clause

420KB
10K SLoC

virtio-vsock

virtio-vsock 包提供了对 vsock 设备 组件的抽象。目前,它只提供对 vsock 数据包的实现。只支持流套接字。

vsock 设备是一种套接字设备,可以用作主机和客户机之间的通信机制。它使用 virtio 标准实现。vsock 设备有三个队列:一个接收队列,一个发送队列和一个事件队列。以简化的方式,主机和客户机之间的通信是通过设备队列交换的缓冲区来实现的。这些缓冲区在 vsock 设备上下文中称为数据包。

Vsock 数据包

设计

virtio vsock 数据包在标准中定义为具有类型为 virtio_vsock_hdr 的头和可选的 data 字节数组。数据包中可以请求多种操作,例如,使用 VIRTIO_VSOCK_OP_RST 重置连接,使用 VIRTIO_VSOCK_OP_RW 发送有效负载。大多数操作是 VIRTIO_VSOCK_OP_RW 类型,表示数据传输,其他操作用于连接和缓冲区空间管理。对于 VIRTIO_VSOCK_OP_RW 操作,data 才是非空的。

数据包实现使用的抽象是 VsockPacket。它使用 VolatileSlice 来表示头部和数据。我们选择使用 VolatileSlice 是因为它是对不安全 Rust 原始指针的安全包装,并且它足够通用,允许从切片指针创建数据包。采用基于 GuestMemory 的方法将无法实现此类配置。更多详细信息(包括设计限制)请参见 packet 模块级别的文档

VsockPacket 实例是通过解析来自 TX 或 RX virtqueue 的描述符链创建的。VsockPacket API 还提供方法,可以直接从切片指针创建/设置数据包。它还提供了每个 virtio_vsock_hdr 字段(例如 src_ciddst_portop)的设置器和获取器。

用法

驱动程序队列在 RX virtqueue 上接收缓冲区,在 TX virtqueue 上发送数据包。设备使用 VsockPacket::from_rx_virtq_chain 处理 RX virtqueue,并用 vsock 后端的数据填充缓冲区。在 TX 方面,设备使用 VsockPacket::from_tx_virtq_chain 处理 TX 队列,将读取的缓冲区打包成 vsock 数据包,然后发送到后端。

示例

使用示例可以在 数据包模块 的文档测试中找到。

许可证

本项目的许可证为以下之一

依赖关系

~1–1.7MB
~32K SLoC