1
0
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:
tomvil
2023-03-27 18:45:40 +03:00
parent a49b5d2682
commit 8c35c09ddd

View File

@ -117,6 +117,18 @@ class ethtool(Addon, moduleBase):
'validvals': ['on', 'off'],
'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'
)
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):
default = 'default_' + eth_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_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, 'lro-offload', 'lro')
self.do_offload_settings(ifaceobj, 'gso-offload', 'gso')
@ -435,6 +488,17 @@ class ethtool(Addon, moduleBase):
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):
if not ifaceobj or not attr:
return
@ -443,6 +507,14 @@ class ethtool(Addon, moduleBase):
if attr == 'autoneg':
output = utils.exec_commandl([utils.ethtool_cmd, ifaceobj.name])
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':
output = utils.exec_command('%s --show-fec %s'%
(utils.ethtool_cmd, ifaceobj.name))