From c4bc69a4d0c15bf49ac4baf3046905cf90f32826 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Wed, 28 Feb 2024 11:49:48 +0100 Subject: [PATCH] Give each network adapter a unique scheme name This will be necessary in the future to support multiple network adapters in a single system. --- driver-network/src/lib.rs | 41 ++++++++++++++++++++++++++------------- e1000d/src/main.rs | 2 +- ixgbed/src/main.rs | 2 +- rtl8139d/src/main.rs | 2 +- rtl8168d/src/main.rs | 2 +- virtio-netd/src/main.rs | 2 +- 6 files changed, 33 insertions(+), 18 deletions(-) diff --git a/driver-network/src/lib.rs b/driver-network/src/lib.rs index eec2fc1fcb..6c10a352d0 100644 --- a/driver-network/src/lib.rs +++ b/driver-network/src/lib.rs @@ -30,7 +30,7 @@ pub trait NetworkAdapter { pub struct NetworkScheme { adapter: T, - _scheme_name: String, + scheme_name: String, scheme: File, next_id: usize, handles: BTreeMap, @@ -44,9 +44,8 @@ enum Handle { } impl NetworkScheme { - pub fn new(adapter: T, scheme_name: &str) -> Self { - assert_eq!(scheme_name, "network"); // FIXME update fpath before removing this assertion - + pub fn new(adapter: T, scheme_name: String) -> Self { + assert!(scheme_name.starts_with("network")); let scheme_fd = syscall::open( format!(":{scheme_name}"), syscall::O_RDWR | syscall::O_CREAT | syscall::O_NONBLOCK, @@ -56,7 +55,7 @@ impl NetworkScheme { NetworkScheme { adapter, - _scheme_name: scheme_name.to_owned(), + scheme_name, scheme, next_id: 0, handles: BTreeMap::new(), @@ -218,17 +217,33 @@ impl SchemeBlockMut for NetworkScheme { fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result> { let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; - let scheme_path = match handle { - // FIXME use self.scheme_name instead of hardcoding "network" - Handle::Data { .. } => &b"network:"[..], - Handle::Mac { .. } => &b"network:mac"[..], - }; - let mut i = 0; - while i < buf.len() && i < scheme_path.len() { - buf[i] = scheme_path[i]; + + let scheme_name = self.scheme_name.as_bytes(); + let mut j = 0; + while i < buf.len() && j < scheme_name.len() { + buf[i] = scheme_name[j]; + i += 1; + j += 1; + } + + if i < buf.len() { + buf[i] = b':'; i += 1; } + + let path = match handle { + Handle::Data { .. } => &b""[..], + Handle::Mac { .. } => &b"mac"[..], + }; + + j = 0; + while i < buf.len() && j < path.len() { + buf[i] = path[j]; + i += 1; + j += 1; + } + Ok(Some(i)) } diff --git a/e1000d/src/main.rs b/e1000d/src/main.rs index 2f141219ff..b8052b93f3 100644 --- a/e1000d/src/main.rs +++ b/e1000d/src/main.rs @@ -38,7 +38,7 @@ fn main() { let device = unsafe { device::Intel8254x::new(address).expect("e1000d: failed to allocate device") }; - let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, "network"))); + let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, format!("network.{name}")))); let mut event_queue = EventQueue::::new().expect("e1000d: failed to create event queue"); diff --git a/ixgbed/src/main.rs b/ixgbed/src/main.rs index 1f09e76b2d..33c67083bd 100644 --- a/ixgbed/src/main.rs +++ b/ixgbed/src/main.rs @@ -50,7 +50,7 @@ fn main() { let device = device::Intel8259x::new(address, IXGBE_MMIO_SIZE) .expect("ixgbed: failed to allocate device"); - let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, "network"))); + let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, format!("network.{name}")))); let mut event_queue = EventQueue::::new().expect("ixgbed: failed to create event queue"); diff --git a/rtl8139d/src/main.rs b/rtl8139d/src/main.rs index a7b9ca4540..048daf6d95 100644 --- a/rtl8139d/src/main.rs +++ b/rtl8139d/src/main.rs @@ -237,7 +237,7 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { let device = unsafe { device::Rtl8139::new(address).expect("rtl8139d: failed to allocate device") }; - let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, "network"))); + let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, format!("network.{name}")))); let mut event_queue = EventQueue::::new().expect("rtl8139d: failed to create event queue"); diff --git a/rtl8168d/src/main.rs b/rtl8168d/src/main.rs index 1cfaab1c9e..3767f2ddad 100644 --- a/rtl8168d/src/main.rs +++ b/rtl8168d/src/main.rs @@ -232,7 +232,7 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { let device = unsafe { device::Rtl8168::new(address).expect("rtl8168d: failed to allocate device") }; - let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, "network"))); + let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, format!("network.{name}")))); let mut event_queue = EventQueue::::new().expect("rtl8168d: failed to create event queue"); diff --git a/virtio-netd/src/main.rs b/virtio-netd/src/main.rs index 8357e3bfed..f00437a763 100644 --- a/virtio-netd/src/main.rs +++ b/virtio-netd/src/main.rs @@ -93,7 +93,7 @@ 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, "network"); + let mut scheme = NetworkScheme::new(device, format!("network.{name}")); let mut event_queue = File::open("event:")?; event_queue.write(&syscall::Event {