#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Verdict {
Continue = 0,
Drop = 1,
Modify = 2,
Halt = 3,
}
impl Verdict {
pub fn from_u32(v: u32) -> Option<Self> {
match v {
0 => Some(Verdict::Continue),
1 => Some(Verdict::Drop),
2 => Some(Verdict::Modify),
3 => Some(Verdict::Halt),
_ => None,
}
}
}
pub const VERDICT_CONTINUE: u32 = Verdict::Continue as u32;
pub const VERDICT_DROP: u32 = Verdict::Drop as u32;
pub const VERDICT_MODIFY: u32 = Verdict::Modify as u32;
pub const VERDICT_HALT: u32 = Verdict::Halt as u32;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct HookResult {
pub verdict: u32,
pub modified_data_offset: u32,
pub modified_data_len: u32,
pub inject_actions_offset: u32,
pub inject_actions_count: u32,
pub log_offset: u32,
pub log_len: u32,
}
impl HookResult {
pub fn is_drop(&self) -> bool {
self.verdict == Verdict::Drop as u32
}
pub fn continue_result() -> Self {
HookResult {
verdict: Verdict::Continue as u32,
modified_data_offset: 0,
modified_data_len: 0,
inject_actions_offset: 0,
inject_actions_count: 0,
log_offset: 0,
log_len: 0,
}
}
pub fn drop_result() -> Self {
HookResult {
verdict: Verdict::Drop as u32,
modified_data_offset: 0,
modified_data_len: 0,
inject_actions_offset: 0,
inject_actions_count: 0,
log_offset: 0,
log_len: 0,
}
}
pub fn modify_result(data_offset: u32, data_len: u32) -> Self {
HookResult {
verdict: Verdict::Modify as u32,
modified_data_offset: data_offset,
modified_data_len: data_len,
inject_actions_offset: 0,
inject_actions_count: 0,
log_offset: 0,
log_len: 0,
}
}
}