net: scheme created and daemon ready before device init
This commit is contained in:
Generated
+1
@@ -397,6 +397,7 @@ name = "driver-network"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"libredox",
|
||||
"redox-daemon",
|
||||
"redox-scheme 0.4.0",
|
||||
"redox_syscall",
|
||||
]
|
||||
|
||||
@@ -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"] }
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user