// 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);
+}
// 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);
+}