summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--interface-definitions/interfaces-bonding.xml.in20
-rw-r--r--python/vyos/ifconfig/bond.py34
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_bonding.py19
-rwxr-xr-xsrc/conf_mode/interfaces-bonding.py3
4 files changed, 73 insertions, 3 deletions
diff --git a/interface-definitions/interfaces-bonding.xml.in b/interface-definitions/interfaces-bonding.xml.in
index 37dfe1c12..0792bdb8f 100644
--- a/interface-definitions/interfaces-bonding.xml.in
+++ b/interface-definitions/interfaces-bonding.xml.in
@@ -97,6 +97,26 @@
</properties>
<defaultValue>0</defaultValue>
</leafNode>
+ <leafNode name="lacp-rate">
+ <properties>
+ <help>Rate in which we will ask our link partner to transmit LACPDU packets</help>
+ <completionHelp>
+ <list>slow fast</list>
+ </completionHelp>
+ <valueHelp>
+ <format>slow</format>
+ <description>Request partner to transmit LACPDUs every 30 seconds (default)</description>
+ </valueHelp>
+ <valueHelp>
+ <format>fast</format>
+ <description>Request partner to transmit LACPDUs every 1 second</description>
+ </valueHelp>
+ <constraint>
+ <regex>^(slow|fast)$</regex>
+ </constraint>
+ </properties>
+ <defaultValue>slow</defaultValue>
+ </leafNode>
<leafNode name="mode">
<properties>
<help>Bonding mode</help>
diff --git a/python/vyos/ifconfig/bond.py b/python/vyos/ifconfig/bond.py
index 199c69dde..78ce27bba 100644
--- a/python/vyos/ifconfig/bond.py
+++ b/python/vyos/ifconfig/bond.py
@@ -53,6 +53,10 @@ class BondIf(Interface):
'validate': assert_positive,
'location': '/sys/class/net/{ifname}/bonding/min_links',
},
+ 'bond_lacp_rate': {
+ 'validate': lambda v: assert_list(v, ['slow', 'fast']),
+ 'location': '/sys/class/net/{ifname}/bonding/lacp_rate',
+ },
'bond_miimon': {
'validate': assert_positive,
'location': '/sys/class/net/{ifname}/bonding/miimon'
@@ -154,6 +158,26 @@ class BondIf(Interface):
"""
self.set_interface('bond_min_links', number)
+ def set_lacp_rate(self, slow_fast):
+ """
+ Option specifying the rate in which we'll ask our link partner
+ to transmit LACPDU packets in 802.3ad mode. Possible values
+ are:
+
+ slow or 0
+ Request partner to transmit LACPDUs every 30 seconds
+
+ fast or 1
+ Request partner to transmit LACPDUs every 1 second
+
+ The default is slow.
+
+ Example:
+ >>> from vyos.ifconfig import BondIf
+ >>> BondIf('bond0').set_lacp_rate('slow')
+ """
+ self.set_interface('bond_lacp_rate', slow_fast)
+
def set_arp_interval(self, interval):
"""
Specifies the ARP link monitoring frequency in milliseconds.
@@ -384,9 +408,13 @@ class BondIf(Interface):
if not dict_search(f'member.interface_remove.{interface}.disable', config):
Interface(interface).set_admin_state('up')
- # Bonding policy/mode
- value = config.get('mode')
- if value: self.set_mode(value)
+ # Bonding policy/mode - default value, always present
+ mode = config.get('mode')
+ self.set_mode(mode)
+
+ # LACPDU transmission rate - default value
+ if mode == '802.3ad':
+ self.set_lacp_rate(config.get('lacp_rate'))
# Add (enslave) interfaces to bond
value = dict_search('member.interface', config)
diff --git a/smoketest/scripts/cli/test_interfaces_bonding.py b/smoketest/scripts/cli/test_interfaces_bonding.py
index b98cc30f9..9480263d8 100755
--- a/smoketest/scripts/cli/test_interfaces_bonding.py
+++ b/smoketest/scripts/cli/test_interfaces_bonding.py
@@ -111,5 +111,24 @@ class BondingInterfaceTest(BasicInterfaceTest.BaseTest):
# check LACP default rate
self.assertEqual('slow', tmp['linkinfo']['info_data']['ad_lacp_rate'])
+ def test_bonding_lacp_rate(self):
+ # configure member interfaces
+ lacp_rate = 'fast'
+ for interface in self._interfaces:
+ for option in self._options.get(interface, []):
+ self.session.set(self._base_path + [interface] + option.split())
+
+ self.session.set(self._base_path + [interface, 'lacp-rate', lacp_rate])
+
+ self.session.commit()
+
+ # verify config
+ for interface in self._interfaces:
+ tmp = get_json_iface_options(interface)
+
+ # check LACP minimum links (default value)
+ self.assertEqual(0, tmp['linkinfo']['info_data']['min_links'])
+ self.assertEqual(lacp_rate, tmp['linkinfo']['info_data']['ad_lacp_rate'])
+
if __name__ == '__main__':
unittest.main(verbosity=2)
diff --git a/src/conf_mode/interfaces-bonding.py b/src/conf_mode/interfaces-bonding.py
index 1a549f27d..431d65f1f 100755
--- a/src/conf_mode/interfaces-bonding.py
+++ b/src/conf_mode/interfaces-bonding.py
@@ -83,6 +83,9 @@ def get_config(config=None):
tmp = leaf_node_changed(conf, ['mode'])
if tmp: bond.update({'shutdown_required': {}})
+ tmp = leaf_node_changed(conf, ['lacp-rate'])
+ if tmp: bond.update({'shutdown_required': {}})
+
# determine which members have been removed
interfaces_removed = leaf_node_changed(conf, ['member', 'interface'])
if interfaces_removed: