use serde::{Deserialize, Serialize};
pub const COMM_LEN: usize = 16;
#[repr(u8)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum EventKind {
TcpV4Connect = 1,
TcpV6Connect = 2,
InetCskAccept = 3,
SockClose = 4,
UdpV4Connect = 5,
UdpV6Connect = 6,
}
#[repr(C)]
#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
pub struct ConnectV4Event {
pub kind: EventKind,
pub _pad0: [u8; 3],
pub tgid: u32,
pub pid: u32,
pub saddr: u32,
pub daddr: u32,
pub sport: u16,
pub dport: u16,
pub comm: [u8; COMM_LEN],
pub timestamp_ns: u64,
}
impl ConnectV4Event {
#[inline]
pub const fn empty() -> Self {
Self {
kind: EventKind::TcpV4Connect,
_pad0: [0; 3],
tgid: 0,
pid: 0,
saddr: 0,
daddr: 0,
sport: 0,
dport: 0,
comm: [0; COMM_LEN],
timestamp_ns: 0,
}
}
}
#[repr(C)]
#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
pub struct ConnectV6Event {
pub kind: EventKind,
pub _pad0: [u8; 3],
pub tgid: u32,
pub pid: u32,
pub saddr: [u8; 16],
pub daddr: [u8; 16],
pub sport: u16,
pub dport: u16,
pub comm: [u8; COMM_LEN],
pub timestamp_ns: u64,
}
impl ConnectV6Event {
#[inline]
pub const fn empty() -> Self {
Self {
kind: EventKind::TcpV6Connect,
_pad0: [0; 3],
tgid: 0,
pid: 0,
saddr: [0; 16],
daddr: [0; 16],
sport: 0,
dport: 0,
comm: [0; COMM_LEN],
timestamp_ns: 0,
}
}
}
#[cfg(test)]
mod layout_tests {
use super::*;
#[test]
fn wire_struct_sizes_are_stable() {
assert_eq!(core::mem::size_of::<ConnectV4Event>(), 48);
assert_eq!(core::mem::size_of::<ConnectV6Event>(), 72);
}
#[test]
fn v6_field_offsets_match_bpf_side() {
assert_eq!(core::mem::offset_of!(ConnectV6Event, tgid), 4);
assert_eq!(core::mem::offset_of!(ConnectV6Event, saddr), 12);
assert_eq!(core::mem::offset_of!(ConnectV6Event, daddr), 28);
assert_eq!(core::mem::offset_of!(ConnectV6Event, sport), 44);
assert_eq!(core::mem::offset_of!(ConnectV6Event, dport), 46);
assert_eq!(core::mem::offset_of!(ConnectV6Event, comm), 48);
assert_eq!(core::mem::offset_of!(ConnectV6Event, timestamp_ns), 64);
}
}