use crate::{Frame, IpPrefix, MacAddr, Packet, Result};
use std::sync::Arc;
pub type L2Handler = Arc<dyn Fn(&Frame) -> Result<()> + Send + Sync + 'static>;
pub type L3Handler = Arc<dyn Fn(&Packet) -> Result<()> + Send + Sync + 'static>;
pub type Handler<T> = Arc<dyn Fn(&T) -> Result<()> + Send + Sync + 'static>;
pub trait L2Device: Send + Sync {
fn set_handler(&self, h: L2Handler);
fn send(&self, frame: &Frame) -> Result<()>;
fn hw_addr(&self) -> MacAddr;
fn close(&self) -> Result<()>;
}
pub trait L3Device: Send + Sync {
fn set_handler(&self, h: L3Handler);
fn send(&self, packet: &Packet) -> Result<()>;
fn addr(&self) -> IpPrefix;
fn set_addr(&self, prefix: IpPrefix) -> Result<()>;
fn close(&self) -> Result<()>;
}
impl<T: L2Device + ?Sized> L2Device for Arc<T> {
#[inline]
fn set_handler(&self, h: L2Handler) {
(**self).set_handler(h)
}
#[inline]
fn send(&self, f: &Frame) -> Result<()> {
(**self).send(f)
}
#[inline]
fn hw_addr(&self) -> MacAddr {
(**self).hw_addr()
}
#[inline]
fn close(&self) -> Result<()> {
(**self).close()
}
}
impl<T: L3Device + ?Sized> L3Device for Arc<T> {
#[inline]
fn set_handler(&self, h: L3Handler) {
(**self).set_handler(h)
}
#[inline]
fn send(&self, p: &Packet) -> Result<()> {
(**self).send(p)
}
#[inline]
fn addr(&self) -> IpPrefix {
(**self).addr()
}
#[inline]
fn set_addr(&self, p: IpPrefix) -> Result<()> {
(**self).set_addr(p)
}
#[inline]
fn close(&self) -> Result<()> {
(**self).close()
}
}