use core::net::{Ipv4Addr, SocketAddrV4};
use crate::parser::{ByteOrder, Parser};
use crate::{Error, Head};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Protocol(pub u16);
impl Protocol {
pub const ICMP: Self = Self(1);
pub const IGMP: Self = Self(2);
pub const TCP: Self = Self(6);
pub const UDP: Self = Self(17);
pub const IPV6: Self = Self(41);
pub const IPV6_ROUTE: Self = Self(43);
pub const IPV6_FRAG: Self = Self(44);
pub const GRE: Self = Self(47);
pub const ESP: Self = Self(50);
pub const AH: Self = Self(51);
pub const IPV6_ICMP: Self = Self(58);
pub const IPV6_NO_NXT: Self = Self(59);
pub const IPV6_OPTS: Self = Self(60);
pub const SCTP: Self = Self(132);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Ipv4 {
pub local: SocketAddrV4,
pub remote: SocketAddrV4,
pub protocol: Protocol,
pub static_ip: bool,
pub gateway_ip: Ipv4Addr,
pub subnet_mask: Ipv4Addr,
}
impl<'a> TryFrom<Head<'a>> for Ipv4 {
type Error = Error;
fn try_from(mut node: Head<'a>) -> Result<Self, Self::Error> {
let local_ip: Ipv4Addr = From::<[u8; 4]>::from(node.data.parse(())?);
let remote_ip: Ipv4Addr = From::<[u8; 4]>::from(node.data.parse(())?);
let local = SocketAddrV4::new(local_ip, node.data.parse(ByteOrder::Little)?);
let remote = SocketAddrV4::new(remote_ip, node.data.parse(ByteOrder::Little)?);
let protocol = Protocol(node.data.parse(ByteOrder::Little)?);
let static_ip = node.data.parse(())?;
let gateway_ip: Ipv4Addr = From::<[u8; 4]>::from(node.data.parse(())?);
let subnet_mask: Ipv4Addr = From::<[u8; 4]>::from(node.data.finish(())?);
Ok(Self {
local,
remote,
protocol,
static_ip,
gateway_ip,
subnet_mask,
})
}
}