From 0f6bdbb01fe4b7c2df496ad11cf5d30393f07ae2 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Fri, 8 May 2020 14:31:38 +0200 Subject: [PATCH] src/config/network.rs - write_config: add more consistency checks --- src/config/network.rs | 72 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/config/network.rs b/src/config/network.rs index b1424b03..fe82daa7 100644 --- a/src/config/network.rs +++ b/src/config/network.rs @@ -340,9 +340,81 @@ impl NetworkConfig { Ok(()) } + /// Check if child mtu is less or equal than parent mtu + pub fn check_mtu(&self, parent_name: &str, child_name: &str) -> Result<(), Error> { + + let parent = self.interfaces.get(parent_name) + .ok_or(format_err!("check_mtu - missing parent interface '{}'", parent_name))?; + let child = self.interfaces.get(child_name) + .ok_or(format_err!("check_mtu - missing child interface '{}'", child_name))?; + + let child_mtu = match child.mtu { + Some(mtu) => mtu, + None => return Ok(()), + }; + + let parent_mtu = match parent.mtu { + Some(mtu) => mtu, + None => { + if parent.interface_type == NetworkInterfaceType::Bond { + child_mtu + } else { + 1500 + } + } + }; + + if parent_mtu < child_mtu { + bail!("interface '{}' - mtu {} is lower than '{}' - mtu {}\n", + parent_name, parent_mtu, child_name, child_mtu); + } + + Ok(()) + } + + /// Check if bond slaves exists + pub fn check_bond_slaves(&self) -> Result<(), Error> { + for (iface, interface) in self.interfaces.iter() { + if let Some(slaves) = &interface.slaves { + for slave in slaves.iter() { + match self.interfaces.get(slave) { + Some(entry) => { + if entry.interface_type != NetworkInterfaceType::Eth { + bail!("bond '{}' - wrong interface type on slave '{}' ({:?} != {:?})", + iface, slave, entry.interface_type, NetworkInterfaceType::Eth); + } + } + None => { + bail!("bond '{}' - unable to find slave '{}'", iface, slave); + } + } + self.check_mtu(iface, slave)?; + } + } + } + Ok(()) + } + + /// Check if bridge ports exists + pub fn check_bridge_ports(&self) -> Result<(), Error> { + for (iface, interface) in self.interfaces.iter() { + if let Some(ports) = &interface.bridge_ports { + for port in ports.iter() { + if !self.interfaces.contains_key(port) { + bail!("bridge '{}' - unable to find port '{}'", iface, port); + } + self.check_mtu(iface, port)?; + } + } + } + Ok(()) + } + pub fn write_config(&self, w: &mut dyn Write) -> Result<(), Error> { self.check_port_usage()?; + self.check_bond_slaves()?; + self.check_bridge_ports()?; let mut done = HashSet::new();