Add 'Find' command to virtio net test util For finding thet network interface corresponding to a MAC address. Change-Id: I3bafd4979c47a5299b279bfaf16ec8ffaaaf90d6
diff --git a/src/bin/virtio_input_test_util/main.rs b/src/bin/virtio_input_test_util/main.rs index 0637d24..d0ac6c6 100644 --- a/src/bin/virtio_input_test_util/main.rs +++ b/src/bin/virtio_input_test_util/main.rs
@@ -1,6 +1,6 @@ mod events; -use events::{EventReader, EventType, InputEvent, KeyboardCode, KeyboardValue}; +use crate::events::{EventReader, EventType, InputEvent, KeyboardCode, KeyboardValue}; use std::path::Path; use std::sync::mpsc;
diff --git a/src/bin/virtio_net_test_util.rs b/src/bin/virtio_net_test_util.rs index 37c6bfe..cef8fb7 100644 --- a/src/bin/virtio_net_test_util.rs +++ b/src/bin/virtio_net_test_util.rs
@@ -4,19 +4,57 @@ #![deny(warnings)] +use std::fs; +use std::io::{Error, ErrorKind}; use std::net::UdpSocket; +use std::path::Path; use structopt::StructOpt; +const NET_DIR: &str = "/sys/class/net"; + #[derive(StructOpt, Debug)] -struct Transfer { - send_byte: u8, - receive_byte: u8, - length: usize, +enum Command { + /// Find the name of network interface with the given MAC address. + Find { + mac_address: String, + }, + /// Transfer a buffer of <length> containing <send_byte> and wait for a response containing + /// <receive_byte>. + Transfer { + send_byte: u8, + receive_byte: u8, + length: usize, + }, +} + +fn get_interface(mac_address: String) -> std::io::Result<String> { + let dir = Path::new(NET_DIR); + if !dir.is_dir() { + return Err(Error::new( + ErrorKind::Other, + format!("{} is not a directory", NET_DIR), + )); + } + for entry in fs::read_dir(dir)?.collect::<std::io::Result<Vec<_>>>()? { + let path = entry.path().join("address"); + let address = fs::read_to_string(path)?; + if address.trim().to_lowercase() == mac_address.trim().to_lowercase() { + return entry.file_name().into_string().or(Err(Error::new( + ErrorKind::Other, + "Failed to read device name", + ))); + } + } + Err(Error::new(ErrorKind::NotFound, "Could not find interface")) } fn main() -> std::io::Result<()> { - match Transfer::from_args() { - Transfer { + match Command::from_args() { + Command::Find { mac_address } => { + let interface = get_interface(mac_address)?; + println!("{:}", interface); + } + Command::Transfer { send_byte, receive_byte, length,