use rustables_macros::{nfnetlink_enum, nfnetlink_struct};
use super::{Expression, Register};
use crate::sys;
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
#[nfnetlink_enum(u32)]
#[non_exhaustive]
pub enum MetaType {
Protocol = sys::NFT_META_PROTOCOL,
Mark = sys::NFT_META_MARK,
Iif = sys::NFT_META_IIF,
Oif = sys::NFT_META_OIF,
IifName = sys::NFT_META_IIFNAME,
OifName = sys::NFT_META_OIFNAME,
IifType = libc::NFT_META_IIFTYPE,
OifType = sys::NFT_META_OIFTYPE,
SkUid = sys::NFT_META_SKUID,
SkGid = sys::NFT_META_SKGID,
NfProto = sys::NFT_META_NFPROTO,
L4Proto = sys::NFT_META_L4PROTO,
Cgroup = sys::NFT_META_CGROUP,
PRandom = sys::NFT_META_PRANDOM,
}
#[derive(Clone, PartialEq, Eq, Default, Debug)]
#[nfnetlink_struct]
pub struct Meta {
#[field(sys::NFTA_META_DREG)]
dreg: Register,
#[field(sys::NFTA_META_KEY)]
key: MetaType,
#[field(sys::NFTA_META_SREG)]
sreg: Register,
}
impl Meta {
pub fn new(ty: MetaType) -> Self {
Meta::default().with_dreg(Register::Reg1).with_key(ty)
}
}
impl Expression for Meta {
fn get_name() -> &'static str {
"meta"
}
}