#![no_std]
extern crate alloc;
use alloc::{sync::Arc, vec::Vec};
use smoltcp::wire::Ipv4Address;
use spin::Mutex;
use sync_irq::IrqSafeMutex;
mod device;
mod interface;
mod socket;
pub use device::{DeviceCapabilities, NetworkDevice};
pub use interface::{IpAddress, IpCidr, NetworkInterface, SocketSet};
pub use smoltcp::{
phy,
socket::{icmp, tcp, udp},
time::Instant,
wire::{self, IpEndpoint},
};
pub use socket::{LockedSocket, Socket};
const DEFAULT_LOCAL_IP: &str = "10.0.2.15/24";
const DEFAULT_GATEWAY_IP: IpAddress = IpAddress::Ipv4(Ipv4Address::new(10, 0, 2, 2));
static NETWORK_INTERFACES: Mutex<Vec<Arc<NetworkInterface>>> = Mutex::new(Vec::new());
pub fn register_device<T>(device: &'static IrqSafeMutex<T>) -> Arc<NetworkInterface>
where
T: 'static + NetworkDevice + Send,
{
let interface = NetworkInterface::new(
device,
DEFAULT_LOCAL_IP.parse().unwrap(),
DEFAULT_GATEWAY_IP,
);
let interface_arc = Arc::new(interface);
NETWORK_INTERFACES.lock().push(interface_arc.clone());
interface_arc
}
pub fn get_interfaces() -> &'static Mutex<Vec<Arc<NetworkInterface>>> {
&NETWORK_INTERFACES
}
pub fn get_default_interface() -> Option<Arc<NetworkInterface>> {
NETWORK_INTERFACES.lock().first().cloned()
}
pub fn get_ephemeral_port() -> u16 {
use rand::Rng;
const RANGE_START: u16 = 49152;
const RANGE_END: u16 = u16::MAX;
let mut rng = random::init_rng::<rand_chacha::ChaChaRng>().unwrap();
rng.gen_range(RANGE_START..=RANGE_END)
}