#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum IcmpType {
EchoRep,
Unreach(IcmpUnreachCode),
EchoReq,
Timex(IcmpTimexCode),
Trace,
Icmp6(Icmp6Type),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
#[repr(u8)]
pub enum IcmpUnreachCode {
NetUnreach = 0,
HostUnreach = 1,
ProtoUnreach = 2,
PortUnreach = 3,
NeedFrag = 4,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
#[repr(u8)]
pub enum IcmpTimexCode {
Transit = 0,
Reassembly = 1,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
#[repr(u8)]
pub enum Icmp6Type {
RouterSol = 133,
RouterAdv = 134,
NeighbrSol = 135,
NeighbrAdv = 136,
Redir = 137,
}
impl IcmpType {
fn raw_type(&self) -> u8 {
use IcmpType::*;
match self {
EchoRep => 0,
Unreach(_) => 3,
EchoReq => 8,
Timex(_) => 11,
Trace => 30,
Icmp6(icmp6_type) => *icmp6_type as u8,
}
}
fn raw_code(&self) -> Option<u8> {
use IcmpType::*;
match self {
Unreach(unreach_code) => Some(*unreach_code as u8),
Timex(timex_code) => Some(*timex_code as u8),
_ => None,
}
}
}
impl crate::conversion::CopyTo<crate::ffi::pfvar::pf_rule> for IcmpType {
fn copy_to(&self, pf_rule: &mut crate::ffi::pfvar::pf_rule) {
pf_rule.type_ = self.raw_type() + 1;
pf_rule.code = match self.raw_code() {
Some(raw_code) => raw_code + 1,
None => 0,
};
}
}