From 457185083935daad00a2032af259b747ceb59212 Mon Sep 17 00:00:00 2001 From: Yann Dirson Date: Wed, 22 Nov 2023 12:42:27 +0100 Subject: [PATCH] net: rework toolstack-interface detection Detection of toolstack-interface (and not only VIF) does not have to be done on every NetEvent, but only once. To prepare for this, introduce a new functional API that can be used instead of mutating a NetEvent - this does not change call sites, which still make use of the legacy API. Signed-off-by: Yann Dirson --- src/vif_detect.rs | 6 ++++- src/vif_detect_freebsd.rs | 20 +++++++++++----- src/vif_detect_linux.rs | 50 ++++++++++++++++++++++++++------------- 3 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/vif_detect.rs b/src/vif_detect.rs index f4e9f9a..4b17587 100644 --- a/src/vif_detect.rs +++ b/src/vif_detect.rs @@ -1,4 +1,8 @@ -use crate::datastructs::NetEvent; +use crate::datastructs::{NetEvent, ToolstackNetInterface}; + +pub fn get_toolstack_interface(iface_name: &str) -> ToolstackNetInterface { + return ToolstackNetInterface::None; +} pub fn add_vif_info(_event: &mut NetEvent) -> () { } diff --git a/src/vif_detect_freebsd.rs b/src/vif_detect_freebsd.rs index f97245a..04dd334 100644 --- a/src/vif_detect_freebsd.rs +++ b/src/vif_detect_freebsd.rs @@ -2,13 +2,21 @@ use crate::datastructs::{NetEvent, ToolstackNetInterface}; // identifies a VIF as named "xn%ID" -pub fn add_vif_info(event: &mut NetEvent) -> () { +pub fn get_toolstack_interface(iface_name: &str) -> ToolstackNetInterface { const PREFIX: &str = "xn"; - if ! event.iface.name.starts_with(PREFIX) { - log::debug!("ignoring interface {} as not starting with '{PREFIX}'", event.iface.name); - return; + if ! iface_name.starts_with(PREFIX) { + log::debug!("ignoring interface {iface_name} as not starting with '{PREFIX}'"); + return ToolstackNetInterface::None; } - if let Ok(index) = event.iface.name[PREFIX.len()..].parse() { - event.iface.toolstack_iface = ToolstackNetInterface::Vif(index); + match iface_name[PREFIX.len()..].parse() { + Ok(index) => { return ToolstackNetInterface::Vif(index); }, + Err(e) => { + log::error!("cannot parse a VIF number adter {PREFIX}: {e}"); + return ToolstackNetInterface::None; + }, } } + +pub fn add_vif_info(event: &mut NetEvent) -> () { + event.iface.toolstack_iface = get_toolstack_interface(&event.iface.name); +} diff --git a/src/vif_detect_linux.rs b/src/vif_detect_linux.rs index 8af5260..73629fa 100644 --- a/src/vif_detect_linux.rs +++ b/src/vif_detect_linux.rs @@ -6,24 +6,40 @@ use std::fs; // FIXME does not attempt to detect sr-iov VIFs -pub fn add_vif_info(event: &mut NetEvent) { +pub fn get_toolstack_interface(iface_name: &str) -> ToolstackNetInterface { // FIXME: using ETHTOOL ioctl could be better - let device_path = format!("/sys/class/net/{}/device", event.iface.name); - if let Ok(devtype) = fs::read_to_string(format!("{device_path}/devtype")) { - let devtype = devtype.trim(); - if devtype != "vif" { - log::debug!("ignoring device {device_path}, devtype {devtype:?} not 'vif'"); - return; - } - if let Ok(nodename) = fs::read_to_string(format!("{device_path}/nodename")) { - let nodename = nodename.trim(); - const PREFIX: &str = "device/vif/"; - if ! nodename.starts_with(PREFIX) { - log::debug!("ignoring interface {nodename} as not under {PREFIX}"); - return; + let device_path = format!("/sys/class/net/{}/device", iface_name); + match fs::read_to_string(format!("{device_path}/devtype")) { + Ok(devtype) => { + let devtype = devtype.trim(); + if devtype != "vif" { + log::debug!("ignoring device {device_path}, devtype {devtype:?} not 'vif'"); + return ToolstackNetInterface::None; + } + match fs::read_to_string(format!("{device_path}/nodename")) { + Ok(nodename) => { + let nodename = nodename.trim(); + const PREFIX: &str = "device/vif/"; + if ! nodename.starts_with(PREFIX) { + log::debug!("ignoring interface {nodename} as not under {PREFIX}"); + return ToolstackNetInterface::None; + } + let vif_id = nodename[PREFIX.len()..].parse().unwrap(); + return ToolstackNetInterface::Vif(vif_id); + }, + Err(e) => { + log::error!("reading {device_path}/nodename: {e}"); + return ToolstackNetInterface::None; + }, } - let vif_id = nodename[PREFIX.len()..].parse().unwrap(); - event.iface.toolstack_iface = ToolstackNetInterface::Vif(vif_id); - } + }, + Err(e) => { + log::debug!("reading {device_path}/devtype: {e}"); + return ToolstackNetInterface::None; + }, } } + +pub fn add_vif_info(event: &mut NetEvent) { + event.iface.toolstack_iface = get_toolstack_interface(&event.iface.name); +} -- 2.39.5