]> xenbits.xensource.com Git - xen-guest-agent.git/commitdiff
net: rework toolstack-interface detection
authorYann Dirson <yann.dirson@vates.fr>
Wed, 22 Nov 2023 11:42:27 +0000 (12:42 +0100)
committerYann Dirson <yann.dirson@vates.fr>
Fri, 8 Dec 2023 09:59:46 +0000 (10:59 +0100)
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 <yann.dirson@vates.fr>
src/vif_detect.rs
src/vif_detect_freebsd.rs
src/vif_detect_linux.rs

index f4e9f9a59716174032f9f230a46b8e376eb387d6..4b17587531f11705d2a52caa5c33742185c5f844 100644 (file)
@@ -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) -> () {
 }
index f97245a526c6eb1b251d96a1a00367d180647433..04dd334c9468fc85b0b7f000182e0219682766c0 100644 (file)
@@ -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);
+}
index 8af5260ee89cdbbf501ba53d9f079b887fd27ce6..73629faa0036362aefb14ff826eac83f441ab855 100644 (file)
@@ -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);
+}