1use errno::Errno;
2use mnl::{Attr, AttrTbl, MsgVec, Result};
3use netfilter::nfnetlink_conntrack;
4
5#[repr(u8)]
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub enum NfqnlMsgTypes {
8 Packet = 0, Verdict, Config, VerdictBatch, MAX,
14}
15pub const NFQNL_MSG_PACKET: u8 = NfqnlMsgTypes::Packet as u8;
16pub const NFQNL_MSG_VERDICT: u8 = NfqnlMsgTypes::Verdict as u8;
17pub const NFQNL_MSG_CONFIG: u8 = NfqnlMsgTypes::Config as u8;
18pub const NFQNL_MSG_VERDICT_BATCH: u8 = NfqnlMsgTypes::VerdictBatch as u8;
19pub const NFQNL_MSG_MAX: u8 = NfqnlMsgTypes::MAX as u8;
20
21#[repr(C, packed)]
22#[derive(Debug, Clone, Copy)]
23pub struct NfqnlMsgPacketHdr {
24 pub packet_id: u32, pub hw_protocol: u16, pub hook: u8, }
28
29#[repr(C)]
30#[derive(Debug, Clone, Copy)]
31pub struct NfqnlMsgPacketHw {
32 pub hw_addrlen: u16,
33 pub _pad: u16,
34 pub hw_addr: [u8; 8usize],
35}
36
37#[repr(C)]
38#[derive(Debug, Clone, Copy)]
39pub struct NfqnlMsgPacketTimestamp {
40 pub sec: u64,
41 pub usec: u64,
42}
43
44#[repr(u16)]
45#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, NlaType)]
46#[tbname = "NfqnlVlanAttrTbl"]
47pub enum NfqnlVlanAttr {
48 Unspec = 0,
50 #[nla_type(u16, proto)]
51 Proto, #[nla_type(u16, tci)]
54 Tci, _MAX,
57}
58
59#[repr(u16)]
60#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, NlaType)]
61#[tbname = "NfqnlAttrTypeTbl"]
62pub enum NfqnlAttrType {
63 Unspec = 0,
65
66 #[nla_type(NfqnlMsgPacketHdr, packet_hdr)]
67 PacketHdr,
68
69 #[nla_type(NfqnlMsgVerdictHdr, verdict_hdr)]
70 VerdictHdr, #[nla_type(u32, mark)]
73 Mark, #[nla_type(NfqnlMsgPacketTimestamp, timestamp)]
76 Timestamp, #[nla_type(u32, ifindex_indev)]
79 IfindexIndev, #[nla_type(u32, ifindex_outdev)]
82 IfindexOutdev, #[nla_type(u32, ifindex_phyindev)]
85 IfindexPhyindev, #[nla_type(u32, ifindex_phyoutdev)]
88 IfindexPhyoutdev, #[nla_type(NfqnlMsgPacketHw, hwaddr)]
91 Hwaddr, #[nla_type(bytes, payload)]
94 Payload, #[nla_nest(nfnetlink_conntrack::CtattrTypeTbl, ct)]
97 Ct, #[nla_type(u8, ct_info)]
100 CtInfo, #[nla_type(u32, cap_len)]
103 CapLen, #[nla_type(u32, skb_info)]
106 SkbInfo, #[nla_nest(nfnetlink_conntrack::CtattrExpectTbl, exp)]
109 Exp, #[nla_type(u32, uid)]
112 Uid, #[nla_type(u32, gid)]
115 Gid, #[nla_type(bytes, secctx)]
118 Secctx, #[nla_nest(NfqnlVlanAttrTbl, vlan)]
121 Vlan, #[nla_type(bytes, l2hdr)]
124 L2hdr, _MAX,
126}
127
128#[repr(C)]
129#[derive(Debug, Clone, Copy)]
130pub struct NfqnlMsgVerdictHdr {
131 pub verdict: u32,
132 pub id: u32,
133}
134
135#[repr(u8)]
136#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
137pub enum NfqnlMsgConfigCmds {
138 None = 0,
140 Bind,
141 Unbind,
142 PfBind,
143 PfUnbind,
144}
145pub const NFQNL_CFG_CMD_NONE: u8 = NfqnlMsgConfigCmds::None as u8;
146pub const NFQNL_CFG_CMD_BIND: u8 = NfqnlMsgConfigCmds::Bind as u8;
147pub const NFQNL_CFG_CMD_UNBIND: u8 = NfqnlMsgConfigCmds::Unbind as u8;
148pub const NFQNL_CFG_CMD_PF_BIND: u8 = NfqnlMsgConfigCmds::PfBind as u8;
149pub const NFQNL_CFG_CMD_PF_UNBIND: u8 = NfqnlMsgConfigCmds::PfUnbind as u8;
150
151#[repr(C)]
152#[derive(Debug, Clone, Copy, Default)]
153pub struct NfqnlMsgConfigCmd {
154 pub command: u8, pub _pad: u8,
156 pub pf: u16, }
158
159#[repr(u8)]
160#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
161pub enum NfqnlConfigMode {
162 None = 0,
164 Meta,
165 Packet,
166}
167pub const NFQNL_COPY_NONE: u8 = NfqnlConfigMode::None as u8;
168pub const NFQNL_COPY_META: u8 = NfqnlConfigMode::Meta as u8;
169pub const NFQNL_COPY_PACKET: u8 = NfqnlConfigMode::Packet as u8;
170
171#[repr(C, packed)]
172#[derive(Debug, Clone, Copy)]
173pub struct NfqnlMsgConfigParams {
174 pub copy_range: u32,
175 pub copy_mode: u8, }
177
178#[repr(u16)]
179#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, NlaType)]
180#[tbname = "NfqnlAttrConfigTbl"]
181pub enum NfqnlAttrConfig {
182 Unspec = 0,
184 #[nla_type(NfqnlMsgConfigCmd, cmd)]
185 Cmd, #[nla_type(NfqnlMsgConfigParams, params)]
188 Params, #[nla_type(u32, queue_max_len)]
191 QueueMaxlen, #[nla_type(u32, mask)]
194 Mask, #[nla_type(u32, flags)]
197 Flags, _MAX,
200}
201
202pub const NFQA_CFG_F_FAIL_OPEN: u32 = 1 << 0;
204pub const NFQA_CFG_F_CONNTRACK: u32 = 1 << 1;
205pub const NFQA_CFG_F_GSO: u32 = 1 << 2;
206pub const NFQA_CFG_F_UID_GID: u32 = 1 << 3;
207pub const NFQA_CFG_F_SECCTX: u32 = 1 << 4;
208pub const NFQA_CFG_F_MAX: u32 = 1 << 5;
209
210pub const NFQA_SKB_CSUMNOTREADY: u32 = 1 << 0;
213pub const NFQA_SKB_GSO: u32 = 1 << 1;
215pub const NFQA_SKB_CSUM_NOTVERIFIED: u32 = 1 << 2;