pub struct FramePool { /* private fields */ }Expand description
Implementations§
Source§impl FramePool
impl FramePool
Sourcepub fn try_new(
name: impl Into<String>,
capacity: u32,
frame_size: u32,
) -> Result<FramePool, CoreError>
pub fn try_new( name: impl Into<String>, capacity: u32, frame_size: u32, ) -> Result<FramePool, CoreError>
Sourcepub fn new(name: impl Into<String>, capacity: u32, frame_size: u32) -> FramePool
pub fn new(name: impl Into<String>, capacity: u32, frame_size: u32) -> FramePool
创建新的 Frame 池(兼容版本,禁止 panic)
参数非法(frame_size == 0 / capacity == 0 / 地址空间溢出)时不 panic,
回退到最小合法配置(capacity=1, frame_size=1),回退前以 tracing::error!
记录完整原因(池名、参数与底层错误),避免静默降级难以排查。
推荐使用 FramePool::try_new:显式返回错误、可在调用方精确处置;
本构造函数仅为不便于传播错误的兼容调用方保留。
§Arguments
name- 池名称capacity- 总容量(帧数)frame_size- 每个 Frame 的大小(字节)
§Returns
新的 FramePool 实例
Sourcepub fn frame_size(&self) -> u32
pub fn frame_size(&self) -> u32
获取帧大小
Sourcepub fn allocated_count(&self) -> u32
pub fn allocated_count(&self) -> u32
获取已分配数量
Sourcepub fn free_count(&self) -> u32
pub fn free_count(&self) -> u32
获取空闲数量
Sourcepub fn quarantined_count(&self) -> u32
pub fn quarantined_count(&self) -> u32
获取隔离区数量
Sourcepub fn release(&mut self, token: FrameToken) -> Result<(), CoreError>
pub fn release(&mut self, token: FrameToken) -> Result<(), CoreError>
归还 Frame(O(1),零锁零堆分配)
验证令牌所有权后,将帧放回 Free-List 栈。
注意:即使验证失败(返回 Err),token 也会被消费(drop),
对应的帧将永久泄漏。如果需要在失败后保留令牌以便重试或另行处理,
请使用 FramePool::release_recoverable。
§Arguments
token- 所有权令牌(被消费,即使在错误路径上也会被 drop)
§Returns
Ok(())- 成功归还Err(CoreError::OwnershipViolation)- 所有权违规(token 已被消费)
Sourcepub fn release_recoverable(
&mut self,
token: FrameToken,
) -> Result<(), (FrameToken, CoreError)>
pub fn release_recoverable( &mut self, token: FrameToken, ) -> Result<(), (FrameToken, CoreError)>
Sourcepub fn quarantine(
&mut self,
token: FrameToken,
reason: impl Into<String>,
) -> Result<(), CoreError>
pub fn quarantine( &mut self, token: FrameToken, reason: impl Into<String>, ) -> Result<(), CoreError>
Sourcepub fn recover_from_quarantine(
&mut self,
frame_id: FrameId,
) -> Result<(), CoreError>
pub fn recover_from_quarantine( &mut self, frame_id: FrameId, ) -> Result<(), CoreError>
从隔离区回收 Frame
注意:本方法仅凭 frame_id 回收,不验证代际(CORE-008)。
仅适用于调用方可确认帧未被回收重新分配的内部安全场景。
数据面路径(持有 frame_id + expected_generation)应使用
recover_from_quarantine_by_id,
以代际验证防止陈旧 FrameId 被复用。
§Arguments
frame_id- Frame ID
§Returns
Ok(())- 成功回收Err(CoreError::ResourceNotFound)- Frame 不在隔离区
Sourcepub fn recover_from_quarantine_by_id(
&mut self,
frame_id: FrameId,
expected_generation: u64,
) -> Result<(), CoreError>
pub fn recover_from_quarantine_by_id( &mut self, frame_id: FrameId, expected_generation: u64, ) -> Result<(), CoreError>
从隔离区回收 Frame(代际验证版本,CORE-008)
与 recover_from_quarantine 语义一致,
额外校验期望代际号与当前帧代际一致,防止陈旧 FrameId 被恶意复用到
新帧上(防 ABA)。适用于 Worker 数据面等持有 frame_id + expected_generation
的调用路径。
§Arguments
frame_id- Frame IDexpected_generation- 期望的代际号(必须匹配当前帧的代际)
§Returns
Ok(())- 成功回收Err(CoreError::ResourceNotFound)- Frame 不在隔离区Err(CoreError::OwnershipViolation)- 代际不匹配
Sourcepub fn quarantine_by_id(
&mut self,
frame_id: FrameId,
expected_generation: u64,
reason: impl Into<String>,
) -> Result<(), CoreError>
pub fn quarantine_by_id( &mut self, frame_id: FrameId, expected_generation: u64, reason: impl Into<String>, ) -> Result<(), CoreError>
通过 Frame ID 隔离帧(无 Token 场景)
当 FrameToken 已被消费(如通过 Ring 传递给内核)时, 只能通过 Frame ID 来隔离帧。此方法用于 Worker 数据面循环 中的解析错误和准入拒绝场景。
§安全保证
必须传入期望的代际号,用于验证帧未被回收重新分配。 这防止了陈旧 FrameID 被恶意复用到新帧上。
§状态转换
Allocated/Processing/InRxRing/InTxRing/InCompletionRing → Quarantine
§Arguments
frame_id- Frame IDexpected_generation- 期望的代际号(必须匹配当前帧的代际)reason- 隔离原因
§Returns
Ok(())- 成功隔离Err(CoreError::OwnershipViolation)- 代际不匹配或状态非法
Sourcepub fn advance_generation(&mut self) -> u64
pub fn advance_generation(&mut self) -> u64
Sourcepub fn current_generation(&self) -> u64
pub fn current_generation(&self) -> u64
获取当前代际号
Sourcepub fn advance_epoch(&mut self) -> u64
pub fn advance_epoch(&mut self) -> u64
Sourcepub fn current_epoch(&self) -> u64
pub fn current_epoch(&self) -> u64
获取当前 Epoch 编号
Sourcepub fn get_frame_info(&self, frame_id: FrameId) -> Option<FrameInfo>
pub fn get_frame_info(&self, frame_id: FrameId) -> Option<FrameInfo>
Sourcepub fn allocate_batch(
&mut self,
domain_id: u32,
count: u32,
) -> Result<Vec<FrameToken>, CoreError>
pub fn allocate_batch( &mut self, domain_id: u32, count: u32, ) -> Result<Vec<FrameToken>, CoreError>
Sourcepub fn release_batch(
&mut self,
tokens: Vec<FrameToken>,
) -> Result<(), CoreError>
pub fn release_batch( &mut self, tokens: Vec<FrameToken>, ) -> Result<(), CoreError>
Sourcepub fn verify_conservation(&self) -> Result<(), CoreError>
pub fn verify_conservation(&self) -> Result<(), CoreError>
Sourcepub fn release_by_id(
&mut self,
frame_id: FrameId,
expected_generation: u64,
) -> Result<(), CoreError>
pub fn release_by_id( &mut self, frame_id: FrameId, expected_generation: u64, ) -> Result<(), CoreError>
通过 Frame ID 归还 Frame(O(1),用于环形队列回收路径)
此方法用于 AF_XDP 环形队列完成回收路径, 通过帧索引直接归还帧,无需 FrameToken。
§安全保证
必须传入期望的代际号,用于验证帧未被回收重新分配。 同时验证帧必须处于 Allocated 状态。
§安全约束
- 帧必须处于 Allocated 状态
- 代际号必须匹配当前帧的代际
- 调用者必须确保没有其他持有者在使用该帧
§Arguments
frame_id- Frame IDexpected_generation- 期望的代际号(必须匹配当前帧的代际)
§Returns
Ok(())- 成功归还Err(CoreError::OwnershipViolation)- 帧不在 Allocated 状态或代际不匹配