async_arp/
probe.rs

1use crate::error::InputBuildError;
2use pnet::util::MacAddr;
3use std::net::Ipv4Addr;
4
5#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
6pub struct ProbeInput {
7    pub sender_mac: MacAddr,
8    pub target_ip: Ipv4Addr,
9}
10
11#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)]
12pub struct ProbeInputBuilder {
13    sender_mac: Option<MacAddr>,
14    target_ip: Option<Ipv4Addr>,
15}
16
17impl ProbeInputBuilder {
18    pub fn new() -> Self {
19        Self::default()
20    }
21
22    pub fn with_sender_mac(mut self, sender_mac: MacAddr) -> Self {
23        self.sender_mac = Some(sender_mac);
24        self
25    }
26
27    pub fn with_target_ip(mut self, target_ip: Ipv4Addr) -> Self {
28        self.target_ip = Some(target_ip);
29        self
30    }
31
32    pub fn build(&self) -> std::result::Result<ProbeInput, InputBuildError> {
33        Ok(ProbeInput {
34            target_ip: self.target_ip.ok_or(InputBuildError::MissingTargetIp)?,
35            sender_mac: self.sender_mac.ok_or(InputBuildError::MissingSenderMac)?,
36        })
37    }
38}
39
40#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
41pub enum ProbeStatus {
42    Free,
43    Occupied,
44}
45
46#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
47pub struct ProbeOutcome {
48    pub status: ProbeStatus,
49    pub target_ip: Ipv4Addr,
50}
51
52impl ProbeOutcome {
53    pub fn new(status: ProbeStatus, target_ip: Ipv4Addr) -> Self {
54        Self { status, target_ip }
55    }
56}