diff --git a/Cargo.lock b/Cargo.lock index b414217d61..c10dbb4064 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -397,6 +397,7 @@ name = "driver-network" version = "0.1.0" dependencies = [ "libredox", + "redox-daemon", "redox-scheme 0.4.0", "redox_syscall", ] diff --git a/net/driver-network/Cargo.toml b/net/driver-network/Cargo.toml index 665df4f60e..8220537c1b 100644 --- a/net/driver-network/Cargo.toml +++ b/net/driver-network/Cargo.toml @@ -5,5 +5,6 @@ edition = "2021" [dependencies] libredox = "0.1.3" +redox-daemon = "0.1" redox-scheme = "0.4" redox_syscall = { version = "0.5", features = ["std"] } diff --git a/net/driver-network/src/lib.rs b/net/driver-network/src/lib.rs index 339a195cc9..eadaaa0289 100644 --- a/net/driver-network/src/lib.rs +++ b/net/driver-network/src/lib.rs @@ -45,10 +45,15 @@ enum Handle { } impl NetworkScheme { - pub fn new(adapter: T, scheme_name: String) -> Self { + pub fn new( + adapter_fn: impl FnOnce() -> T, + daemon: redox_daemon::Daemon, + scheme_name: String, + ) -> Self { assert!(scheme_name.starts_with("network")); let socket = Socket::nonblock(&scheme_name).expect("failed to create network scheme"); - + daemon.ready().expect("failed to mark daemon as ready"); + let adapter = adapter_fn(); NetworkScheme { adapter, scheme_name, diff --git a/net/e1000d/src/device.rs b/net/e1000d/src/device.rs index b980e5b10c..4c518f30fc 100644 --- a/net/e1000d/src/device.rs +++ b/net/e1000d/src/device.rs @@ -289,7 +289,12 @@ impl Intel8254x { ]; log::debug!( "MAC: {:>02X}:{:>02X}:{:>02X}:{:>02X}:{:>02X}:{:>02X}", - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] + mac[0], + mac[1], + mac[2], + mac[3], + mac[4], + mac[5] ); self.mac_address = mac; diff --git a/net/e1000d/src/main.rs b/net/e1000d/src/main.rs index 44c0282390..b7601d17fd 100644 --- a/net/e1000d/src/main.rs +++ b/net/e1000d/src/main.rs @@ -34,10 +34,13 @@ fn main() { let address = unsafe { pcid_handle.map_bar(0) }.ptr.as_ptr() as usize; - let device = - unsafe { device::Intel8254x::new(address).expect("e1000d: failed to allocate device") }; - - let mut scheme = NetworkScheme::new(device, format!("network.{name}")); + let mut scheme = NetworkScheme::new( + move || unsafe { + device::Intel8254x::new(address).expect("e1000d: failed to allocate device") + }, + daemon, + format!("network.{name}"), + ); user_data! { enum Source { @@ -66,10 +69,6 @@ fn main() { libredox::call::setrens(0, 0).expect("e1000d: failed to enter null namespace"); - daemon - .ready() - .expect("e1000d: failed to mark daemon as ready"); - scheme.tick().unwrap(); for event in event_queue.map(|e| e.expect("e1000d: failed to get event")) { diff --git a/net/ixgbed/src/main.rs b/net/ixgbed/src/main.rs index c6ea98600f..c1aa533572 100644 --- a/net/ixgbed/src/main.rs +++ b/net/ixgbed/src/main.rs @@ -30,10 +30,14 @@ fn main() { let address = mapped_bar.ptr.as_ptr(); let size = mapped_bar.bar_size; - let device = device::Intel8259x::new(address as usize, size) - .expect("ixgbed: failed to allocate device"); - - let mut scheme = NetworkScheme::new(device, format!("network.{name}")); + let mut scheme = NetworkScheme::new( + move || { + device::Intel8259x::new(address as usize, size) + .expect("ixgbed: failed to allocate device") + }, + daemon, + format!("network.{name}"), + ); user_data! { enum Source { @@ -61,10 +65,6 @@ fn main() { libredox::call::setrens(0, 0).expect("ixgbed: failed to enter null namespace"); - daemon - .ready() - .expect("ixgbed: failed to mark daemon as ready"); - scheme.tick().unwrap(); for event in event_queue.map(|e| e.expect("ixgbed: failed to get next event")) { diff --git a/net/rtl8139d/src/device.rs b/net/rtl8139d/src/device.rs index cfab18833f..1245d864f6 100644 --- a/net/rtl8139d/src/device.rs +++ b/net/rtl8139d/src/device.rs @@ -266,7 +266,12 @@ impl Rtl8139 { ]; log::debug!( "MAC: {:>02X}:{:>02X}:{:>02X}:{:>02X}:{:>02X}:{:>02X}", - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] + mac[0], + mac[1], + mac[2], + mac[3], + mac[4], + mac[5] ); self.mac_address = mac; diff --git a/net/rtl8139d/src/main.rs b/net/rtl8139d/src/main.rs index 891c888912..97dc7921e8 100644 --- a/net/rtl8139d/src/main.rs +++ b/net/rtl8139d/src/main.rs @@ -124,10 +124,13 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { //TODO: MSI-X let mut irq_file = get_int_method(&mut pcid_handle); - let device = - unsafe { device::Rtl8139::new(bar as usize).expect("rtl8139d: failed to allocate device") }; - - let mut scheme = NetworkScheme::new(device, format!("network.{name}")); + let mut scheme = NetworkScheme::new( + move || unsafe { + device::Rtl8139::new(bar as usize).expect("rtl8139d: failed to allocate device") + }, + daemon, + format!("network.{name}"), + ); user_data! { enum Source { @@ -154,10 +157,6 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { libredox::call::setrens(0, 0).expect("rtl8139d: failed to enter null namespace"); - daemon - .ready() - .expect("rtl8139d: failed to mark daemon as ready"); - scheme.tick().unwrap(); for event in event_queue.map(|e| e.expect("rtl8139d: failed to get next event")) { diff --git a/net/rtl8168d/src/device.rs b/net/rtl8168d/src/device.rs index c6cf616607..fe6d7f5ebd 100644 --- a/net/rtl8168d/src/device.rs +++ b/net/rtl8168d/src/device.rs @@ -233,7 +233,12 @@ impl Rtl8168 { ]; log::debug!( "MAC: {:>02X}:{:>02X}:{:>02X}:{:>02X}:{:>02X}:{:>02X}", - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] + mac[0], + mac[1], + mac[2], + mac[3], + mac[4], + mac[5] ); self.mac_address = mac; diff --git a/net/rtl8168d/src/main.rs b/net/rtl8168d/src/main.rs index 8c009822ee..c394f1c70e 100644 --- a/net/rtl8168d/src/main.rs +++ b/net/rtl8168d/src/main.rs @@ -124,10 +124,13 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { //TODO: MSI-X let mut irq_file = get_int_method(&mut pcid_handle); - let device = - unsafe { device::Rtl8168::new(bar as usize).expect("rtl8168d: failed to allocate device") }; - - let mut scheme = NetworkScheme::new(device, format!("network.{name}")); + let mut scheme = NetworkScheme::new( + move || unsafe { + device::Rtl8168::new(bar as usize).expect("rtl8168d: failed to allocate device") + }, + daemon, + format!("network.{name}"), + ); user_data! { enum Source { @@ -154,10 +157,6 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { libredox::call::setrens(0, 0).expect("rtl8168d: failed to enter null namespace"); - daemon - .ready() - .expect("rtl8168d: failed to mark daemon as ready"); - scheme.tick().unwrap(); for event in event_queue.map(|e| e.expect("rtl8168d: failed to get next event")) { diff --git a/net/virtio-netd/src/main.rs b/net/virtio-netd/src/main.rs index f566a7d82e..3ee723a5de 100644 --- a/net/virtio-netd/src/main.rs +++ b/net/virtio-netd/src/main.rs @@ -93,7 +93,14 @@ fn deamon(daemon: redox_daemon::Daemon) -> Result<(), Box name.push_str("_virtio_net"); let device = VirtioNet::new(mac_address, rx_queue, tx_queue); - let mut scheme = NetworkScheme::new(device, format!("network.{name}")); + let mut scheme = NetworkScheme::new( + move || { + //TODO: do device init in this function to prevent hangs + device + }, + daemon, + format!("network.{name}"), + ); let mut event_queue = File::open("/scheme/event")?; event_queue.write(&syscall::Event { @@ -104,8 +111,6 @@ fn deamon(daemon: redox_daemon::Daemon) -> Result<(), Box libredox::call::setrens(0, 0).expect("virtio-netd: failed to enter null namespace"); - daemon.ready().expect("virtio-netd: failed to daemonize"); - scheme.tick()?; loop {