fix #2942: implement lacp bond mode and bond_xmit_hash_policy

this was not yet implemented, should be compatible with pve and the gui

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak
2020-09-16 14:12:30 +02:00
committed by Dietmar Maurer
parent 85959a99ea
commit 8f2f3dd710
5 changed files with 85 additions and 3 deletions

View File

@ -202,6 +202,10 @@ pub fn read_interface(iface: String) -> Result<Value, Error> {
schema: NETWORK_INTERFACE_NAME_SCHEMA,
optional: true,
},
bond_xmit_hash_policy: {
type: BondXmitHashPolicy,
optional: true,
},
slaves: {
schema: NETWORK_INTERFACE_LIST_SCHEMA,
optional: true,
@ -229,6 +233,7 @@ pub fn create_interface(
bridge_vlan_aware: Option<bool>,
bond_mode: Option<LinuxBondMode>,
bond_primary: Option<String>,
bond_xmit_hash_policy: Option<BondXmitHashPolicy>,
slaves: Option<String>,
param: Value,
) -> Result<(), Error> {
@ -297,6 +302,14 @@ pub fn create_interface(
}
interface.bond_primary = bond_primary;
}
if bond_xmit_hash_policy.is_some() {
if mode != LinuxBondMode::ieee802_3ad &&
mode != LinuxBondMode::balance_xor
{
bail!("bond_xmit_hash_policy is only valid with LACP(802.3ad) or balance-xor mode");
}
interface.bond_xmit_hash_policy = bond_xmit_hash_policy;
}
}
if let Some(slaves) = slaves {
let slaves = split_interface_list(&slaves)?;
@ -359,6 +372,8 @@ pub enum DeletableProperty {
/// Delete bond-primary
#[serde(rename = "bond-primary")]
bond_primary,
/// Delete bond transmit hash policy
bond_xmit_hash_policy,
}
@ -440,6 +455,10 @@ pub enum DeletableProperty {
schema: NETWORK_INTERFACE_NAME_SCHEMA,
optional: true,
},
bond_xmit_hash_policy: {
type: BondXmitHashPolicy,
optional: true,
},
slaves: {
schema: NETWORK_INTERFACE_LIST_SCHEMA,
optional: true,
@ -479,6 +498,7 @@ pub fn update_interface(
bridge_vlan_aware: Option<bool>,
bond_mode: Option<LinuxBondMode>,
bond_primary: Option<String>,
bond_xmit_hash_policy: Option<BondXmitHashPolicy>,
slaves: Option<String>,
delete: Option<Vec<DeletableProperty>>,
digest: Option<String>,
@ -523,6 +543,7 @@ pub fn update_interface(
DeletableProperty::bridge_vlan_aware => { interface.bridge_vlan_aware = None; }
DeletableProperty::slaves => { interface.set_bond_slaves(Vec::new())?; }
DeletableProperty::bond_primary => { interface.bond_primary = None; }
DeletableProperty::bond_xmit_hash_policy => { interface.bond_xmit_hash_policy = None }
}
}
}
@ -548,6 +569,14 @@ pub fn update_interface(
}
interface.bond_primary = bond_primary;
}
if bond_xmit_hash_policy.is_some() {
if mode != LinuxBondMode::ieee802_3ad &&
mode != LinuxBondMode::balance_xor
{
bail!("bond_xmit_hash_policy is only valid with LACP(802.3ad) or balance-xor mode");
}
interface.bond_xmit_hash_policy = bond_xmit_hash_policy;
}
}
if let Some(cidr) = cidr {