net: scheme created and daemon ready before device init

This commit is contained in:
Jeremy Soller
2025-11-23 09:23:09 -07:00
parent e3d5abdaa1
commit dd41c4f13e
11 changed files with 64 additions and 40 deletions
Generated
+1
View File
@@ -397,6 +397,7 @@ name = "driver-network"
version = "0.1.0"
dependencies = [
"libredox",
"redox-daemon",
"redox-scheme 0.4.0",
"redox_syscall",
]
+1
View File
@@ -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"] }
+7 -2
View File
@@ -45,10 +45,15 @@ enum Handle {
}
impl<T: NetworkAdapter> NetworkScheme<T> {
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,
+6 -1
View File
@@ -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;
+7 -8
View File
@@ -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")) {
+8 -8
View File
@@ -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")) {
+6 -1
View File
@@ -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;
+7 -8
View File
@@ -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")) {
+6 -1
View File
@@ -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;
+7 -8
View File
@@ -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")) {
+8 -3
View File
@@ -93,7 +93,14 @@ fn deamon(daemon: redox_daemon::Daemon) -> Result<(), Box<dyn std::error::Error>
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<dyn std::error::Error>
libredox::call::setrens(0, 0).expect("virtio-netd: failed to enter null namespace");
daemon.ready().expect("virtio-netd: failed to daemonize");
scheme.tick()?;
loop {