use lanscope_common::{Event, EventKind, Ipv4Be, MacAddr};
pub mod dhcp;
pub mod dns;
pub mod mdns;
pub mod ssdp;
#[derive(Clone, PartialEq, Eq, Debug)]
pub enum Signal {
Hostname(String),
Service(String),
DhcpFingerprint(String),
DhcpVendorClass(String),
Seen,
}
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct Observation {
pub mac: MacAddr,
pub ip: Option<Ipv4Be>,
pub signal: Signal,
}
pub fn decode_event(ev: &Event) -> Vec<Observation> {
let ip = (ev.src_ip != 0).then_some(ev.src_ip);
let mac = ev.src_mac;
let payload = ev.payload();
let signals: Vec<Signal> = match ev.kind() {
EventKind::Dhcp => dhcp::decode(payload),
EventKind::Mdns => mdns::decode(payload),
EventKind::Ssdp => ssdp::decode(payload),
EventKind::Arp | EventKind::NewHost => vec![Signal::Seen],
EventKind::TlsHello => vec![Signal::Seen], EventKind::Unknown => vec![Signal::Seen],
};
signals
.into_iter()
.map(|signal| Observation { mac, ip, signal })
.collect()
}