use alloc::{string::String, vec::Vec};
use core::ops::Range;
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::*;
pub(crate) struct DeviceRxPacket {
frame_len: usize,
frame: ProtocolRxFrame,
packet: Range<usize>,
}
impl DeviceRxPacket {
pub(crate) fn with_packet_range(
frame_len: usize,
frame: ProtocolRxFrame,
packet: Range<usize>,
) -> Self {
assert!(packet.end <= frame.packet_len());
Self {
frame_len,
frame,
packet,
}
}
pub fn read_with<R>(&self, consume: impl FnOnce(&[u8]) -> R) -> R {
self.frame
.read_with(|frame| consume(&frame[self.packet.clone()]))
}
pub fn consume<R>(self, consume: impl FnOnce(&[u8]) -> R) -> R {
self.read_with(consume)
}
pub const fn frame_len(&self) -> usize {
self.frame_len
}
}
pub(crate) enum DeviceRxPoll {
Unsupported,
Idle,
Packet(DeviceRxPacket),
}
#[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(crate) trait Device: Send {
fn name(&self) -> &str;
fn recv(
&mut self,
interface_id: InterfaceId,
buffer: &mut PacketBuffer<InterfaceId>,
timestamp: Instant,
snoop: &mut dyn FnMut(&[u8]),
) -> usize;
fn poll_owned_rx(&mut self, _timestamp: Instant) -> DeviceRxPoll {
DeviceRxPoll::Unsupported
}
fn recv_direct(
&mut self,
_timestamp: Instant,
_deliver: &mut dyn FnMut(&[u8]) -> bool,
_snoop: &mut dyn FnMut(&[u8]),
) -> Option<usize> {
None
}
fn send(&mut self, next_hop: IpAddress, packet: &[u8], timestamp: Instant) -> usize;
fn try_send(
&mut self,
next_hop: IpAddress,
packet: &[u8],
timestamp: Instant,
) -> NetDeviceResult<usize> {
Ok(self.send(next_hop, packet, timestamp))
}
fn drain_deferred_tx(&mut self) -> Vec<usize> {
Vec::new()
}
fn drain_deferred_rx(&mut self) -> Vec<usize> {
Vec::new()
}
fn drain_deferred_tx_errors(&mut self) -> u64 {
0
}
fn drain_deferred_tx_drops(&mut self) -> u64 {
0
}
fn drain_deferred_rx_errors(&mut self) -> u64 {
0
}
fn drain_deferred_rx_drops(&mut self) -> u64 {
0
}
fn set_ipv4_addr(&mut self, _addr: Option<Ipv4Cidr>) {}
fn arp_entries(&self, _timestamp: Instant) -> Vec<ArpEntry> {
Vec::new()
}
}