use bitflags::bitflags;
use chrono::prelude::*;
use neli::neli_enum;
use serde::{Deserialize, Serialize};
use std::{net, time::Duration};
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct Flow {
pub id: Option<u32>,
pub origin: Option<IpTuple>,
pub reply: Option<IpTuple>,
pub proto_info: Option<ProtoInfo>,
pub counter_origin: Option<Counter>,
pub counter_reply: Option<Counter>,
pub timeout: Option<Duration>,
pub status: Option<Vec<String>>,
pub entry_use: Option<u32>,
pub zone: Option<u16>,
pub mark: Option<u32>,
pub mark_mask: Option<u32>,
pub timestamp: Option<Timestamp>,
pub status_mask: Option<u32>,
pub helper: Option<Helper>,
pub nat_src: Option<Nat>,
pub seq_adj_orig: Option<SeqAdj>,
pub seq_adj_repl: Option<SeqAdj>,
pub sec_ctx: Option<SecCtx>,
pub sec_mark: Option<u32>,
pub exp: Option<Exp>,
}
#[neli_enum(serialized_type = "u8")]
#[derive(Serialize, Deserialize)]
pub enum IpProto {
Ip = 0u8,
Icmp = 1u8,
Igmp = 2u8,
Ipip = 4u8,
Tcp = 6u8,
Egp = 8u8,
Pup = 12u8,
Udp = 17u8,
Idp = 22u8,
Tp = 29u8,
Dccp = 33u8,
Ipv6 = 41u8,
Rsvp = 46u8,
Gre = 47u8,
Esp = 50u8,
Ah = 51u8,
Mtp = 92u8,
Beetph = 94u8,
Encap = 98u8,
Pim = 103u8,
Comp = 108u8,
L2tp = 115u8,
Sctp = 132u8,
Udplite = 136u8,
Mpls = 137u8,
Ethernet = 143u8,
Raw = 255u8,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct IpTuple {
pub src: Option<net::IpAddr>,
pub dst: Option<net::IpAddr>,
pub proto: Option<ProtoTuple>,
pub zone: Option<u16>,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct ProtoTuple {
pub number: Option<IpProto>,
pub src_port: Option<u16>,
pub dst_port: Option<u16>,
pub icmp_id: Option<u16>,
pub icmp_type: Option<u8>,
pub icmp_code: Option<u8>,
pub icmpv6_id: Option<u16>,
pub icmpv6_type: Option<u8>,
pub icmpv6_code: Option<u8>,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct ProtoInfo {
pub tcp: Option<TcpInfo>,
pub dccp: Option<DccpInfo>,
pub sctp: Option<SctpInfo>,
}
#[neli_enum(serialized_type = "u8")]
#[derive(Serialize, Deserialize)]
pub enum TcpState {
None = 0u8,
SynSent = 1u8,
SynRecv = 2u8,
Established = 3u8,
FinWait = 4u8,
CloseWait = 5u8,
LastAck = 6u8,
TimeWait = 7u8,
Close = 8u8,
SynSent2 = 9u8,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct TcpInfo {
pub state: Option<TcpState>,
pub wscale_orig: Option<u8>,
pub wscale_repl: Option<u8>,
pub flags_orig: Option<TcpFlags>,
pub flags_reply: Option<TcpFlags>,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct TcpFlags {
pub flags: Option<u8>,
pub mask: Option<u8>,
}
#[neli_enum(serialized_type = "u8")]
#[derive(Serialize, Deserialize)]
pub enum DccpState {
None = 0u8,
Request = 1u8,
Response = 2u8,
PartOpen = 3u8,
Open = 4u8,
CloseReq = 5u8,
Closing = 6u8,
Timewait = 7u8,
Ignore = 8u8,
Invalid = 9u8,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct DccpInfo {
pub state: Option<DccpState>,
pub role: Option<u8>,
pub handshake_seq: Option<u64>,
}
#[neli_enum(serialized_type = "u8")]
#[derive(Serialize, Deserialize)]
pub enum SctpState {
None = 0u8,
Closed = 1u8,
CookieWait = 2u8,
CookieEchoed = 3u8,
Established = 4u8,
ShutdownSent = 5u8,
ShutdownRecd = 6u8,
ShutdownAckSent = 7u8,
HeartbeatSent = 8u8,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct SctpInfo {
pub state: Option<SctpState>,
pub vtag_original: Option<u32>,
pub vtag_reply: Option<u32>,
}
#[derive(Copy, Clone, Default, Debug, Serialize, Deserialize)]
pub struct SrcDst(pub Option<net::IpAddr>, pub Option<net::IpAddr>);
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct Helper {
pub name: Option<String>,
pub info: Option<String>,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct SeqAdj {
pub correction_pos: Option<u32>,
pub offset_before: Option<u32>,
pub offset_after: Option<u32>,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct Counter {
pub packets: Option<u64>,
pub bytes: Option<u64>,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct SecCtx {
pub name: Option<String>,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct Timestamp {
pub start: Option<DateTime<Utc>>,
pub end: Option<DateTime<Utc>>,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct NatInfo {
pub dir: Option<u32>,
pub tuple: Option<IpTuple>,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct Exp {
pub naster: Option<IpTuple>,
pub tuple: Option<IpTuple>,
pub nask: Option<IpTuple>,
pub flags: Option<u32>,
pub class: Option<u32>,
pub id: Option<u32>,
pub timeout: Option<u32>,
pub zone: Option<u16>,
pub helper_name: Option<String>,
pub fnn: Option<String>,
pub nat: Option<NatInfo>,
}
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
pub struct Nat {
pub ip_min: Option<net::IpAddr>,
pub ip_max: Option<net::IpAddr>,
pub proto: Option<ProtoTuple>,
}
bitflags! {
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct StatusFlags: u32 {
const StatusExpected = 1;
const StatusSeenReply = 1 << 1;
const StatusAssured = 1 << 2;
const StatusConfirmed = 1 << 3;
const StatusSrcNAT = 1 << 4;
const StatusDstNAT = 1 << 5;
const StatusNATMask = Self::StatusDstNAT.bits() | Self::StatusSrcNAT.bits();
const StatusSeqAdjust = 1 << 6;
const StatusSrcNATDone = 1 << 7;
const StatusDstNATDone = 1 << 8;
const StatusNATDoneMask = Self::StatusDstNATDone.bits() | Self::StatusSrcNATDone.bits();
const StatusDying = 1 << 9;
const StatusFixedTimeout = 1 << 10;
const StatusTemplate = 1 << 11;
const StatusUntracked = 1 << 12;
const StatusHelper = 1 << 13;
const StatusOffload = 1 << 14;
}
}