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 硬件支持
每月下载量 2,747
用于 vhost-device-vsock
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_cid、dst_port、op)的设置器和获取器。
用法
驱动程序队列在 RX virtqueue 上接收缓冲区,在 TX virtqueue 上发送数据包。设备使用 VsockPacket::from_rx_virtq_chain
处理 RX virtqueue,并用 vsock 后端的数据填充缓冲区。在 TX 方面,设备使用 VsockPacket::from_tx_virtq_chain
处理 TX 队列,将读取的缓冲区打包成 vsock 数据包,然后发送到后端。
示例
使用示例可以在 数据包模块 的文档测试中找到。
许可证
本项目的许可证为以下之一
- Apache 许可证,版本 2.0
- BSD-3-Clause 许可证
依赖关系
~1–1.7MB
~32K SLoC