mirror of
https://github.com/CumulusNetworks/ifupdown2.git
synced 2024-05-06 15:54:50 +00:00
addons: Add --set-ring
option to ethtool
example: ``` auto eth0 iface eth0 inet dhcp ring-tx 1024 ring-rx 1024 ``` Signed-off-by: Tomas Vilemaitis
This commit is contained in:
@@ -117,6 +117,18 @@ class ethtool(Addon, moduleBase):
|
|||||||
'validvals': ['on', 'off'],
|
'validvals': ['on', 'off'],
|
||||||
'default': 'varies by interface'
|
'default': 'varies by interface'
|
||||||
},
|
},
|
||||||
|
'ring-rx': {
|
||||||
|
'help': 'Ring RX Parameter',
|
||||||
|
'example': ['ring-rx 512'],
|
||||||
|
'validvals': ['<number>'],
|
||||||
|
'default': 'varies by interface'
|
||||||
|
},
|
||||||
|
'ring-tx': {
|
||||||
|
'help': 'Ring TX Parameter',
|
||||||
|
'example': ['ring-tx 512'],
|
||||||
|
'validvals': ['<number>'],
|
||||||
|
'default': 'varies by interface'
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,6 +147,45 @@ class ethtool(Addon, moduleBase):
|
|||||||
attr='ethtool_ignore_errors'
|
attr='ethtool_ignore_errors'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def do_ring_settings(self, ifaceobj, attr_name, option):
|
||||||
|
# Get the current configuration value and default value for the specified attribute
|
||||||
|
config_val = ifaceobj.get_attr_value_first(attr_name)
|
||||||
|
default_val = policymanager.policymanager_api.get_iface_default(
|
||||||
|
module_name='ethtool',
|
||||||
|
ifname=ifaceobj.name,
|
||||||
|
attr=attr_name)
|
||||||
|
|
||||||
|
# If ring options are not set, do nothing
|
||||||
|
if not config_val and not default_val:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Get the current running value
|
||||||
|
running_val = self.get_running_attr(attr_name, ifaceobj)
|
||||||
|
|
||||||
|
# If the configuration value is the same as the running value, do nothing
|
||||||
|
if config_val and config_val == running_val:
|
||||||
|
return
|
||||||
|
|
||||||
|
# If the configuration value is not set and the default value is the same as the running value, do nothing
|
||||||
|
if not config_val and (default_val and default_val == running_val):
|
||||||
|
return
|
||||||
|
|
||||||
|
# Generate the ethtool command
|
||||||
|
if config_val:
|
||||||
|
cmd = ('%s --set-ring %s %s %s' %
|
||||||
|
(utils.ethtool_cmd, ifaceobj.name, option, config_val))
|
||||||
|
elif default_val:
|
||||||
|
cmd = ('%s --set-ring %s %s %s' %
|
||||||
|
(utils.ethtool_cmd, ifaceobj.name, option, default_val))
|
||||||
|
|
||||||
|
# Execute the ethtool command
|
||||||
|
if cmd:
|
||||||
|
try:
|
||||||
|
utils.exec_command(cmd)
|
||||||
|
except Exception as e:
|
||||||
|
self.log_error('%s: %s' %(ifaceobj.name, str(e)), ifaceobj)
|
||||||
|
|
||||||
|
|
||||||
def do_offload_settings(self, ifaceobj, attr_name, eth_name):
|
def do_offload_settings(self, ifaceobj, attr_name, eth_name):
|
||||||
default = 'default_' + eth_name
|
default = 'default_' + eth_name
|
||||||
config_val = ifaceobj.get_attr_value_first(attr_name)
|
config_val = ifaceobj.get_attr_value_first(attr_name)
|
||||||
@@ -324,6 +375,8 @@ class ethtool(Addon, moduleBase):
|
|||||||
|
|
||||||
self.do_speed_settings(ifaceobj)
|
self.do_speed_settings(ifaceobj)
|
||||||
self.do_fec_settings(ifaceobj)
|
self.do_fec_settings(ifaceobj)
|
||||||
|
self.do_ring_settings(ifaceobj, 'ring-rx', 'rx')
|
||||||
|
self.do_ring_settings(ifaceobj, 'ring-tx', 'tx')
|
||||||
self.do_offload_settings(ifaceobj, 'gro-offload', 'gro')
|
self.do_offload_settings(ifaceobj, 'gro-offload', 'gro')
|
||||||
self.do_offload_settings(ifaceobj, 'lro-offload', 'lro')
|
self.do_offload_settings(ifaceobj, 'lro-offload', 'lro')
|
||||||
self.do_offload_settings(ifaceobj, 'gso-offload', 'gso')
|
self.do_offload_settings(ifaceobj, 'gso-offload', 'gso')
|
||||||
@@ -435,6 +488,17 @@ class ethtool(Addon, moduleBase):
|
|||||||
|
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
def get_ring_setting(self, ethtool_output, setting):
|
||||||
|
value = None
|
||||||
|
current_settings = ethtool_output.split('Current hardware settings:', 1)[1]
|
||||||
|
|
||||||
|
for line in current_settings.splitlines():
|
||||||
|
if line.startswith(setting):
|
||||||
|
value = line.split(':', 1)[1]
|
||||||
|
return value.strip()
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
def get_running_attr(self,attr='',ifaceobj=None):
|
def get_running_attr(self,attr='',ifaceobj=None):
|
||||||
if not ifaceobj or not attr:
|
if not ifaceobj or not attr:
|
||||||
return
|
return
|
||||||
@@ -443,6 +507,14 @@ class ethtool(Addon, moduleBase):
|
|||||||
if attr == 'autoneg':
|
if attr == 'autoneg':
|
||||||
output = utils.exec_commandl([utils.ethtool_cmd, ifaceobj.name])
|
output = utils.exec_commandl([utils.ethtool_cmd, ifaceobj.name])
|
||||||
running_attr = self.get_autoneg(ethtool_output=output)
|
running_attr = self.get_autoneg(ethtool_output=output)
|
||||||
|
elif attr == 'ring-rx':
|
||||||
|
output = utils.exec_command('%s --show-ring %s'%
|
||||||
|
(utils.ethtool_cmd, ifaceobj.name))
|
||||||
|
running_attr = self.get_ring_setting(ethtool_output=output, setting='RX:')
|
||||||
|
elif attr == 'ring-tx':
|
||||||
|
output = utils.exec_command('%s --show-ring %s'%
|
||||||
|
(utils.ethtool_cmd, ifaceobj.name))
|
||||||
|
running_attr = self.get_ring_setting(ethtool_output=output, setting='TX:')
|
||||||
elif attr == 'fec':
|
elif attr == 'fec':
|
||||||
output = utils.exec_command('%s --show-fec %s'%
|
output = utils.exec_command('%s --show-fec %s'%
|
||||||
(utils.ethtool_cmd, ifaceobj.name))
|
(utils.ethtool_cmd, ifaceobj.name))
|
||||||
|
Reference in New Issue
Block a user