use std::net::IpAddr;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Dir {
SrcOrDst,
Src,
Dst,
SrcAndDst,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AddrType {
Unspecified,
Host,
Net,
Port,
PortRange,
Ether,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct IpNet {
pub addr: std::net::Ipv4Addr,
pub mask: u32,
}
impl IpNet {
pub fn from_prefix(addr: std::net::Ipv4Addr, prefix_len: u8) -> Self {
let mask = if prefix_len == 0 {
0
} else {
!0u32 << (32 - prefix_len)
};
Self { addr, mask }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct MacAddr(pub [u8; 6]);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Proto {
Ip,
Ip6,
Arp,
Rarp,
Tcp,
Udp,
Icmp,
Icmp6,
Igmp,
Sctp,
Num(u8),
Ip6Proto(u8),
}
#[derive(Debug, Clone, PartialEq)]
pub enum Primitive {
Host { addr: IpAddr, dir: Dir },
Port {
port: u16,
dir: Dir,
proto: Option<Proto>,
},
PortRange {
lo: u16,
hi: u16,
dir: Dir,
proto: Option<Proto>,
},
Net { net: IpNet, dir: Dir },
Proto(Proto),
EtherHost { addr: MacAddr, dir: Dir },
EtherProto(u16),
EtherMulticast,
IpBroadcast,
IpMulticast,
Ip6Multicast,
Vlan { id: Option<u16> },
Mpls { label: Option<u32> },
PppoeDiscovery,
PppoeSession,
Len { op: CmpOp, value: u32 },
Inbound,
Outbound,
ByteAccess(ByteAccess),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CmpOp {
Eq,
Ne,
Lt,
Le,
Gt,
Ge,
BitAnd,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AccessSize {
Byte,
Half,
Word,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Layer {
Raw,
Net,
Trans,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ByteAccess {
pub layer: Layer,
pub offset: i32,
pub size: AccessSize,
pub mask: Option<u32>,
pub op: CmpOp,
pub value: u32,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Expr {
And(Box<Expr>, Box<Expr>),
Or(Box<Expr>, Box<Expr>),
Not(Box<Expr>),
Primitive(Primitive),
}