use errno::Errno;
use mnl::{Attr, AttrTbl, MsgVec, Result};
use netfilter::nfnetlink_conntrack;
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum NfqnlMsgTypes {
Packet = 0, Verdict, Config, VerdictBatch, MAX,
}
pub const NFQNL_MSG_PACKET: u8 = NfqnlMsgTypes::Packet as u8;
pub const NFQNL_MSG_VERDICT: u8 = NfqnlMsgTypes::Verdict as u8;
pub const NFQNL_MSG_CONFIG: u8 = NfqnlMsgTypes::Config as u8;
pub const NFQNL_MSG_VERDICT_BATCH: u8 = NfqnlMsgTypes::VerdictBatch as u8;
pub const NFQNL_MSG_MAX: u8 = NfqnlMsgTypes::MAX as u8;
#[repr(C, packed)]
#[derive(Debug, Clone, Copy)]
pub struct NfqnlMsgPacketHdr {
pub packet_id: u32, pub hw_protocol: u16, pub hook: u8, }
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct NfqnlMsgPacketHw {
pub hw_addrlen: u16,
pub _pad: u16,
pub hw_addr: [u8; 8usize],
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct NfqnlMsgPacketTimestamp {
pub sec: u64,
pub usec: u64,
}
#[repr(u16)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, NlaType)]
#[tbname = "NfqnlVlanAttrTbl"]
pub enum NfqnlVlanAttr {
Unspec = 0,
#[nla_type(u16, proto)]
Proto,
#[nla_type(u16, tci)]
Tci,
_MAX,
}
#[repr(u16)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, NlaType)]
#[tbname = "NfqnlAttrTypeTbl"]
pub enum NfqnlAttrType {
Unspec = 0,
#[nla_type(NfqnlMsgPacketHdr, packet_hdr)]
PacketHdr,
#[nla_type(NfqnlMsgVerdictHdr, verdict_hdr)]
VerdictHdr,
#[nla_type(u32, mark)]
Mark,
#[nla_type(NfqnlMsgPacketTimestamp, timestamp)]
Timestamp,
#[nla_type(u32, ifindex_indev)]
IfindexIndev,
#[nla_type(u32, ifindex_outdev)]
IfindexOutdev,
#[nla_type(u32, ifindex_phyindev)]
IfindexPhyindev,
#[nla_type(u32, ifindex_phyoutdev)]
IfindexPhyoutdev,
#[nla_type(NfqnlMsgPacketHw, hwaddr)]
Hwaddr,
#[nla_type(bytes, payload)]
Payload,
#[nla_nest(nfnetlink_conntrack::CtattrTypeTbl, ct)]
Ct,
#[nla_type(u8, ct_info)]
CtInfo,
#[nla_type(u32, cap_len)]
CapLen,
#[nla_type(u32, skb_info)]
SkbInfo,
#[nla_nest(nfnetlink_conntrack::CtattrExpectTbl, exp)]
Exp,
#[nla_type(u32, uid)]
Uid,
#[nla_type(u32, gid)]
Gid,
#[nla_type(bytes, secctx)]
Secctx,
#[nla_nest(NfqnlVlanAttrTbl, vlan)]
Vlan,
#[nla_type(bytes, l2hdr)]
L2hdr, _MAX,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct NfqnlMsgVerdictHdr {
pub verdict: u32,
pub id: u32,
}
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum NfqnlMsgConfigCmds {
None = 0,
Bind,
Unbind,
PfBind,
PfUnbind,
}
pub const NFQNL_CFG_CMD_NONE: u8 = NfqnlMsgConfigCmds::None as u8;
pub const NFQNL_CFG_CMD_BIND: u8 = NfqnlMsgConfigCmds::Bind as u8;
pub const NFQNL_CFG_CMD_UNBIND: u8 = NfqnlMsgConfigCmds::Unbind as u8;
pub const NFQNL_CFG_CMD_PF_BIND: u8 = NfqnlMsgConfigCmds::PfBind as u8;
pub const NFQNL_CFG_CMD_PF_UNBIND: u8 = NfqnlMsgConfigCmds::PfUnbind as u8;
#[repr(C)]
#[derive(Debug, Clone, Copy, Default)]
pub struct NfqnlMsgConfigCmd {
pub command: u8, pub _pad: u8,
pub pf: u16, }
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum NfqnlConfigMode {
None = 0,
Meta,
Packet,
}
pub const NFQNL_COPY_NONE: u8 = NfqnlConfigMode::None as u8;
pub const NFQNL_COPY_META: u8 = NfqnlConfigMode::Meta as u8;
pub const NFQNL_COPY_PACKET: u8 = NfqnlConfigMode::Packet as u8;
#[repr(C, packed)]
#[derive(Debug, Clone, Copy)]
pub struct NfqnlMsgConfigParams {
pub copy_range: u32,
pub copy_mode: u8, }
#[repr(u16)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, NlaType)]
#[tbname = "NfqnlAttrConfigTbl"]
pub enum NfqnlAttrConfig {
Unspec = 0,
#[nla_type(NfqnlMsgConfigCmd, cmd)]
Cmd,
#[nla_type(NfqnlMsgConfigParams, params)]
Params,
#[nla_type(u32, queue_max_len)]
QueueMaxlen,
#[nla_type(u32, mask)]
Mask,
#[nla_type(u32, flags)]
Flags,
_MAX,
}
pub const NFQA_CFG_F_FAIL_OPEN: u32 = 1 << 0;
pub const NFQA_CFG_F_CONNTRACK: u32 = 1 << 1;
pub const NFQA_CFG_F_GSO: u32 = 1 << 2;
pub const NFQA_CFG_F_UID_GID: u32 = 1 << 3;
pub const NFQA_CFG_F_SECCTX: u32 = 1 << 4;
pub const NFQA_CFG_F_MAX: u32 = 1 << 5;
pub const NFQA_SKB_CSUMNOTREADY: u32 = 1 << 0;
pub const NFQA_SKB_GSO: u32 = 1 << 1;
pub const NFQA_SKB_CSUM_NOTVERIFIED: u32 = 1 << 2;