diff --git a/src/config/network.rs b/src/config/network.rs index 2545810d..15322a8a 100644 --- a/src/config/network.rs +++ b/src/config/network.rs @@ -92,6 +92,15 @@ impl Interface { Ok(()) } + fn set_interface_type(&mut self, interface_type: NetworkInterfaceType) -> Result<(), Error> { + if self.interface_type == NetworkInterfaceType::Unknown { + self.interface_type = interface_type; + } else if self.interface_type != interface_type { + bail!("interface type already defined - cannot change from {:?} to {:?}", self.interface_type, interface_type); + } + Ok(()) + } + fn push_addon_option(&mut self, text: String) { if self.method_v4.is_none() && self.method_v6.is_some() { self.options_v6.push(text); diff --git a/src/config/network/parser.rs b/src/config/network/parser.rs index d2595feb..82446517 100644 --- a/src/config/network/parser.rs +++ b/src/config/network/parser.rs @@ -174,6 +174,7 @@ impl NetworkParser { Ok(list) } + fn parse_iface_attributes(&mut self, interface: &mut Interface) -> Result<(), Error> { loop { @@ -194,13 +195,13 @@ impl NetworkParser { self.eat(Token::BridgePorts)?; let ports = self.parse_iface_list()?; interface.bridge_ports = Some(ports); - interface.interface_type = NetworkInterfaceType::Bridge; + interface.set_interface_type(NetworkInterfaceType::Bridge)?; } Token::BondSlaves => { self.eat(Token::BondSlaves)?; let slaves = self.parse_iface_list()?; interface.bond_slaves = Some(slaves); - interface.interface_type = NetworkInterfaceType::Bond; + interface.set_interface_type(NetworkInterfaceType::Bond)?; } Token::Netmask => bail!("netmask is deprecated and no longer supported"), _ => {