Expand description
AF_XDP Ring 操作封装
实现与内核 AF_XDP Ring 兼容的四环操作(Fill/RX/TX/Completion):
- 支持模拟模式(Vec
backing store,用于测试和开发) - 支持内核 mmap 模式(通过 XDP_MMAP_OFFSETS 获取内核 ring 地址)
- SPSC 无锁批量操作
- 基于 XdpDesc(内核 xdp_desc)的描述符传递
§内核 Ring 结构
AF_XDP Ring 在内核中的内存布局(每 ring):
[flags] (4 bytes) - XDP_RING_NEED_WAKEUP 等标志
[producer] (4 bytes) - 生产者索引(用户态写,内核态读)
[consumer] (4 bytes) - 消费者索引(内核态写,用户态读)
[desc0] (16 bytes) - 第一个 xdp_desc
[desc1] (16 bytes) - 第二个 xdp_desc
...§偏移量
通过 getsockopt(XDP_MMAP_OFFSETS) 获取各 ring 偏移:
- XDP_RX_RING_OFFSET: RX Ring 在 mmap 中的偏移
- XDP_TX_RING_OFFSET: TX Ring 在 mmap 中的偏移
- XDP_FILL_RING_OFFSET: Fill Ring 在 mmap 中的偏移
- XDP_COMPLETION_RING_OFFSET: Completion Ring 在 mmap 中的偏移
§unsafe 使用
本文件实现与内核共享内存的 Ring 原语,包含 mmap 地址读写与裸指针访问。
是 crate 内部四个被精确放开 #[allow(unsafe_code)] 的文件之一。
Structs§
- Ring
Offsets - Ring 内存布局偏移(相对于 ring 起始地址)
- XskRing
- AF_XDP Ring
Enums§
- Ring
Type - Ring 类型
Constants§
- MAX_
SIMULATED_ CAPACITY - 模拟模式([
RingStorage::Simulated])环容量硬上限(2^20 = 1M 项) - XDP_
RING_ NEED_ WAKEUP - XDP_RING_NEED_WAKEUP 标志(内核 UAPI
include/uapi/linux/if_xdp.h:(1 << 0)= 0x1)