pub struct XskSocket { /* private fields */ }Expand description
AF_XDP Socket
封装单个 AF_XDP Socket 的完整生命周期管理。 单 Owner 设计:每个 Socket 由一个 Worker 独占。
Implementations§
Source§impl XskSocket
impl XskSocket
Sourcepub fn new(config: XskConfig) -> Result<Self>
pub fn new(config: XskConfig) -> Result<Self>
创建 AF_XDP Socket(模拟模式,显式选择)
四环使用用户态 Vec<XdpDesc> backing store,不触碰任何内核 AF_XDP 资源,
适合无 root / 无 XDP 内核支持环境下的开发与测试。
真实内核模式请显式使用 XskSocket::new_real(或手动串联
create_socket → configure → bind)。本类型绝不静默降级:
模式在构造时选定,bind 失败一律返回错误(Fail-Closed)。
Sourcepub fn new_real(config: XskConfig, umem: Arc<UmemManager>) -> Result<Self>
pub fn new_real(config: XskConfig, umem: Arc<UmemManager>) -> Result<Self>
创建真实内核模式 AF_XDP Socket(显式选择,Fail-Closed)
完整执行真实系统调用链:
socket(AF_XDP, SOCK_RAW, 0)setsockopt(SO_RCVBUF/SO_SNDBUF)bind():XDP_UMEM_REG注册 → 四环大小 →getsockopt(XDP_MMAP_OFFSETS)→ 四环 mmap →bind(sockaddr_xdp)→ Fill Ring 预填
任何一步失败立即返回错误(WSL2 等不支持环境下返回明确错误),
绝不回退到模拟模式;模拟模式请显式使用 XskSocket::new。
§参数
config- Socket 配置(ifindex/queue_id/四环大小/帧大小等)umem- 已完成create()(mmap)的 UMEM 管理器
Sourcepub fn create_socket(&mut self) -> Result<()>
pub fn create_socket(&mut self) -> Result<()>
创建 Socket(系统调用)
Sourcepub fn bind(&mut self, umem: Arc<UmemManager>) -> Result<()>
pub fn bind(&mut self, umem: Arc<UmemManager>) -> Result<()>
绑定到网卡队列(真实内核注册,Fail-Closed)
完整 AF_XDP 绑定序列(与 libbpf xsk_socket__create 顺序一致):
setsockopt(XDP_UMEM_REG)注册 UMEM 内存区setsockopt(XDP_UMEM_FILL_RING/COMPLETION_RING/RX_RING/TX_RING)配置四环大小getsockopt(XDP_MMAP_OFFSETS)获取四环内核布局偏移mmap四环(XDP_PGOFF_RX_RING / XDP_PGOFF_TX_RING / XDP_UMEM_PGOFF_FILL_RING / XDP_UMEM_PGOFF_COMPLETION_RING), 四环切换为内核 mmap 模式(任一失败,已映射区域由 RingMmapGuard 回收)bind(sockaddr_xdp)绑定到 ifindex+queue_id- Fill Ring 预填帧地址,
XDP_RING_NEED_WAKEUP置位时sendto(MSG_DONTWAIT)唤醒内核
WSL2 等不支持环境下任一步骤失败即返回明确错误,绝不静默降级为模拟模式。
Sourcepub fn prefill_fill_ring(&mut self) -> Result<u32>
pub fn prefill_fill_ring(&mut self) -> Result<u32>
Fill Ring 预填:将 UMEM 前 N 个帧地址写入 Fill Ring
N = min(fill_ring 容量, UMEM 帧数)。每个帧同时在描述符引擎中登记
(位图置位),保证守恒等式成立。预填后若内核 XDP_RING_NEED_WAKEUP
置位,通过 sendto(fd, NULL, 0, MSG_DONTWAIT, NULL, 0) 唤醒内核轮询。
§返回
Result<u32>- 实际预填的帧数
Sourcepub fn is_kernel_mode(&self) -> bool
pub fn is_kernel_mode(&self) -> bool
是否为内核 mmap 模式(bind 成功后四环已切换为内核共享映射)
Sourcepub fn fill_ring_mut(&mut self) -> &mut XskRing
pub fn fill_ring_mut(&mut self) -> &mut XskRing
获取 Fill Ring 可变引用
Sourcepub fn rx_ring_mut(&mut self) -> &mut XskRing
pub fn rx_ring_mut(&mut self) -> &mut XskRing
获取 RX Ring 可变引用
Sourcepub fn tx_ring_mut(&mut self) -> &mut XskRing
pub fn tx_ring_mut(&mut self) -> &mut XskRing
获取 TX Ring 可变引用
Sourcepub fn completion_ring(&self) -> &XskRing
pub fn completion_ring(&self) -> &XskRing
获取 Completion Ring 引用
Sourcepub fn completion_ring_mut(&mut self) -> &mut XskRing
pub fn completion_ring_mut(&mut self) -> &mut XskRing
获取 Completion Ring 可变引用
Sourcepub fn descriptor_engine(&self) -> &DescriptorEngine
pub fn descriptor_engine(&self) -> &DescriptorEngine
获取描述符引擎引用
Sourcepub fn fill_descriptors(&mut self, count: u32) -> Result<u32>
pub fn fill_descriptors(&mut self, count: u32) -> Result<u32>
Sourcepub fn receive_batch(&mut self, max_batch: u32) -> Result<Vec<Descriptor>>
pub fn receive_batch(&mut self, max_batch: u32) -> Result<Vec<Descriptor>>
Sourcepub fn receive_batch_to(&mut self, buffer: &mut [Descriptor]) -> Result<u32>
pub fn receive_batch_to(&mut self, buffer: &mut [Descriptor]) -> Result<u32>
Sourcepub fn send_batch(&mut self, descriptors: &[Descriptor]) -> Result<u32>
pub fn send_batch(&mut self, descriptors: &[Descriptor]) -> Result<u32>
Sourcepub fn send_xdp_batch(&mut self, descriptors: &[XdpDesc]) -> Result<u32>
pub fn send_xdp_batch(&mut self, descriptors: &[XdpDesc]) -> Result<u32>
Sourcepub fn notify_tx(&self) -> Result<()>
pub fn notify_tx(&self) -> Result<()>
唤醒内核处理 TX Ring(sendto 系统调用)
当 XDP_RING_NEED_WAKEUP 标志置位时,通过 sendto(fd, NULL, 0, MSG_DONTWAIT, NULL, 0)
通知内核从 TX Ring 消费描述符并发送数据包。
模拟模式下为空操作(无需唤醒)。
Sourcepub fn notify_fill(&self) -> Result<()>
pub fn notify_fill(&self) -> Result<()>
唤醒内核处理 Fill Ring(sendto 系统调用)
当 XDP_RING_NEED_WAKEUP 标志置位时,通过
sendto(fd, NULL, 0, MSG_DONTWAIT, NULL, 0)
通知内核从 Fill Ring 获取空描述符并接收数据包。
(本实现四环齐备,xsk_sendmsg 路径可正常进入内核唤醒逻辑。)
模拟模式下为空操作(无 fd,无需唤醒)。
Sourcepub fn recycle_completed(&mut self, max_batch: u32) -> Result<u32>
pub fn recycle_completed(&mut self, max_batch: u32) -> Result<u32>
Sourcepub fn receive_and_refill(&mut self, max_batch: u32) -> Result<Vec<Descriptor>>
pub fn receive_and_refill(&mut self, max_batch: u32) -> Result<Vec<Descriptor>>
Sourcepub fn umem(&self) -> Option<&Arc<UmemManager>>
pub fn umem(&self) -> Option<&Arc<UmemManager>>
获取 UMEM 引用