From 9d5c8207db83ce5ccc0f1961b887658b40a1e56a Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 7 Jan 2024 15:38:15 +0100 Subject: [PATCH] Try fetching the mac address directly from the network driver --- src/smolnetd/main.rs | 11 +++++++++++ src/smolnetd/scheme/mod.rs | 5 ++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/smolnetd/main.rs b/src/smolnetd/main.rs index 9deed0e034..2651a8c3e8 100644 --- a/src/smolnetd/main.rs +++ b/src/smolnetd/main.rs @@ -12,11 +12,14 @@ use std::fs::File; use std::os::unix::io::{FromRawFd, RawFd}; use std::process; use std::rc::Rc; +use std::str::FromStr; use event::EventQueue; +use netutils::getcfg; use redox_netstack::error::{Error, Result}; use redox_netstack::logger; use scheme::Smolnetd; +use smoltcp::wire::EthernetAddress; mod buffer_pool; mod link; @@ -32,6 +35,13 @@ fn run(daemon: redox_daemon::Daemon) -> Result<()> { .map_err(|e| Error::from_syscall_error(e, "failed to open network:"))? as RawFd; + let hardware_addr = std::fs::read("network:mac") + .map(|mac_address| EthernetAddress::from_bytes(&mac_address)) + .unwrap_or_else(|_| { + EthernetAddress::from_str(getcfg("mac").unwrap().trim()) + .expect("Can't parse the 'mac' cfg") + }); + trace!("opening :ip"); let ip_fd = syscall::open(":ip", O_RDWR | O_CREAT | O_NONBLOCK) .map_err(|e| Error::from_syscall_error(e, "failed to open :ip"))? as RawFd; @@ -75,6 +85,7 @@ fn run(daemon: redox_daemon::Daemon) -> Result<()> { let smolnetd = Rc::new(RefCell::new(Smolnetd::new( network_file, + hardware_addr, ip_file, udp_file, tcp_file, diff --git a/src/smolnetd/scheme/mod.rs b/src/smolnetd/scheme/mod.rs index d27f611fef..2efffc0eea 100644 --- a/src/smolnetd/scheme/mod.rs +++ b/src/smolnetd/scheme/mod.rs @@ -10,7 +10,7 @@ use smoltcp::iface::{Config, Interface as SmoltcpInterface}; use smoltcp::phy::Tracer; use smoltcp::time::{Duration, Instant}; use smoltcp::wire::{ - EthernetAddress, HardwareAddress, IpAddress, IpCidr, IpListenEndpoint, Ipv4Address, + EthernetAddress, HardwareAddress, IpAddress, IpCidr, IpListenEndpoint, Ipv4Address, }; use std::cell::RefCell; use std::fs::File; @@ -64,6 +64,7 @@ impl Smolnetd { pub fn new( network_file: File, + hardware_addr: EthernetAddress, ip_file: File, udp_file: File, tcp_file: File, @@ -71,8 +72,6 @@ impl Smolnetd { time_file: File, netcfg_file: File, ) -> Smolnetd { - let hardware_addr = EthernetAddress::from_str(getcfg("mac").unwrap().trim()) - .expect("Can't parse the 'mac' cfg"); let protocol_addrs = vec![ IpCidr::new(IpAddress::v4(127, 0, 0, 1), 8), ];