use crate::message::{MessageType, Networks, RejectReason, RoutingEntries};
use crate::table::RejectEffect;
use crate::PortId;
pub trait Host {
fn group(&self, port: PortId, mac: &[u8]) -> Group {
let _ = (port, mac);
Group::No
}
fn authorize(&mut self, claim: &Claim<'_>) -> bool {
let _ = claim;
true
}
fn observe(&mut self, event: Event) {
let _ = event;
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
pub enum Group {
#[default]
No,
Broadcast,
Refuse,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct Permissive;
impl Host for Permissive {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum ControlClass {
IAm,
InitAck,
InitMgmt,
Busy,
Available,
Reject,
ICouldBe,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Targets<'c> {
Networks(Networks<'c>),
Entries(RoutingEntries<'c>),
}
impl<'c> Targets<'c> {
pub fn iter(&self) -> impl Iterator<Item = u16> + 'c {
let (list, entries) = match *self {
Self::Networks(list) => (Some(list.iter()), None),
Self::Entries(entries) => (None, Some(entries.iter().map(|entry| entry.network))),
};
list.into_iter()
.flatten()
.chain(entries.into_iter().flatten())
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.iter().next().is_none()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct Claim<'c> {
pub class: ControlClass,
pub port: PortId,
pub port_network: u16,
pub source: &'c [u8],
pub message_type: MessageType,
pub vendor_id: Option<u16>,
pub snet: Option<u16>,
pub dnet: Option<u16>,
pub targets: Targets<'c>,
pub targets_omitted: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Event {
Learned {
network: u16,
port: PortId,
class: ControlClass,
},
Flapping {
network: u16,
flaps: u8,
},
RouteCap {
class: ControlClass,
},
RejectReceived {
network: u16,
reason: RejectReason,
effect: RejectEffect,
},
Marked {
network: u16,
busy: bool,
},
UpdateApplied {
network: u16,
port: PortId,
},
UpdateRemoved {
network: u16,
},
UnknownPortId {
network: u16,
port_id: u8,
},
ICouldBe {
network: u16,
performance_index: u8,
stored: bool,
},
EstablishConnection {
network: u16,
termination_time: u8,
},
DisconnectIgnored {
network: u16,
},
SecurityMessage {
message_type: MessageType,
},
UnknownMessage {
message_type: MessageType,
},
NumberConflict {
port: PortId,
local: u16,
reported: u16,
configured: bool,
},
HopCountSpent {
network: u16,
},
TooLong {
port: PortId,
octets: usize,
limit: usize,
rejected: Option<u16>,
},
OwnOrigin {
network: u16,
},
Purged {
network: u16,
},
PendingExpired {
network: u16,
},
DiscoveryExpired {
network: u16,
},
}