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 1/2] 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), ]; From e12a74854c42cb54537d737b6326d51cdbcfdb4f Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Mon, 8 Jan 2024 14:10:49 +0100 Subject: [PATCH 2/2] Allow dnsd to create udp sockets This is essential for the functioning of dnsd. --- src/dnsd/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dnsd/main.rs b/src/dnsd/main.rs index 3ba52906f8..ce21854cde 100644 --- a/src/dnsd/main.rs +++ b/src/dnsd/main.rs @@ -47,7 +47,9 @@ fn run(daemon: redox_daemon::Daemon) -> Result<()> { let dnsd = Rc::new(RefCell::new(Dnsd::new(dns_file, time_file, event_queue.file.as_raw_fd()))); - syscall::setrens(0, 0).expect("dnsd: failed to enter null namespace"); + let new_ns = syscall::mkns(&[["udp".as_ptr() as usize, "udp".len()]]) + .expect("dnsd: failed to create namespace"); + syscall::setrens(new_ns, new_ns).expect("dnsd: failed to enter namespace"); daemon.ready().expect("dnsd: failed to notify parent");