use alloc::{string::String, sync::Arc, vec::Vec};
use axpoll::PollSet;
use smoltcp::{
storage::PacketBuffer,
time::Instant,
wire::{IpAddress, Ipv4Cidr},
};
use crate::config::InterfaceId;
mod driver;
mod ethernet;
mod loopback;
#[cfg(feature = "vsock")]
mod vsock;
pub use driver::*;
pub use ethernet::*;
pub use loopback::*;
#[cfg(feature = "vsock")]
pub use vsock::*;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ArpEntry {
pub ip_addr: [u8; 4],
pub hw_type: u16,
pub flags: u16,
pub hw_addr: [u8; 6],
pub device: String,
}
pub trait Device: Send + Sync {
fn name(&self) -> &str;
fn recv(
&mut self,
interface_id: InterfaceId,
buffer: &mut PacketBuffer<InterfaceId>,
timestamp: Instant,
snoop: &mut dyn FnMut(&[u8]),
) -> bool;
fn send(&mut self, next_hop: IpAddress, packet: &[u8], timestamp: Instant) -> bool;
fn set_ipv4_addr(&mut self, _addr: Option<Ipv4Cidr>) {}
fn arp_entries(&self, _timestamp: Instant) -> Vec<ArpEntry> {
Vec::new()
}
fn readiness_poll(&self) -> Option<Arc<PollSet>> {
None
}
}