use bytes::Bytes;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
use crate::extractor::L4Proto;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum IcmpFamily {
V4,
V6,
}
#[derive(Debug, Clone)]
pub struct IcmpMessage {
pub family: IcmpFamily,
pub ty: IcmpType,
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum IcmpType {
V4(Icmpv4Type),
V6(Icmpv6Type),
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum Icmpv4Type {
EchoReply { id: u16, seq: u16 },
DestinationUnreachable {
code: Icmpv4DestUnreachCode,
inner: Option<IcmpInner>,
},
Redirect {
code: Icmpv4RedirectCode,
gateway: Ipv4Addr,
inner: Option<IcmpInner>,
},
EchoRequest { id: u16, seq: u16 },
TimeExceeded {
code: Icmpv4TimeExceededCode,
inner: Option<IcmpInner>,
},
ParameterProblem {
pointer: u8,
inner: Option<IcmpInner>,
},
Timestamp {
id: u16,
seq: u16,
originate: u32,
receive: u32,
transmit: u32,
},
TimestampReply {
id: u16,
seq: u16,
originate: u32,
receive: u32,
transmit: u32,
},
Other {
raw_type: u8,
raw_code: u8,
raw_body: Bytes,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Icmpv4DestUnreachCode {
Net,
Host,
Protocol,
Port,
FragmentationNeeded { mtu: Option<u16> },
SourceRouteFailed,
DestNetworkUnknown,
DestHostUnknown,
SourceHostIsolated,
NetworkProhibited,
HostProhibited,
NetworkTos,
HostTos,
CommunicationProhibited,
HostPrecedenceViolation,
PrecedenceCutoffInEffect,
Other(u8),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Icmpv4RedirectCode {
Network,
Host,
Tos,
TosHost,
Other(u8),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Icmpv4TimeExceededCode {
HopLimitExceeded,
FragmentReassemblyTimeExceeded,
Other(u8),
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum Icmpv6Type {
DestinationUnreachable {
code: Icmpv6DestUnreachCode,
inner: Option<IcmpInner>,
},
PacketTooBig { mtu: u32, inner: Option<IcmpInner> },
TimeExceeded {
code: Icmpv6TimeExceededCode,
inner: Option<IcmpInner>,
},
ParameterProblem {
code: Icmpv6ParamProblemCode,
pointer: u32,
inner: Option<IcmpInner>,
},
EchoRequest { id: u16, seq: u16 },
EchoReply { id: u16, seq: u16 },
NeighborSolicitation { target: Ipv6Addr },
NeighborAdvertisement {
target: Ipv6Addr,
router: bool,
solicited: bool,
override_: bool,
},
Other {
raw_type: u8,
raw_code: u8,
raw_body: Bytes,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Icmpv6DestUnreachCode {
NoRoute,
AdminProhibited,
BeyondScopeOfSource,
AddressUnreachable,
PortUnreachable,
SourceAddressFailedIngressPolicy,
RejectRouteToDestination,
Other(u8),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Icmpv6TimeExceededCode {
HopLimitExceeded,
FragmentReassemblyTimeExceeded,
Other(u8),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Icmpv6ParamProblemCode {
ErroneousHeaderField,
UnrecognizedNextHeaderType,
UnrecognizedIpv6Option,
Other(u8),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct IcmpInner {
pub src: IpAddr,
pub dst: IpAddr,
pub proto: L4Proto,
pub src_port: Option<u16>,
pub dst_port: Option<u16>,
}